SDの読み出しの続き。
7)物理セクタ0の読み出して、オフセット値を読み出す。
7−1)CMD17 を送信する。
→ CMD17 は、ブロック読み出しのコマンドで、"0x51" "0x00" "0x00" "0x00" "0x00" "0x00"
"0x51" に続く4バイトは、読み出しアドレスになります。物理セクタ0(=アドレス0)なので、ALL0を指定。
7−2)SD_DI にデータが来るのを待つ(0xFF 以外の値)。
→ CMD17 に対するレスポンスは、R1
R1 が 0x00 以外の場合はエラー処理。
7−3)SD_DI にデータが来るのを待つ(0xFF 以外の値)。
→ R1 を受信したちょっと後に、データが送信されてくる。
受信したデータを先頭からD[0]、D[1]、・・・、とすると
D[0] :0xFE(先頭の目印)、もしくはエラーがあった場合に、エラートークン
D[1]〜D[512] :読み出しデータ
D[513]、D[514]:CRCデータ(CRC-16)
エラートークンは、次の通り。
bit7-5:0固定
bit4 :カードがロックされている
bit3 :範囲外
bit2 :ECC 訂正が出来なかった
bit1 :カードコントローラのエラー
bit0 :1固定
CRCのチェックをしてもいいのだが、面倒なのでチェックしないことにする。
オフセット値は、D[454]〜D[457] の32ビットで、D[457] が最上位。
7−4)データ受信後、SD_CS ="L" 、SD_DO ="H"、のままで、1バイト分クロックを送信する。
→ これでCMD17 が終了。
データの読み出し手順に関しては、アドレスの変更のみなので、以下は省略。
8)論理セクタ0の読み出す。
8−1)論理セクタの位置を計算する。
→ (セクタ番号+オフセット値)×512 が物理アドレスらしい。
2011年10月04日
この記事へのコメント
コメントを書く

