今回から読み書きの動作を確認していきたいと思います。
前回の予告で、書き込みコマンドに移る予定でしたが、書き込みされたかどうか
確認する方法として、書き込み前と書き込み後の値の比較が必要と思ったりして^^;

ということで、まずはリードで書き込み前の値を調べることにしました^^

ブロックデータの読み込みは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目のブロックを読み込みしています。
(すでにコマンドに埋め込みしてしています。通常はここを読み込む位置として指定します)

次回にブログラムを提示いたします

おすすめの記事