バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
SDカードのSPIモード通信の初期化シーケンスの中の読み書き可能状態遷移について。
登場人物
博識フクロウのフクさん

イラスト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カードのSPIモード通信の初期化シーケンス読み書き可能状態へ

フロー図を見ると、SDv1、SDv2ともにACMD41(SEND_OP_COND)ってのを投げて、
in_idle_stateってのが1になるの待つって感じなのかな?

そうだね。
もうそれだけで話を終了してしまってもOKなレベル。

いや、ちょっと待ってよ。
良く見ると、SDv2のルートはHCSってパラメータをなんかするような記載があるんだけど。

おー!
ちゃんと気が付いたか!

(試しやがったな)
ACMD41のパラメータ

まず、ACMD41に載せられるパラメータの話をしようか。
32bit長のパラメータが載るんだけど、まぁ先ほどのHCS以外はreservedなんだけどね。
bit position | Definition | Description |
---|---|---|
31 | reserved | |
30 | HCS | High Capacity Support |
[29-0] | reserved |

HCSはHigh Capacity Supportの略なのか。

ん?
High Capacityというと、SDHCのHCがHigh Capacityの略だったような?

そうそう。
もう気づいたかもしれないが、HCSビットを立てた状態でACMD41を発行するとSDSCからSDHC以降のモードとして動作する。
HSCビットを立てるとどうなるのか?

そのHSCビットを立てて、SDHC以降のモードにすると何が変わるの?

SDカードの読み書きの際にアドレス指定をするんだけど、
元々のSDカードの仕様としてはアクセス最小単位のBlockは512byte固定では無いんだよね。
CMD9(SEND_CSD)でCSDレジスタを読み出すと、そのSDカードのBlock lengthがわかるんだけど、
大体、CMD16(SET_BLOCKLEN)で512byteに再設定しちゃうのが流儀かな?
SDHC以降に関しては最初からBlock lengthが512byte固定という仕様になったんで、
HCSビットを立てるということは「Block length=512byte」にするのと同義。
ってことになる。

細かいところはわからんが、
とりあえず512byte単位のアクセスに切り揃えた方が楽なんで
当初はCMD9、CMD16で再設定していたところ、HCSビット立てればOKって仕様に変わったって感じかな?

まぁ仕様策定までの内情はわからないが
推測レベルとしてはそういうことになるんだろうねぇ。

SDカードと言えば、無条件で512byte単位アクセスだと思い込んでたから
ちょっとこれは驚きだね。

まぁどっちにしても変更可能なパラメータなんで、512byte固定と思っててもOKかもね。
in_idle_state

あとはin_idle_stateかな?

これはAMCD41のレスポンスをみればOK。
レスポンスのフォーマットはR1フォーマット。
R1フォーマットを再掲しておく。


あー、bit0を見ればいいだけなのね。
これはわかりやすい。

これでidel状態を抜けて読み書き可能な状態になったことが分かる。
まとめ

まとめだよ。
- SDカードのSPIモード通信の初期化シーケンス読み書き可能状態遷移を説明。
- ACMD41(SEND_OP_COND)を投げてR1レスポンスのin idle stateを監視するだけ。
- ACMD41(SEND_OP_COND)のパラメータにHCS(High Capacity Support)の付加してSDHC以降のモードに切り替えられる。
- SDHC以降モードはBlock lengthが512byte固定となる。
バックナンバーはこちら。
コメント