4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

NuttX for Raspberry Pi PicoでmicroSDカードを読み書き (SPI接続)

Last updated at Posted at 2021-03-08

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カードを読み書きしている動画です。カードのアクセス速度も測ってみました。

nuttx-spisd-2.gif

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に設定しているので、そこそこの値は出ている様子です。

  1. 指定できるのは 0, 4, 16, 20のいずれかになります。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?