M5StackでMicro SDカードへの書き込み速度の調査

以前「ESP32でMicro SDカードへのSPIでの書き込み速度の調査」をした。

M5Stack Core の Grey で同様の調査をしようとしたが、Visual Studio Code (VSC) の ESP-IDF 環境でビルドしようとして、プログラムの修正に手間取ったので、備忘録として残しておく。

また、SDカードのマウントで失敗することがあり、原因が不明確なので、記録を残しておく。

ハードウェア

内蔵SDカードスロットへのアクセス方法

M5Stackでは、内蔵SDカードスロットのハードウェアは 制御できるのは SPI mode のみになっている。

SD bus modeは1-bit 、4-bit ともに、内蔵SDカードスロットのD1、D2 が ESP32 と結線されていないために使えない。

M5Stack ESP32 pin SD Bus mode SPI mode pin
GPIO18 CLK SCK
GPIO23 CMD MOSI
GPIO19 D0 MISO
GPIO4 D3 CS

また、ESP32のSPIは、HSPIと VSPI の2組あるが、上記の結線の場合には VSPI で制御することになる。ちなみに、M5StackではHSPIは LCDディスプレイ制御に使っている。

ESP32でのSDカードの接続については次の記事が参考になった。

開発環境

  • Windows10
  • Visual Studio Code
    • September 2020 (Version 1.50)
  • ESP-IDF Visual Studio Code Extension
    • Espressif IDF 0.5.1
  • ESP-IDF
    • v4.1

プログラム

以前と同様に、次にある、ESP-IDFのSDカード制御のサンプルプログラムを修正した。

https://github.com/espressif/esp-idf/tree/master/examples/storage/sd_card

次の GitHub に ESP-IDF Visual Studio Code Extension で開発した際のファイルを置いてある。

https://github.com/kunsen-an/m5stack_espidf_sd_card_write_test

修正点

以前「ESP32でMicro SDカードへのSPIでの書き込み速度の調査」からの主な修正点は、SPIの初期化の部分である。

ESP32に2組あるSPIのうち、SDカードではVSPIを使うことから、sdmmc_host_t host に対して host.slot = VSPI_HOST と設定する必要がある。

MOSI、MISO、SCKは、M5Stackに合わせて、それぞれ、GPIO23, GPIO19, GPIO18とする。

また、SDカードスロットの CSにつながっている GPIO4 でデバイスの選択を制御する。ちなみに、 GPIO14 でLCDディスプレイの選択を制御するが、SDカードスロットでは使わない。

sdspi_slot_config_t slot_config にこれらのPIN番号を設定する。

また、LCDディスプレイが DMAチャネルの1を使っているので、SDカードスロットは DMAチャネルの2を使う必要がある。このため、slot_config.dma_channel = 2 としてDMAチャネルを2に指定する必要がある。

コード

実行結果例

VSC から フラッシュに書き込んで、自動でリセットがかかった場合には、SDカードのマウントに失敗した。リセットボタンを押して再度実行すれば動作することが多いが、SDカードのマウントで失敗することがある。安定していない感じである。タイミングなどの問題があるのかもしれない。

成功時のログ

GitHub にも example.log.txt として置いてあるが、以下にうまくマウントができて、その後の処理もできたログ出力例を示す。

失敗時のログ

以下にマウントに失敗した場合のログ出力例を示す。GitHub にも error.log.txt として置いてある。うまくいかない場合の原因は、はっきりしていない。