FPGAでSDカードと通信してみる。(4)
というわけで前回たしかBPBまで読んだはずだが何を思ったかここで回路に新たなコマンドを追加し、FAT32(というかSDHCカード?)に対応させた。
やったことはCMD0を送った後にCMD8を送るだけ。けどCMD8はCRCが必要なのでそこだけ注意が必要。これは固定値にしてしまって0x48000001AA87を送信する。そしてR7が返ってくるので受信したらACMD41を送って0x00が帰ってくると初期化が完了する。ここらへんは調べれば出てくるので説明は割愛。
そしてSDカードを8GBのものに交換し実験を再開した。
とりあえずまたセクタ0を読んでBPBのセクタナンバを調べたところ0x2000だったのでそこを読んでみる。
とりあえず必要なデータのところだけ。
- EB 00 90
- 20 20 20 20 20 20 20 20
- 00 02 -----------------セクタバイト数
- 40 ----------------------クラスタのセクタ数
- FC 10 -----------------予約セクタの数(BPBが0x2000でそこから0x10FC足した0x30FCがFAT1)
- 02 ----------------------FATの数
- 00 00 00 00 F8 00 00 3F 00 FF 00
- 00 20 00 00 ---------MBRからBPBまでのセクタ数
- 00 58 F0 00 ---------パーティションブロックのセクタ数
- 82 07 00 00 ---------FATエリアのセクタ数0x0782
これらの内容から各開始セクタを計算する。
FAT1 0x30FC
FAT2 0x30FC + 0x0782 = 0x387E
DIR 0x387E + 0x0782 = 0x4000
ここでSDカードに保存しているデータを確認
SDカードの直下にHELLO.TXTというファイルを作成し、そこに
ABCDEFG
1234
と書き込んだ。
ではまずDIR(クラスタ2)を見てみる。
1ファイルにつき32byteが割り当てられていて目的のHELLO.TXTは234byte目から
48 45 4C 4C 4F 20 20 20 54 58 54 20 00 BC 72 4B ------ファイル名HELLO TXT
2E 4B 2F 4B 00 00 88 4B 2E 4B 05 00 1C 00 00 00 ------開始クラスタ0x00000005
クラスタ5のアドレスを計算すると0x40C0になったので次にそこを読むと
なんかそれっぽいのが出てきた。
これを文字コードで受信すると
きた!!!
と、いうわけでFPGAでSDカードからファイルが読めた。
今回作成したモジュールをもう少し設計し直して簡単にSDへアクセスできるようにしていきたい。
ここまでの作業で実際の作業時間で考えると一週間も使っていないので結構簡単にアクセスできることが分かった。そしてマイコンでもこれと同じアルゴリズムを実装してみたが明らかにFPGAで通信した方がデータが早く持ってこれる。
が、ChaNさんのサイトが無かったら全く手付かずだっただろう。。。感謝
ひとまずFPGAとSDの通信についてはここまで。
結構雑に書いたので間違いだらけかもしれないがそこは察してほしい。
次はどんなネタで進めていこうか。。。
また何か思いついたら更新されるかもしれない。