バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
SDカードのSDモード通信の読み書きの話。
登場人物
博識フクロウのフクさん
イラスト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モード通信の読み書き
今回からSDモードでの読み書きだけど、
基本的には一緒なのかな?
そうだねー。
ぶっちゃけると流れは一緒なんだよねー。
違いだけいうとどうなるの?
まずtokenが無いね。
SPIモードの時は
Start Block/data Response/STOP_TRAN token
があったと思うけど、
SDモードの時はない。
あとは、Transfer State(tran)に遷移してないと読み書きできないんで、
CMD13(SEND_STATUS/SEND_TASK_STATUS)でCARD_STATUSを読み出して、Transfer State(tran)に居ることを確認するくらいかな。
大雑把に読み書き説明
だったら、CMD13に特化した説明で終了ってのでもOK?
そうだね。
SDモードでR1フォーマットのデータ長がSPIと異なるとかはあるが、
SDモードに於いてのR1フォーマットは以前やってるし。
たしかにここでやった。
SDモードでのR1フォーマットはこれだね。
Bit position | 47 | 46 | [45:40] | [39:8] | [7:1] | 0 |
Width(bit) | 1 | 1 | 6 | 32 | 7 | 1 |
Value | ‘0’ | ‘0’ | x | x | x | ‘1’ |
Description | start bit | transmission bit | command index | card status | CRC7 | end bit |
というわけで、改めてSDモードの話をするってのも似たような話になる。
まぁ復習も兼ねて手順を書いておこう。
Multi Block Writeにちょっと差分があるかな。
Single Block Writeの場合
①CMD24(WRITE_BLOCK)による書き込み
Multi Block Writeの場合
①ACMD23(SET_WR_BLK_ERASE_COUNT)による消去ブロック数指定
②CMD25(WRITE_MULTIPLE_BLOCK)による書き込み
③CMD12(STOP_TRANSMISSION)による停止 ← STOP_TRAN tokenの代わりにCMD12を発行
Single Block Readの場合
①CMD17(READ_SINGLE_BLOCK)による読み出し
Multi Block Readの場合
①CMD18(READ_MULTIPLE_BLOCK)による読み出し
②CMD12(STOP_TRANSMISSION)による停止
リクエストパラメータとかも一緒なのかな?
いっしょだね。
じゃー解決だ!
CMD13(SEND_STATUS/SEND_TASK_STATUS)にまつわる話
おおよその流れが解決したところで大きな差分である、
CMD13(SEND_STATUS/SEND_TASK_STATUS)特化で話してしまおう。
実際、CMD13(SEND_STATUS/SEND_TASK_STATUS)の説明に伴って、特殊なコマンドの説明もすることになるだろうし、それなりの話にはなると思う。
(まじか・・・。シンプルに終わらせようとしていたところに、なぜこのフクロウは話をややこしい方へ持っていくんだ・・・。)
というわけで
次回はCMD13(SEND_STATUS/SEND_TASK_STATUS)の話で。
まとめ
まとめだよ。
- SDモードの読み書きはSPIモードの手順とほぼ一緒。
- 差分はtokenが無い点。
- STOP_TRAN tokenの代わりにCMD12(STOP_TRANSMISSION)を発行する。
- SDモードの読み書きの場合、Transfer State(tran)が重要なのでCMD13(SEND_STATUS/SEND_TASK_STATUS)で状態確認を行う。
バックナンバーはこちら。
コメント