バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
SDカードのCQ Modeの話。
「CMD13(SEND_STATUS/SEND_TASK_STATUS)でCQの状態を確認」について。
登場人物
博識フクロウのフクさん

イラスト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
CQ Modeのステートマシンと基本フロー

今回は「CMD13(SEND_STATUS/SEND_TASK_STATUS)でCQの状態を確認」について。
CQ Modeのステートマシン図は以下。


CQ Modeの基本フロー。
- CMD49(WRITE_EXTR_SINGLE)でEnable CQ=1にする。
- CMD44(Q_TASK_INFO_A)で読み込みor書き込み、優先度、制御Block数を設定
- CMD45(Q_TASK_INFO_B)で開始Blockアドレスを指定
- CMD13(SEND_STATUS/SEND_TASK_STATUS)でCQの状態を確認 ← これ
- CMD44(Q_TASK_INFO_A)で読み込み指示の場合はCMD46(Q_RD_TASK)で読み出し
- CMD44(Q_TASK_INFO_A)で書き込み指示の場合はCMD47(Q_WR_TASK)で書き込み
CMD13(SEND_STATUS/SEND_TASK_STATUS)でCQの状態を確認

実は、今回の「CMD13(SEND_STATUS/SEND_TASK_STATUS)でCQの状態を確認」については、以前やってたりするんだよねー。

確かに見覚えがあるな。
ここでやったやつか。

そうそう。
CMD13(SEND_STATUS/SEND_TASK_STATUS)の復習

CMD13(SEND_STATUS/SEND_TASK_STATUS)のリクエストパラメータはこれ。
Bit position | [31:16] | [15] | [14:0] |
Width(bit) | 16 | 1 | 15 |
Value | x | x | – |
Description | RCA | Send Task Status Register | stuff bits |

Task Statusを取得する場合は、
Send Task Status Registerを1にセットすればOK。

レスポンスはR1フォーマットなんだけど、
card statusがtask statusに置き換わるんだよね。
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 |

そして、task statusの内訳はこれ。
Bits | Identifier | Value |
31 | STATUS_TASK_31 | ‘0’:Not Ready、’1’:Ready |
30 | STATUS_TASK_30 | ‘0’:Not Ready、’1’:Ready |
… | … | … |
0 | STATUS_TASK_0 | ‘0’:Not Ready、’1’:Ready |

ここで、Command Queueの話が出てきて、「なにこれ?」にはなったけど
今見返すと、Command QueueとTask IDに紐づいた情報だったわけか。

正解!

予想以上にバッチリで驚いた!

よっしゃ!
task statusの使い方

で、このtask statusは何に使うの?

登録したTask IDと同一のSTATUS_TASK_XXを参照して、
それがReadyになっていたら、次のCMD46(Q_RD_TASK)かCMD47(Q_WR_TASK)を投げていいよってやつだな。

なるほど。
そこは割とシンプルな考え方だね。
まとめ

まとめだよ。
- 「CMD13(SEND_STATUS/SEND_TASK_STATUS)でCQの状態を確認」について説明。
- CMD13は以前やったものなので、復習。
- task statusを参照して、ReadyになってるTaskは次のCMD46(Q_RD_TASK)かCMD47(Q_WR_TASK)を投げて良い。
バックナンバーはこちら。
コメント