SDカード速度比較(ESP32 vs Teensy4.1 x SD vs SDFAT vs SDMMC ライブラリ)

マイコンでSDカードを使う方法

マイコンでSDカードを使おうとする時、通常はSPI通信で行うのが一般的です。SPI通信はクロックと出力・入力の2線式ですが、SDカードはDATA0~3のピンがあり、4線式で高速に通信することができるはずです。はずというのカードの仕様は公にはされておらず、SD本来の機能を使うのはSDアソシエーションという団体に会費(安くない)を払う必要があり、個人で使うのは現実的ではありません。そのため、個人がアクセスできる範囲でどの方法が一番高速にSDカードとの通信ができるかを調べました。

マイコン

マイコンはESP32とTeensy4.1を使用しています。Teensy4.1はCortex-M7を搭載した高性能マイコンでSDカードスロットが予めついています。SDカードスロットが無い代わりに大きさが約半分のTeensy4.0もあります(こちらも頑張ればSDカードを付けられます)。

ESP32とSDカードスロット、ESP32ダウンローダー
Teensy4.1(マイコンの冷却のためにヒートシンクを追加しています)

↓爆速なTeensy4.1についてはこちらもご参照ください。

ライブラリ

SDライブラリ

Arduino標準のライブラリです。ただ、このライブラリの欠点として滅茶苦茶遅いのとFAT32にしか対応していないことがあります。FAT32とはSDカードをフォーマット(初期化)する時のファイルシステムのひとつで、一般的なファイルシステムではあるのですが、古いシステムのため32GBよりも大きい(64GB以上)SDカードではFAT32ではフォーマットできません。32GBよりも大きいSDカードを使用するためにはexFATでフォーマットする必要があります。

FAT32でのフォーマット

SDFATライブラリ

上記のSDライブラリを改良したもので、こちらはexFATでフォーマットしたSDカードにも読み書きをすることができます。またSDライブラリよりも高速であることが知られています。(原理はわかりません)

SDMMCライブラリ

ESP32マイコンには3つのSPI通信があり、その中でHSPIと呼ばれるものにはSD_が付く気になる表記が見られます。DATAの送受信にそのHSPIの4ピンを使うライブラリとして「SDMMCライブラリ」というものがあり、今回それを試しました(そのため配線は他の2つとは異なります。)。おそらくESP32でSDカード本来の速度を出す方法があるのだと思われるのですが、それはブラックボックスなので…

NameNo.TypeFunction
IO1413I/OGPIO14, ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK, HS2_CLK, SD_CLK, EMAC_TXD2
IO1214I/OGPIO12, ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI, HSPIQ, HS2_DATA2, SD_DATA2, EMAC_TXD3
IO1316I/OGPIO13, ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID, HS2_DATA3, SD_DATA3, EMAC_RX_ER
IO1523I/OGPIO15, ADC2_CH3, TOUCH3, MTDO, HSPICS0, RTC_GPIO13, HS2_CMD, SD_CMD, EMAC_RXD3
IO224I/OGPIO2, ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIWP, HS2_DATA0, SD_DATA0
IO426I/OGPIO4, ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD, HS2_DATA1, SD_DATA1, EMAC_TX_ER
引用元:https://trac.switch-science.com/wiki/esp32_tips

結果

ここを見る方は結果をまず知りたいと思いますので、先に結果を貼ります。

試験方法

・各ライブラリで書き込み速度と読み込み速度を各5回ずつ計測しています

・512Byteの書き込み・読み込みを2048回繰り返した(約1MB)時間を測定。

・5種類のSDカードで測定を行っています。

  1. Transcend  1GB
  2. Transcend 8GB SDHC スピードクラス4
  3. Transcend Premium 400x 32GB SDHC スピードクラス10 UHSスピードクラス1
  4. SanDisk Ultra 32GB SDHC スピードクラス10 UHSスピードクラス1
  5. Samsung EVO Plus 64GB SDXC UHSスピードクラス3

・Teensy4.1はクロックスピードを変更できるため、600MHzと960MHzで比較しています(が、特に変化はありませんでした)

・ESP32+SDFATライブラリではSPIの周波数を設定できるため、デフォルトの16MHzと通信できる限界の24MHzで比較しています

結果(数値)

※平均・速度の数値が0になっているものは読み書きができなかったものです
(クリックで拡大)

結果(グラフ)

(クリックで拡大)

Teensy4.1+SDFAT速すぎ

Teensy4.1の場合、FIFOという方式でSDカードと通信しているようなのですが、なんでこんなに速いのか不明です。書き込み速度はSDカードによって差がありますが、最高で読み書きともに22MB/sのスピードが出ています、桁違い。通常のSDHCカードでも書き込み15MB/s、読み込み22MB/sでできています。

なんでこんなに速いのかよくわからないけど、とにかく動くのでヨシ!

Teensy4.1+SDFATが速すぎて他のものが比較できないので、これだけ省いたグラフが以下です。(クリックで拡大)

ESP32でもSDFATライブラリは速いですね、Teensy4.1の10分の1ではありますが…
Teensy4.1のSDライブラリも速い方ですが、書き込みがESP32+SDFATよりも遅いのと読み込み速度はSDカードによってバラつきがあります。
SDMMCライブラリは情報収集に苦労した割には思ったよりもスピードが出ていません。SDライブラリよりは速いですが、これなら通常のSPI接続でSDFATライブラリを使った方が良さそうです。

配線

Teensy4.1はSDカードスロット内蔵なので配線は不要です(便利ですね)。ESP32の場合、通常のSPI通信(SD/SDFATライブラリ)であれば情報はたくさん出てきますが、SDMMCの場合、情報が少ない&バラついています。そのため、自分の環境ではこれで動いたよ。というものになります。

SDカードスロットには秋月電子のマイクロSDカードスロットDIP化キットを使用しています。

403- 現在メンテナンス中です。

ESP32 SPI通信

左下はESP32にプログラムを書き込むためのダウンローダのピンを書いているだけなので気にしないでください。
SPI通信のためのピン(IO5/23/18/19)は念のためすべて10kBの抵抗でプルアップしています。ENの所についているスイッチはリセット用です。

ESP32 SDMMC通信

こちらのサイトを参考にしています(https://ht-deko.com/arduino/esp-wroom-32.html#13_02)。
本当はIO2とIO12もプルアップする必要があるのですが、これらのピンを初めからプルアップしているとプログラムが書き込めなかったり、デモモードで動作してしまったりするので、プログラム上でプルアップしています。

プログラム

プログラムはスケッチ例を元に切り貼りしているのであまり綺麗には書いていません。あくまで参考程度に。

ESP32 SDライブラリ

ESP32 SDFATライブラリ

「#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SD_SCK_MHZ(24))」の「SD_SCK_MHZ(24)」は24MHzで動作する設定です。「SD_SCK_MHZ(16)」で16MHzにできます。24MHz以上ではSDカードを認識しませんでした。

ESP32 SDMMCライブラリ

苦労した割には成果が少なかったコ

Teensy4.1 SDライブラリ

Teensy4.1 SDFATライブラリ

どういう原理で動くかわからないけど、最速で動く不思議なコ

終わりに

ESP32でもSDFATを使えば実用的なスピードが出ることが分かって良かったです。より高速な通信が必要な場合はTeensy4.1を使うのが良いですね。他にこうすると速くなるよという情報があればコメント欄で教えてください。

コメント

  1. 匿名希望 より:

    XIAO ESP32C6等にSDIOが出ている様になりました。
    ただESP32のSDIOで速度の比較データが見つかりません。
    Teensy4.x同等の速度が出るのかご存知でしょうか?

    • やまたい(Yamatai) より:

      ご質問いただきありがとうございます!
      ESP32C6のモジュールはまだ手に入れていないため、検証できないですが、確かにSDIO_DATA0~3まであるので適切なライブラリがあれば高速化する可能性がありますね。
      ESP32C6を手に入れたら検証してみたいと思います。

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