【FileSystem】車載外部ストレージ その11【SDカード⑦】

【FileSystem】車載外部ストレージ その11【SDカード⑦】 車載外部ストレージ

バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/

はじめに

SDカードの(Multiple) Block Write Operation(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カードの(Multiple) Block Read Operation(SPIモード)

フクさん
フクさん

今回は(Multiple) Block Write Operationについて。

  • No data Operation
  • (Multiple) Block Read Operation
  • (Multiple) Block Write Operation ← これ
太郎くん
太郎くん

前回が読み出しだから、
今回は逆の書き込みだねー。
これもサクっと図解よろしくー。

フクさん
フクさん

はいよ。

SDカードの(Multiple) Block Read Operation(SPIモード)図解
太郎くん
太郎くん

これは・・・。
意外とややこしそう。

  • Start Block token
  • Stop Tran token

ってのが何者?って感じだ。

Start Block token

フクさん
フクさん

まぁ割とシンプルな8bitデータが入るだけだね。
ただ、Blockが1つか複数かで構成が若干変わる
まずはSingle Blockの場合。

Single BlockのStart Block token
フクさん
フクさん

そして、Multi Blockの場合。

Multi BlockのStart Block token
太郎くん
太郎くん

SingleとMultiで違うんだねー。
なんで?

フクさん
フクさん

明確な理由は分からないが、
そもそもSingle BlockとMulti Blockでは使用するcommandが違うからねー。

  • CMD24(WRITE_BLOCK)
  • CMD25(WRITE_MULTIPLE_BLOCK)
太郎くん
太郎くん

ほー。

Stop Tran token

フクさん
フクさん

次はStop Tran token。
こっちはMulti Blockだけだね。
Single Blockにはない

太郎くん
太郎くん

Single Blockには無いんだ。

フクさん
フクさん

Single Blockの場合、data_responseの後のbusyで書き込み完了が分かるからね。
Multi Blockの場合は、SDカード側でバッファリング&書き込みを並行で行って、
Stop Tran tokenが来たら全部書き終わるまでbusyにしておく。
って言う感じで効率化処理をしているんだと思う。

太郎くん
太郎くん

となると、CMD24(WRITE_BLOCK)を複数回呼ぶより、
CMD25(WRITE_MULTIPLE_BLOCK)を一回呼ぶ方が効率的ってことかー。

全部CMD25(WRITE_MULTIPLE_BLOCK)でも良いか否か

太郎くん
太郎くん

だったら、全部CMD25(WRITE_MULTIPLE_BLOCK)でも良いんじゃないかなー。

フクさん
フクさん

そうでもないかな。
実はCMD25(WRITE_MULTIPLE_BLOCK)を呼ぶ前に
ACMD23(SET_WR_BLOCK_ERASE_COUNT)を呼ぶ必要がある。

太郎くん
太郎くん

ACMD?CMDじゃなくて?

フクさん
フクさん

SDカードのCMDには拡張コマンドに位置するACMDってのがあるんだよ。
実際にはCMD55(APP_CMD)を呼んだ後に従属する形で次のACMDのコマンド番号を呼ぶ感じ。

太郎くん
太郎くん

ということは、
CMD25(WRITE_MULTIPLE_BLOCK)を使うには、

  • CMD55(APP_CMD)
  • CMD23(上と合わせてACMD23)
  • CMD25(WRITE_MULTIPLE_BLOCK)

の3つのcommandを送る必要があるのかー。

フクさん
フクさん

というわけで、ここら辺はSDカードドライバの設計コンセプトにも依存するんだが、書き換えBlock数が

  • 2以下の場合はCMD24(WRITE_BLOCK)
  • 3以上の場合はCMD25(WRITE_MULTIPLE_BLOCK)

というような実装になってることもあるねー。

太郎くん
太郎くん

なるほど。
書き込みBlock数が3つになるまでは、CMD24(WRITE_BLOCK)の方が発行command数が少ないもんね。

まとめ

フクさん
フクさん

まとめだよ。

  • SDカードの(Multiple) Block Read Operation(SPIモード)の説明。
  • Start Block token、Stop Tran tokenというものがある。
    • Single Block、Multi Blockで各tokenが異なる。
  • CMD25(WRITE_MULTIPLE_BLOCK)の方が効率的だが、書き込みBlock数が少ない場合はcommand発行回数の都合でCMD24(WRITE_BLOCK)の方が効率的になることがある。

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

コメント

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