Raspberry Pi PicoでAT-Xを作る⑩ microSDを認識させる

raspberry pi pico

c/c++で再構築してる途中です

めちゃくちゃ参考になった動画

この動画観たら8割くらい作業進むよ。

Raspberry Pi Pico (RP2040) SD カード (読み取りおよび書き込み) MicroPython および C/C++ 搭載 | Digi-Key エレクトロニクス

前半はMicroPythonでの実装で
6分55秒あたりからc/c++での実装の解説。

動画内、概要欄に書いてるライブラリのバージョンが違くて(?)、
すんなり動くようにはならないからこの記事でそこを補完していく感じ。

↓そのライブラリのリンク
https://github.com/carlk3/no-OS-FatFS-SD-SPI-RPi-Pico

sd_driverフォルダにhw_config.cがない

ない。というか自分で作れってことなんだと思う。
gpioピンの設定とかするファイルだし。

no-OS-FatFS-SD-SPI-RPi-Pico\example\hw_config.c
をコピーしてカスタマイズした。

カスタマイズする内容は先述した参考動画にもある通り、

  • .miso_gpio
  • .mosi_gpio
  • .sck_gpio
  • .baud_rate
    動作テストのために低めの値を設定
  • .ss_gpio
    チップセレクト(CS)のGPIOピン番号

自分の環境だとこんな感じ

static spi_t spis[] = {  // One for each SPI.
    {
        .hw_inst = spi0,  // SPI component
        .miso_gpio = 4,  // GPIO number (not Pico pin number)
        .mosi_gpio = 7,
        .sck_gpio = 6,

        .baud_rate = 1000 * 1000
        // .baud_rate = 12500 * 1000
        // .baud_rate = 25 * 1000 * 1000 // Actual frequency: 20833333.
    }};

// Hardware Configuration of the SD Card "objects"
static sd_card_t sd_cards[] = {  // One for each SD card
    {
        .pcName = "0:",   // Name used to mount device
        .spi = &spis[0],  // Pointer to the SPI driving this card
        .ss_gpio = 1,    // The SPI slave select GPIO for this SD card
・
・
・

hw_config.cがCMakeLists.txtでコメントアウトされてる

no-OS-FatFS-SD-SPI-RPi-Pico/FatFs_SPI
にあるCMakeLists.txtが↓こんな風になってた。

コメント化を解除しよう。

参考動画の通りに設定したけど・・・

↓こんな感じでmicroSDのマウントに失敗した。

SDカードテスト エンターキーを押してください
No SD card detected!
ドライブのマウントに失敗しました。エラーコード: 3

これも解決できたから共有

microSDリーダーモジュールを確認しよう

自分が使ってるmicroSDリーダーモジュールには、
CS, SCK, MOSI, MISO, VSS, GNDの6ピンしかない。

このピンの数が原因だった。

存在してないピンの設定までしていた

hw_config.cを参考動画の通りに設定すると、
↓こんな感じ。

static spi_t spis[] = {  // One for each SPI.
    {
        .hw_inst = spi0,  // SPI component
        .miso_gpio = 4,  // GPIO number (not Pico pin number)
        .mosi_gpio = 7,
        .sck_gpio = 6,

        .baud_rate = 1000 * 1000
        // .baud_rate = 12500 * 1000
        // .baud_rate = 25 * 1000 * 1000 // Actual frequency: 20833333.
    }};

// Hardware Configuration of the SD Card "objects"
static sd_card_t sd_cards[] = {  // One for each SD card
    {
        .pcName = "0:",   // Name used to mount device
        .spi = &spis[0],  // Pointer to the SPI driving this card
        .ss_gpio = 1,    // The SPI slave select GPIO for this SD card
        .use_card_detect = true,
        .card_detect_gpio = 22,  // Card detect
        .card_detected_true = -1  // What the GPIO read returns when a card is
                                 // present.
    }};

下から4行目に
.card_detect_gpio = 22という行があるんだけど、
使ってるmicroSDリーダーモジュールにcard_detectなんてピンはない。

これが原因だった。

自分と一緒で、
CS, SCK, MOSI, MISO, VSS, GNDの6ピンしかないmicroSDリーダーモジュールを使ってる人は
こんな風に修正したらいいと思うよ。

        .use_card_detect = false,
        .card_detect_gpio = 0,  // Card detect
        .card_detected_true = 0  // What the GPIO read returns when a card is
                                 // present.
    }};

card_detectは使わない設定で、ピン番号も返り値も適当に0に変更。

結果

正常に読み書きがされた。

タイトルとURLをコピーしました