ESP32でSDカードを動かすライブラリは二つあります。一つはSDライブラリ、もう一つはSDMMCライブラリです。SDライブラリはSPIペリフェラルを使ってSDカードと通信する方法で、一般的によく電子工作で行われている方法です。SDMMCライブラリはSDMMCペリフェラルというSDカード専用の4線式通信機能を使って通信する方法で、より高速に通信できます。ただしこれにはいくつかの罠があります。
ESP-WROOM-32
esp-idf 「SD Card example」
#プルアップ
信号線はD2(IO12), D3(IO13), CMD(IO15), CLK(IO14), D0(IO2), D1(IO4)ですが、SDカード動作中には全ピンをプルアップする必要があります。さもなくばSDカードが正常動作しません。しかし実はこれと矛盾した罠があります。
#プログラムの書き込みができない!
ESP32はIO2をプルアップしているとプログラムの書き込みができない仕様になっています。したがってIO2はプログラムの書き込みが終わった後にプルアップする必要があります。そうなるように外付け回路を組んでもOKです。
魔法の大鍋 ESP-WROOM-32
#ビルトインBASICが起動する!
ESP32はIO12をプルアップした状態で電源を入れるとイースターエッグのビルトインBASICが起動する仕様になっています。HACKADAY:BASIC Interpreter Hidden in ESP32 Silicon
したがってESP32起動後にIO12をプルアップする必要があります。実はIO12は通常内部でプルダウンされていますが、内部プルアップ回路も持っており、起動後にプログラムでIO12をプルアップすることができます。SDMMCライブラリには起動後にプルアップするプログラムが入っているようなので、IO12は特に何も繋がなければ問題ない...ように見えます。
実はまた罠があります。SDカードの起動中にESP32がリセットされるとIO12のプルアップ状態がラッチされるようです。そしてそれはESP32の電源を落としても続きます。つまり外付けでプルアップしているわけでもないのに何度電源を入れてもビルトインBASICが起動します。これを止めるにはIO12をGNDに落として強制的にラッチを切ります。
回避方法はその他にもefuseを切る、4線式をやめて1線式で使うなどもあるようです。詳しくはesp-idf 「SD Card example」を参照下さい。
#ライセンス
SDカード専用の4線式通信機能を商用利用するにはライセンスが必要なようです。完成品を販売する場合は注意しましょう。
#その他
SDMMCライブラリという名前の割には、対応しているのはSDカードだけで、いまのところMMCカードには対応していないそうですw
あとはSDMMCライブラリの中にこのライブラリ用のピン配置のままでSPIモードで動く(SDMMCペリフェラルの1線式とはまた別らしい)ようなフラグだけはあるのですが、まだ実装されていないそうです。
ESP32は素晴らしい製品ですが、SDMMCはちょっと扱いが難しいです。初心者はSPIを使ったSDライブラリを使うことをお薦めします。