バックナンバーはこちら。
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 ← これ
前回が読み出しだから、
今回は逆の書き込みだねー。
これもサクっと図解よろしくー。
はいよ。
これは・・・。
意外とややこしそう。
- Start Block token
- Stop Tran token
ってのが何者?って感じだ。
Start Block token
まぁ割とシンプルな8bitデータが入るだけだね。
ただ、Blockが1つか複数かで構成が若干変わる。
まずはSingle Blockの場合。
そして、Multi Blockの場合。
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)の方が効率的になることがある。
バックナンバーはこちら。
コメント