バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
SDカードのSPIモード通信の初期化シーケンス詳細について。
SDカードに通電しただけでは読み書きはできない。
初期化シーケンスを必ず通す必要がある。
初期状態遷移、SDカードVersionの判定、電圧判定、容量判定。
などが代表的な手順となる。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
SDカードのSPIモード通信の初期化シーケンス詳細
前回は、初期化フローの図を見せて終わりにしたんで、
もうちょい詳細に説明しようか。
そうしてもらえると助かるよー。
一応、前回の図を載せとくか。
とりあえず、以下の流れで説明になると思う。
- 初期状態に戻す
- SDv2以降判定
- 駆動電圧判定
- 読み書き可能状態へ
- SDv2の容量判定
初期状態に戻す
まず、強制的にSDカードの内部状態を初期状態あるidle状態に戻すコマンドがある。
フローの中のCOMD0ってやつ?
そうそう。
CMD0(GO_IDLE)になるんだけど、
大体SDカード側がハングった場合に発行することが多いねー。
SDカードってハングるの?
まぁ内部で結構複雑なNAND-FlashROMの管理をしてるんでね。
状況によってはハングすることもある。
その場合は、一旦idle状態に戻して、再度初期化シーケンスを通すことで復活することが多い。
ということは、初期化シーケンスは電源ON直後に一回やればOKって感じじゃないのか。
そうだねー。
SDv2以降判定
次にSDv2以降判定かどうかの判定。
CMD8(SEND_IF_COND)ってので判定してるみたいだね。
CMD8(SEND_IF_COND)はSDv1にはないコマンドで、
SDv1の場合、Illegal commandのエラーになる。
Illegal command errorは
R1レスポンスの中にあるエラービットとして規定されてる。
なるほど。
わざとSDv1でエラーになるコマンドを発行して判断するわけか。
若干、荒業にも見えるけど、
それなりの歴史がある仕様なんでね。
こういうのも仕方ないかもね。
まとめ
まとめだよ。
- SDカードのSPIモード通信の初期化シーケンス詳細を開始。
- 以下の順番で説明予定。
- 初期状態に戻す。
- SDv2以降判定。
- 駆動電圧判定。
- 読み書き可能状態へ。
- SDv2の容量判定。
- 以下の順番で説明予定。
- 初期状態に戻すのはCMD0(GO_IDLE)。
- SDv2を判定するのはCMD8(SEND_IF_COND)でエラーになるかどうか。
バックナンバーはこちら。
コメント