今回から読み書きの動作を確認していきたいと思います。
前回の予告で、書き込みコマンドに移る予定でしたが、書き込みされたかどうか
確認する方法として、書き込み前と書き込み後の値の比較が必要と思ったりして^^;
ということで、まずはリードで書き込み前の値を調べることにしました^^
ブロックデータの読み込みはCMD17となります。
なお、今回のプログラムに対応のSDカードとしては、Ver2及びSDHCカードしか対応していません。
初期化の指定方法がVer2以前SDカードとは異なるためです。
前回で試したCMD58コマンドでVer2及びSDHCであれば大丈夫です。
※2017年9月24日補足説明追記しました
また、 Ver2とSDHCカードでは 読み込み(書き込み)位置の指定方法が異なります。
Ver2では、512バイト(0x200)ごとのアドレス指定です。
つまり 1番目の512バイト 1ブック→ 0x000000
2番目の512バイト 1ブック→ 0x000200
3番目の512バイト 1ブック→ 0x000400
4番目の512バイト 1ブック→ 0x000600
・
・
SDHCでは、512バイトを1ブロックとしたブロック連番指定です。
つまり 1番目の512バイト 1ブック→ 0x000000
2番目の512バイト 1ブック→ 0x000001
3番目の512バイト 1ブック→ 0x000002
4番目の512バイト 1ブック→ 0x000003
・
・
CMD17コマンドを投げると、レスポンスが帰ってきます。
レスポンスが0x00であれば、リード準備完了なので
引き続き データブロックを読み取ります。
1ブロック512バイトとなっています。今回のプログラムでは
djnz制御文で記述していますので256バイトを2回読みしています。
読み込んだデータはいったんバッファ(sd_buff)に転送しています。
データブロックの最初は、スタートバイトが1バイトあり、続いてデータが512バイト、
最後にCRCが2バイトと続きます。
データブロックを読み終わった後、0xFFのダミーデータを送っています。
データブロックのスタートバイトは、0xFEとなりますので0xFEが読めるまで0xFFを
読み飛ばして行きます。
読み込むブロック位置は連番(SDHCの場合、Ver2はアドレス指定)になっています。
指定位置は4バイトで指定し、0x00000000~0xFFFFFFFFとなります。
高位バイトが先頭となります。
CMD17コマンドとしては
0x51-指定位置4バイト-CRC(1バイト)となります。
今回の例では、0x00002000目のブロックを読み込みしています。
(すでにコマンドに埋め込みしてしています。通常はここを読み込む位置として指定します)
次回にブログラムを提示いたします