バックナンバーはこちら。
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。 ← これ4回目/全4回
- CMD2(ALL_SEND_CID)によるCIDの取得。
- CMD3(SEND_RELATIVE_ADDR)によるPublished RCAの取得。
- CMD7(SELECT/DESELECT_CARD)によるTransfer State(tran)遷移。
全体のフロー図はこれ。
VOLTAGE_SWITCHの手順はこれ。
今回は(7)から(9)までだね。
(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
(7) SDCLK送出から1ms以内にカードが1.8VでCMDラインをHigh
前回、ホスト側からSDCLKが送出し始めたところまで来てたから、
その送出をSDカード側が検知してから1ms以内にCMDラインをHigh・・・。
って、そのまんまだね。
そうだね。
ここでは1ms以内ってのが重要だね。
手順の後半は割と時間にシビアだなー。
(8) ホスト側でCMDラインのプルアップチェック
これも書いてあるまんまなんだが、
一個前の「(7) SDCLK送出から1ms以内にカードが1.8VでCMDラインをHigh」と組み合わせると、
ホスト側は1.8V SDCLKを送出してから1ms以上まってから、CMDラインのHighをチェックできるってことになる。
それをもって、SDカード側1.8Vへ移行できたのが分かるってわけか。
そうだね。
まぁもう1手順あるんで、確定ってわけではないが、まぁSDカード側が1.8V駆動に遷移しているのは間違いないだろう。
カード側でDAT[3:0]のいずれかのラインをHigh
やっと、最後の手順か。
カード側で1.8VでDATのラインを駆動できれば、完全に1.8V駆動可能ってことだね。
そうそう。
これをもって、
SDCLK、CMD、DATのすべてのラインで1.8Vで駆動した事実が出来たんで、
物理層としては完全に1.8Vで問題無しと言える。
なんか最後の方は信号ラインの動作確認みたいな感じだったね。
仕様書には書いてないけど、たぶんそういう位置づけなんじゃないかな。
ここへ変にこけたら3.3V系に戻す必要もあるだろうし。
予想以上にしっかりしたハンドシェイクだったな。
とりあえず、Voltage Switchの話は以上だ。
まとめ
まとめだよ。
- ホストからのSDCLK送出から1ms以内にカードはCMDを1.8VでHighにする。
- ホストはそれを検知。
- さらにカードはDATのラインを1.8VでHighする。
- これもホストが検知。
- 上記をもって、SDCLK、CMD、DATのラインが1.8V駆動で通信可能な状態が相互で確認できたことになる。
バックナンバーはこちら。
コメント