🙇‍♂️

続・SPIモードにならないSDカードが流通していなかった件(大土下座)

2024/10/17に公開

SPIモードに成らないSDカードについて

前回、SPIモードに成らない件、多くの方に興味を持っていただき、有識者(主に高校時代の部活の後輩)に見て頂き、大きなミスに気が付いたのが、本件謝罪の記事になります。

前回の記事はこちら
https://zenn.dev/nonnoise/articles/7dbe9da063e409

そこ、ちがくね?

ここでは友人Aとしよう。友人Aとは高校時代の部活で後輩だったりで、なが~く話はして無かったんだが、XにてSDカードについて話題が出たのでメールを頂きました。ありがとうございます。

議題になった箇所は、ACMD41(CMD55)でレスポンスが返ってこなかった点 です。

友人Aからのご指摘がこちら。前回の記事から、ACMD41を行う際のロジアナを見て、CRCが0x00であることに気が付いた形です。

本来のSDカードのコマンドは、CRC8では無く、CRC7になり、1bit目はEnd-bitになるそうです。

そう言う規格です。

更にややこしい事に、SPIモード用のACMD41(CMD55)やそれ以降のコマンドではCRCは無視されるという事です。

ここを混ぜ込むと、CRCは無視される為0x00にEnd-bitの0x01が含まれ、本来正しい値は0x01でした。

そこを、何故か自分が参考にしたソースは0x00で送信していたといった所です。

※言い訳になりますが、他人のソースを真似して問題が起きたという話ではなく、他人のソースを借りて来てもしっかり自分で確認して理解した上で使うというのを心がけていますが、CRCが7bitで0x01が必要と言った情報が抜けていたため、自分も見逃してしまってしましました。申し訳ありません。

詳しい仕様はこちらから
https://www.sdcard.org/downloads/pls/pdf/?p=Part1_Physical_Layer_Simplified_Specification_Ver9.10.jpg&f=Part1PhysicalLayerSimplifiedSpecificationVer9.10Fin_20231201.pdf&e=EN_SS9_1

さて、CRCがある部分を0x01に変更してみました!!

どうでしょう!レスポンスがキッチリ帰ってきました!
やったね!これで動かなかったSDカードがSPIで動いた!!!

CRC箇所に0x00で動く奴と、動かない奴が居る

前回のSPIモードが動かないと嘆いた点。
要するにCRC箇所に0x01を書き込んでなかった事が原因です。
しかし、初手で動かなければ、ここまで話が大きくなりません。

何と!! CRC箇所が0x01であることが規格で設定されているのに!

規格に準じない0x00でもレスポンスを返すSDカードが存在する!

しかも大量に・・・

ここに自分が集めたSDカードを用意致しました。
上にある4枚 何とCRC箇所が0x00でも動作します! 
逆に、下にある1枚(前回動かないと嘆いたSDカード)
何とCRC箇所が0x00だと動かず0x01で動きました!

ここで、友人Aからメールを頂きましたのでご紹介いたしますと・・・

93枚程度のSDカードを6バイト目:0x00を発行して確認してみたのですが、
・89枚:0x00でも問題なくコマンドを受け付けR1レスポンスが返ってきた。
・1枚:先輩と同様に0xFFが返ってくる状況。
・3枚:CMD55自体はR1が返ってくるものの、以降のコマンドがおかしくなったり
   応答不能になったりと、なんか怪しい感じ。(ちゃんと調べていない)
でした。

きゅ、93枚!!??
友人Aは自宅にSDカードを沢山集めているらしく(多分職業柄)そのカードで試して頂きました。
そんなに沢山SDカードを持っている友人ですら、今回の件は初耳の様で、大変有意義だったかなと思ったり。
96%のSDカードは、CRC箇所が0x00でも動く
1%のSDカードは、CRC箇所が0x01じゃないと動かない
3%のSDカードは、CRC箇所が0x00だと動きが怪しいが0x01なら動く
と言った結果になりました。

まとめると?


友人Aのご意見は正に正しく、CMD8以降はCRC箇所は0x01で送信したほうが良いです。

ただ、9割以上のSDカードはCRC箇所が0x00でも0x01でも動作する点、ライブラリ製作者によって動いた動かないといった結果の違いが出やすいです。

※STM32でSPIを用いてSDカードを書き込むサンプル、そのままにすると同じ問題を踏みます。CRCの代入が0x00の箇所をCRC=0x01等に変更すると、動かなかったSDカードが何故か動くとか出て来るかもしれません

CRC箇所を0x01にすることで、SPIモードにならなかったSDカードが無事にSPIでファイルを書き込み読み出すことが出来ました。

自分はSPIモードにならないSDカードを見つける事が出来ませんでした
大変申し訳ありません。(大土下座)

また、後輩の友人Aには大変助かりました。
病院で診断待ちの間に記事を読んで見つけたようで、忙しい時に本当に申し訳ない。
レポートの書き方も非常に良く、自分より記事書いた方が良いと思ったり(その内引き込むかも)
そして、SDカードを93枚もサンプル数は滅茶苦茶強い。自分も学びを得ました。SDカードを集めなければ。

SDカードはどうやら個体差があるかもしれない。とは言え規格通りに製作してあれば、ある程度の個体差は隠ぺいされる と言った結果が導けるかなぁと思っております。

今後の希望としては、本件で学んだSDカードの特性を生かし、どのマイコンにも移植性が高いSPI-SDカードライブラリを作成したいと思いました。

ライブラリによって毎回こう言った苦しみは続けてはいけないと思っていますので、一発上手く動くライブラリをこしらえたいなぁと思いました。

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
ArtifactNoise合同会社では技術コンサルタントを行っております。
ご興味があれば是非ご連絡くださいませ。
北神雄太 kitagami(at)artifactnoise.com
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■

Discussion