🗂️

SPIモードにならないSDカードが流通している件(は間違いでした)

2024/10/15に公開

20241017 追記

大変申し訳ございません、SPIモードにならない件、当方のプログラムが原因でした。
原因について、またどうしてこうなったかに関しまして、記事を作成致しました。
本記事を一読の上、リンクの記事を読んで頂けると流れが読めると思います。
https://zenn.dev/nonnoise/articles/0b3164c2339dde
お騒がせ致しまして申し訳ありません

SDカードでSPI機能を使う界隈

SDカードへのアクセスは通常、SDIOを用いる事が多いですが、マイコンを用いた組込み界隈ではSPIを使ってSDカードにアクセスする事が古くからありました。

しかし、SDカードの高速化と小型化に伴い、SPIモードは一体いつまで対応されるのかと不安になる方も居ましょう・・・

見つけました。SPIモード非対応のSDカードを!!

どこのSDカード?

Amazonではこういう 16GBx5セット!みたいな売り方をしている商品があります。
1枚あたりは600円くらいか、そんな激安でも無いか。
安価なメモリーは今後SPIモードに非対応になっていくかもしれません。

どうやって見つけたの?

マイコンでSDカードにアクセスしてみたく、FatFsを試している所でした。
プログラムも無事に移植出来、書き込み試験を行おうと思った所、マウントに失敗となりました。
デバック方法が分からず、とりあえずロジアナで見てみようと思い、そこで違和感にあたりました。

ゆっくり説明しましょう。

SDカードをSPIモードにするには、コマンドを何回か送るという作法があります。

http://elm-chan.org/docs/mmc/mmc.html
https://zenn.dev/felis_silv/articles/face34726d87ed

この辺を読んで通過したと思って話を進めます。

SDカードをSPIモードにするのに
CMD0やCMD8,ACMD41と言ったコマンドを送る必要があります。

そして、送ったコマンドにはレスポンスが返ってきます。

今回発覚したのは、SPIモードに移行するコマンドのレスポンスが返ってこなかった です

前提条件

ます、通常どうり、USB-SDカードリーダーでSDカードが認識して読み書き出来る事を確認します。
問題無い動作をしています。これでSDカードが正常であることが分かります。

最初は回路のミスやプルアップのミス等も考えました。
ロジアナを繋げた際に、そのミスが無いことが一旦分かりました。

上から順に
 CS、MOSI、MISO、CLK
です。
双方向にMOSIを送ってMISOにレスポンスが返ってきているのが分かります。

その為、回路上でも問題が無いという事が分かります。

問題の場所

尺度的に難しいですが、ロジアナで波形を見ていると、初期化の段階でMISOの反応が無くなる箇所があります。随分無反応です。
最初の方ではMISOがピョコピョコとレスポンスを返しています。

最後のMISOを拡大すると

読み方が難しいですが、最初の2個の0xFFはダミーです。
0x48はCMD8 です。その後色々送られて、んで、MISOに0x01がレスポンスと届きます。
0x01の後に0xAAは応答結果として正しい動きとなります。

では、一体どこでMISOが固まってしまったのでしょうか。

次のコマンドは0x77 ACMD41です。
ACMD41はSPIモードで使う特殊コマンドの様な物です。
ACMD41は何回か繰り返すと良いといった話もありますが、繰り返しても0xffのままでレスポンスは帰ってきていません。
このままタイムアウトして、SDカードの認識失敗をしているみたいです。

プログラムが悪いんじゃ無いの?

最初自分もそう思いました。ソースを読み解き、SDカードの仕様を読み解き、コマンドを送ったらレスポンスがあるのが当然なので、この波形は明らかにおかしい気がしていました。

そこで!急ぎ足、秋葉原に他のSDカードを買いに行きました!
https://amzn.asia/d/2JKk9fx

安定のKIOXIA! 君がダメならお手上げだぁ!

早速同じ状況でロジアナを取りました・・・

レスポンスが返って来てるぅぅぅ!!!

何だよ何だよ!と思いながら、ダッシュで秋葉原に向かったかいがあったみたいです。
無事にSDカードに書き込みも出来ました。

考察

安定のKIOXIAでSPIモードが使えた点はとても嬉しかったです。

安価なSDカードだと、SPIモードを削ってSDモードのみ対応と言った劣化版を出しているかもしれません。

安価なSDカードも、USB-SDリーダーでは問題なくファイルの書き換えが出来ましたので、対応しているコマンドACMD41等の対応が少ないのではと思ったりしています。

KIOXIAを使い続ければSPIモードで使える!!

安価なSDにも対応させたいので標準なSDIOに対応させる!!

どちらも正しいと思います。
とは言え、SPIモードが必ず使えると言った話じゃない事が分かったので、その点を共有する記事となります。

SDIOモードも試してみるかぁ~

ではでは。

追記

やっぱり皆さん、SDカードがSPIで動かないのはおかしい!と思うので、似たような事例にあたった方も見つけました

0x77 ACMD41の動作がおかしい(0xFFで固まる) って点が共通しているかもです。

この話は、SDカードが粗悪である可能性が非常に高いです。
ブランドのSDカードであれば、SPIモードへの対応はされていると思います。
ノーブランドやSDアソシエーションに加盟していないメーカーのSDカードは問題に当たり易と思われます。
KIOXIAを使おう

20241017 追記

大変申し訳ございません、SPIモードにならない件、当方のプログラムが原因でした。
原因について、またどうしてこうなったかに関しまして、記事を作成致しました。
本記事を一読の上、リンクの記事を読んで頂けると流れが読めると思います。
https://zenn.dev/nonnoise/articles/0b3164c2339dde
お騒がせ致しまして申し訳ありません

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

Discussion