【FileSystem】車載外部ストレージ その21【SD初期化④】

【FileSystem】車載外部ストレージ その21【SD初期化④】 車載外部ストレージ

バックナンバーはこちら。
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モードに於いての初期化シーケンスのフロー

SDカードのSPIモード通信の初期化シーケンス読み書き可能状態へ

太郎くん
太郎くん

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

フクさん
フクさん

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

太郎くん
太郎くん

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

フクさん
フクさん

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

太郎くん
太郎くん

(試しやがったな)

ACMD41のパラメータ

フクさん
フクさん

まず、ACMD41に載せられるパラメータの話をしようか。
32bit長のパラメータが載るんだけど、まぁ先ほどのHCS以外はreservedなんだけどね。

bit positionDefinitionDescription
31reserved
30HCSHigh Capacity Support
[29-0]reserved
太郎くん
太郎くん

HCSHigh 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フォーマットを再掲しておく。

SDカードSPIモード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固定となる。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました