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