前回で、SD-CARDと8bit通信の入出力プログラムができましたので、SD-CARDに初期化コマンドを与えてデータが読み書き出来るよう初期化していきます。

初期化の手順は、ELMさんのプログに加え、浅草ギ研様「A33FでMicroSDカードにアクセスしてみる」のWWWページを参考にさせていただきました。
貴重な情報ありがとうございます。

まず、SD-CARD(スレーブ)に対するZ180(マスタ)からのコマンド形式を確認してみます。
コマンドは6バイトで構成されています。

1バイト目 
7ビット目は0、6ビット目は1、5ビット~0ビットはコマンド番号が割れ当てられます。
例:CMD16 コマンド16でブロック長を指定するコマンドです。
16番(10進表示)なので2進に変換すると10000となります。
1バイト目のデータは7ビット 0、6ビット1なので 01010000になり、50(16進表示)となります。

2バイト目~5バイト目はコマンドの引数です。

6バイト目は7ビット~1ビット目の7ビットのCRC(巡回冗長検査:誤り検出符号の一種)と0ビット目が1で構成されています。
CRCは計算しなくてはなりませんが、幸い、CRCをチェックされるコマンドは、引数が固定されていますので、前もって計算されたCRCを挿入できます。
初期化コマンドでは、cmd0、cmd8についてだけ、あらかじめ計算されたCRCを設定しています。

コマンドに対するレスポンスは、1バイトで計4タイプあります。
ここではよく使用するR1の各ビットは次のようになります。
ビット7: 常に0
ビット6: パラメータエラー
ビット5: アドレスエラー
ビット4: 消去順序エラー
ビット3: コマンドCRCエラー
ビット2: 設定されていないコマンド
ビット1: 消去リセット中
ビット0: 実行待機中

エラーがない場合 00になります。

今回使用したコマンドは次のように定義しています。

[asm]

cmd0: ;;48bit(6byte) Fixed length
.db 0x40 ;;command index
.db 0x00 ;;argument
.db 0x00 ;;argument
.db 0x00 ;;argument
.db 0x00 ;;argument
.db 0x95 ;;CRC
;cmd1:
; .db 0x41 ;;command init
; .db 0x00
; .db 0x00
; .db 0x00
; .db 0x00
; .db 0xf9 ;;CRC
cmd8:
.db 0x48
.db 0x00
.db 0x00
.db 0x01
.db 0xaa
.db 0x87
acmd41:
.db 0x69
.db 0x40
.db 0xff
.db 0x80
.db 0x00
.db 0xff
cmd58:
.db 0x7a
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0xff

cmd55:
.db 0x77
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0xff

cmd16:
.db 0x50
.db 0x00
.db 0x00
.db 0x02
.db 0x00
.db 0xff
cmd17:
.db 0x51
.db 0x00
.db 0x00
.db 0x02
.db 0x00
.db 0xff

cmd24:
.db 0x58
.db 0x00
.db 0x00
.db 0x02
.db 0x00
.db 0xff

[/asm]

次は初期化ルーチンのコードを展開していきたいと思います。

おすすめの記事