NuttX for Raspberry Pi PicoでSSD1306 OLEDに画像表示 (I2C接続) に続いて、同様にSPRESENSEの実装を元にしてSPIドライバを追加しました。
SPIの先には、以下のようなカードスロットを接続してmicroSDカードを読み書きしてみます。
接続
Raspberry Pi PicoのSPI0と電源に、microSDカードスロットの各端子を以下のようにつなぎます。
microSDカードスロット | Pico端子 | Pico ピン番号 |
---|---|---|
DAT2 | (接続しない) | - |
CD/DAT3 | GP17 (SPI0 CSn) | 22 |
CMD | GP19 (SPI0 TX) | 25 |
VDD | 3V3 | 36 |
CLK | GP18 (SPI0 SCK) | 24 |
VSS | GND | 3, 38 などのGNDピンのどれか |
DAT0 | GP16 (SPI0 RX) | 21 |
DAT1 | (接続しない) | - |
カード検出スイッチB | (接続しない) | - |
カード検出スイッチA | (接続しない) | - |
NuttXのビルド
SPI接続のmicroSDカードスロットをサポートするコンフィグレーションとして用意した、raspberrypi-pico:spisd
を指定してビルドします。
$ git clone https://github.com/apache/incubator-nuttx.git nuttx
$ git clone https://github.com/apache/incubator-nuttx-apps.git apps
$ cd nuttx
$ ./tools/configure.sh raspberrypi-pico:spisd
$ make
microSDカードスロットの接続先となるSPI0のGPIOピン番号は、コンフィグレーションファイルnuttx/boards/arm/rp2040/raspberrypi-pico/configs/ssd1306/spisd
の以下の箇所で指定されています。
指定した番号のGPIOがSPIのRXに、それ以降のGPIOは番号順にCSn, SCK, TXに使われます。Raspberry Pi Picoのピンレイアウト図でSPI0が出せるGPIOピンであれば、他の番号1に変更することも可能です。
CONFIG_RP2040_SPI0_GPIO=16
起動
起動すると、カードスロットにmicroSDカードが刺さっていてそれがFATでフォーマットされていれば、/mnt/sd0
にマウントされてアクセス可能になっています。
(現時点では、カードの活線挿抜はサポートしていないため、カードの抜き差しの際は再起動する必要があります)
NuttShell (NSH) NuttX-10.0.1
nsh> mount
/mnt/sd0 type vfat
/proc type procfs
nsh> ls -l /mnt
/mnt:
drw-rw-rw- 0 sd0/
nsh> ls -l /mnt/sd0
/mnt/sd0:
drw-rw-rw- 0 System Volume Information/
-rw-rw-rw- 71 README
以下は、NuttXを起動してmicroSDカードを読み書きしている動画です。カードのアクセス速度も測ってみました。
1MBのファイル読み書きで、
write: 7.32秒 (1.1Mbps)read: 1.60秒 (5.1Mbps)
SPIモードでの接続なのでカード本来の速度を出せていないのは確かですが、こんなものですかねえ?
【追記】単に読み書きの単位が小さすぎですね。バッファを32KBに、ファイルサイズを10MBにして測り直すと、
nsh> time "dd if=/dev/zero of=test bs=32768 count=320"
6.5600 sec
nsh> time "dd if=test of=/dev/null bs=32768"
5.2700 sec
- write: 6.56秒 (12.8Mbps)
- read: 5.27秒 (15.9Mbps)
microSDアクセス時のSPIのクロック周波数は20MHzに設定しているので、そこそこの値は出ている様子です。
-
指定できるのは 0, 4, 16, 20のいずれかになります。 ↩