バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
SDカードのSDモード通信の初期化シーケンスのCMD11(VOLTAGE_SWITCH)によるVoltage Switchの手順詳細について。
登場人物
博識フクロウのフクさん
イラスト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カードのSDモード通信の初期化シーケンス詳細
「CMD11(VOLTAGE_SWITCH)によるVoltage Switch」の手順詳細の話になる。
- CMD8(SEND_IF_COND)によるSDv2判定及びサポート電圧判定。
- ACMD41(SD_SEND_OP_COND)によるHigh Capacity設定とVoltage Switch可否判定。
- CMD11(VOLTAGE_SWITCH)によるVoltage Switch。 ← これ3回目/全4回
- CMD2(ALL_SEND_CID)によるCIDの取得。
- CMD3(SEND_RELATIVE_ADDR)によるPublished RCAの取得。
- CMD7(SELECT/DESELECT_CARD)によるTransfer State(tran)遷移。
全体のフロー図はこれ。
VOLTAGE_SWITCHの手順はこれ。
今回は(4)から(6)までだね。
(1) ホストからのCMD11発行
(2) カードからのR1レスポンス
(3) カードがCMDとDAT[3:0]をLowにする
(4) ホストがSDCLKを停止
(5) 5ms以上wait
(6) ホストが1.8VでSDCLK送出
(7) SDCLK送出から1ms以内にカードが1.8VでCMDラインをHigh
(8) ホスト側でCMDラインのプルアップチェック
(9) カード側でDAT[3:0]のいずれかのラインをHigh
(4) ホストがSDCLKを停止
「(3) カードがCMDとDAT[3:0]をLowにする」で、
SDカード側がLowに引っ張っているわけなんだけど、
ホスト側はそれを検知する必要がある。
とすると、
ホスト側は
- SDCLK:出力
- CMD:入力
- DAT:入力
SDカード側は
- SDCLK:入力
- CMD:出力
- DAT:出力
になってるってことか。
まぁ仕様書上に明記されてるわけでは無いが、きっとそうだろうね。
そうじゃないと辻褄合わないし。
(5) 5ms以上wait
これはSDCLKを5ms以上止めておくってことかな?
そう。
本当にそれだけ。
この5msは何してるんだろう?
仕様書上に記載があるわけではないが、
SDカード側の内部でVOLTAGE SWITCHの準備期間として設けられた時間だと思う。
よって、SDカードは5ms以内にVOLTAGE SWITCHが出来る設計/実装にしなければならないってことになるね。
まぁ時間規定は無いと困るし、利用する側としては5ms以上待つってことがわかればOKだね。
注意点としてはホスト側の5msがSDカード側の5msとぴったり一致することは無いと思った方が良いので、6msくらいを待つつもりの方が良いね。
(6) ホストが1.8VでSDCLK送出
「ホストが1.8VでSDCLK送出」は・・・。
これはさっきの5ms以上待った後の動作だね。
ここから1.8Vに切り替わるって感じか。
そうだね。
カード側もSDCLKが無いと通信が出来ないので、
最初のアクションはどうしてもホスト側からってことにはなるね。
まとめ
まとめだよ。
- カードがVOLTAGE SWITCHの開始受付としてCMDとDATラインをLowにする。
- ホスト側はCMDとDATラインをLowをカード側がVOLTAGE SWITCHの開始を受領したと見なす。
- ホスト側はSDCLKを5ms以上止める。(6ms待ちが安パイ)。
- 上記の5ms後にホストから1.8VのSDCLK送出開始。
バックナンバーはこちら。
コメント