クラス SDCard -- SD メモリカード
SD カードは、リムーバブルストレージメディアの最も一般的な小型フォームファクターの1つです。SD カードにはさまざまなサイズと物理的なフォームファクターがあります。MMC カードは SD カードと同様のリムバーブルストレージデバイスであり、eMMC デバイスは 電気的には MMC カードと同様のストレージデバイスですが、他のシステムに組み込むように設計されています。3つの形式はすべて、ホストシステムとの通信に共通のプロトコルを使っていて、高レベルのサポートはすべて同じです。このプロトコルの MicroPython でのサポートは、 machine.SDCard という単一のクラスに実装しています。
SD と MMC の双方のインターフェイスは、さまざまなバス幅でのアクセスをサポートしています。1ビット幅のインターフェイスでアクセスする場合、SPI プロトコルを使用してアクセスできます。MicroPython ハードウェアプラットフォームにより、さまざまな幅とピン構成をサポートしていますが、ほとんどのプラットフォームでは、ハードウェアに適した標準構成があります。一般に、パラメータを渡さずに SDCard オブジェクトを構築すると、使っているハードウェアのデフォルトのカードスロットのインターフェイスが初期化されます。以下にリストされている引数は、非標準スロットまたは非標準のピン割り当てのいずれかを使うのに設定が必要な共通の引数を表しています。サポートする引数の厳密なサブセットは、プラットフォームごとに異なります。
- SDCard(slot=1, width=1, cd=None, wp=None, sck=None, miso=None, mosi=None,
- cs=None, cmd=None, data=None, freq=20000000)
このクラスは、専用の SD/MMC インターフェイスハードウェアか、SPI チャネルを介しての、SD または MMC ストレージカードへのアクセスを提供します。このクラスは
vfs.AbstractBlockDevで定義されたブロックプロトコルを実装しています。これにより、SD カードのマウントが次のように簡単になります。vfs.mount(machine.SDCard(), "/sd")
このコンストラクタは次のパラメーターを取ります。
slot は、使用可能なインターフェースのどれを使用するかを選択します。この指定を省略すると、デフォルトのインターフェースが選択されます。
width は、SD/MMCインターフェイスのバス幅を選択します。この数のデータピンを SD カードに接続する必要があります。
cd でカード検出ピンを指定できます。
wp で書出し保護ピンを指定できます。
sck で SPI クロックピンを指定できます。
miso で SPI miso ピンを指定できます。
miso で SPI mosi ピンを指定できます。
cs で SPI チップ選択ピンを指定できます。
以降の追加パラメータは、ESP32 ポートでのみ指定できます。
cmd は SD CMD ピンを指定できます(ESP32-S3 のみ)。
data は SD データバスのピンをリストまたはタプルで指定できます(ESP32-S3 のみ)。
freq は SD/MMC インタフェースの周波数を Hz で指定します。
ハードウェア固有の詳細
異なるハードウェア上の SDCard クラスの実装は、上記のオプションのさまざまなサブセットをサポートします。
PyBoard
標準の PyBoard にはスロットが1つしかありません。引数は不要またはサポートされていません。
ESP32
SD カードは SD/MMC モードと、よりシンプルな(ただし遅い) SPI モードの両方でアクセスできます。
SPI モードでは SPI ホストペリフェラルを使いますが、このペリフェラルは他の SPI 通信と同時に使えません。
slot 引数によって使うモードが決まります。指定できる値はチップによって異なります。
チップ |
スロット 0 |
スロット 1 |
スロット 2 |
スロット 3 |
|---|---|---|---|---|
ESP32 |
SD/MMC |
SPI (id=1) |
SPI (id=0) |
|
ESP32-C3 |
SPI (id=0) |
|||
ESP32-C6 |
SPI (id=0) |
|||
ESP32-S2 |
SPI (id=1) |
SPI (id=0) |
||
ESP32-S3 |
SD/MMC |
SD/MMC |
SPI (id=1) |
SPI (id=0) |
Different slots support different data bus widths (number of data pins):
スロット |
種別 |
サポートするデータ幅 |
|---|---|---|
0 |
SD/MMC |
1, 4, 8 |
1 |
SD/MMC |
1, 4 |
2 |
SPI |
1 |
3 |
SPI |
1 |
注釈
ほとんどの ESP32 モジュールでは、専用ハードウェアを介して SD カードスロットを提供する際に、データピンを1本だけ接続しているため、 width のデフォルト値は 1 になっています。
さらなる詳細は、使用している ESP32 ファミリーのチップによって異なります:
オリジナルの ESP32
SD/MMC モード(スロット1)では、オリジナルの ESP32 においてピンの割り当てが固定されています。SPI モードのスロット(2 & 3)では、コンストラクタ内で異なるピンを設定できます。
デフォルトのピン割り当ては次のとおりです:
スロット
1
2
3
設定可能か
信号線
ピン
ピン
ピン
CLK
14
No
CMD
15
No
D0
2
No
D1
4
No
D2
12
No
D3
13
No
sck
18
14
Yes
cs
5
15
Yes
miso
19
12
Yes
mosi
23
13
Yes
cd と wp ピンは、どちらのモードでも固定されておらず、設定しない限り無効になります。
ESP32-S3
ESP32-S3 チップでは、SD/MMC モードおよび SPI モードの両方でピンの値を自由に設定できます。
設定しない場合のデフォルトのピン割り当ては次のとおりです:
スロット
0
1
2
3
信号線
ピン
ピン
ピン
ピン
CLK
14
14
CMD
15
15
D0
2
2
D1
4
4
D2
12
12
D3
13
13
D4
33*
D5
34*
D6
35*
D7
36*
sck
37*
14
cs
34*
13
miso
37*
2
mosi
35*
15
注釈
スロット0と1は同時に使えません。
注釈
表内でアスタリスク * が付いているピンは、ESP32-S3 ボードが Octal SPI Flash または PSRAM 用に構成されている場合、デフォルトから変更する必要があります。
SD/MMC モードでカードにアクセスするには slot パラメータを 0 または 1 に設定し、 sck (CLK用)、 cmd 、 data パラメータを指定してピンを割り当てます。 data 引数を指定する場合、それは width 引数と同じ長さのデータピンまたはピン番号のリストまたはタプルである必要があります。たとえば次のようになります:
sd = SDCard(slot=0, width=4, sck=8, cmd=9, data=(10, 11, 12, 13))
SPI モードでカードにアクセスするには、 slot パラメータの値を 2 または 3 に設定し、 sck, cs, miso, mosi の各パラメータを指定してピンを割り当てます。
どちらのモードでも cd と wp は、コンストラクタで設定しない限り無効のままとなります。
その他の ESP32 チップ
その他の ESP32 ファミリのチップにはハードウェア SD/MMC ホストコントローラーがなく、SDカードには SPI モードでのみアクセス可能です。
SPI モードでカードにアクセスするには、 slot パラメータの値を 2 または 3 に設定し、 sck, cs, miso, mosi の各パラメータを指定してピンを割り当てます。
注釈
ESP32-C3 と ESP32-C6 には利用可能な SPI バスが1つしかないため、有効な slot パラメータの値は 2 のみです。このバスを SD カード用に使うと、 machine.SPI との併用はできなくなります。
cc3200
pins 引数にタプルを渡すことにより、SPI アクセスに使うピンを指定できます。
注記: 現在の cc3200 SDカードの実装では machine.SDCard ではなく、machine.SD のほうを使います。
mimxrt
mimxrt ポートの SDCard モジュールは、4ビットモード、クロック周波数 50MHz の専用 SD/MMC ペリフェラル (USDHC)経由のアクセスのみをサポートしています。残念ながら、MIMXRT1011 コントローラは USDHC ペリフェラルをサポートしていません。したがって、このコントローラでは machine.SDCard モジュールが機能しません。
クロック周波数 50MHz の4ビットモードのみをサポートすることにしたため、インタフェースは簡素化され、コンストラクタのシグネチャは次のようになっています。
- class machine.SDCard(slot=1)
USDHC ペリフェラルで使うピンは mpconfigboard.h で設定する必要があります。mimxrt ポートでサポートされるほとんどのコントローラは、最大2つの USDHC ペリフェラルを提供します。したがって、ピン設定はマクロ MICROPY_USDHCx (x は1または2)を使って行います。
以下は USDHC1 の設定例を示しています:
#define MICROPY_USDHC1 \
{ \
.cmd = { GPIO_SD_B0_02_USDHC1_CMD}, \
.clk = { GPIO_SD_B0_03_USDHC1_CLK }, \
.cd_b = { GPIO_SD_B0_06_USDHC1_CD_B },\
.data0 = { GPIO_SD_B0_04_USDHC1_DATA0 },\
.data1 = { GPIO_SD_B0_05_USDHC1_DATA1 },\
.data2 = { GPIO_SD_B0_00_USDHC1_DATA2 },\
.data3 = { GPIO_SD_B0_01_USDHC1_DATA3 },\
}
カード検出ピンを使わない場合(cb_b ピン)、各エントリに次のダミー値を設定する必要があります。
#define USDHC_DUMMY_PIN NULL , 0
マクロ MICROPY_USDHC1 や MICROPY_USDHC2 の定義に基づき、 machine.SDCard モジュールは1スロットまたは2スロットをサポートします。どちらか一方しか定義されていない場合、 machine.SDCard() または machine.SDCard(1) を呼び出すと、それぞれの USDHC ペリフェラルを使ったインスタンスが返されます。両方のマクロが定義されている場合、 machine.SDCard(2) を呼び出すと、USDHC2 を使用するインスタンスが返されます。