CRC16の照合を実施しエラー検出していませんので、きちんとリードできていると思います。
サンプルソースが、CMD17によるREAD_SINGLE_BLOCKであったため、読出しのハード化による高速化をすれば、大丈夫と軽く考えていたのですが、データが出てくるまでの時間が長くて想定外。当初予定とはすっかり実装が変わってきています。
Transcend SDHC 8GB SD_CLK 22.5792MHz Sampling Clock 1MHz Total Access Time 12.49ms(A-B) Data Read Access Time 11.73ms(T-B) |
CMD18によるREAD_MULTIPLE_BLOCK 64セクタ分バーストリード
上図は1クラスタ分リードした波形です。22.5792MHzクロックで、1クラスタ分の転送が12.49ms。
24bit/384kHz再生の場合、1クラスタ分で14.2msの再生時間となるため再生可能な範疇に入りました。
セクタをカウントしているカウンタの下位4bitとデータ転送のステートマシンのモニタ出力を追加しています。黄色の波形の'H'および'L'1つが1セクタ分になります。
32bit/384kHzとなると27MHzぐらいまでクロックをアップさせないとまだ実現できませんが、これは可能なら対応するぐらいで考えます。
転送の概要は下記のようなシーケンスになります。
参考としていたドキュメントだと、CMD12を発行した後に転送中のセクタのデータ転送まで完了して転送終了となるようなタイムチャートに見えるのですが、実際に実施してみると、CMD12を出力したら即停止してしまうようです。
そこでCRC16のサイクルに入ったタイミングでCMD12を出力するように変更しました。
CMD18 によりReadデータが1セクタ分毎CRC16が付与されて出力される。CMD12により転送が停止。 |
CMD18によるREAD_MULTIPLE_BLOCK 64セクタ分バーストリード
下図は、クラスタ最後の転送(64セクタ目)のCRC16出力直後にCMD12を出力しR1bを受信している波形になります。
CMD18によるREAD_MULTIPLE_BLOCKアクセスのCMD12を出力して転送停止している部分
*図のREAD_MULTIPLE_BLOCKをるREAD_SINGLE_BLOCKと誤記っていたのを訂正 6/12
リードコマンドから実際データが送られて来るまで結構時間を要するのですね。興味深いデータです。SDカードのclass**の高速データはSDアクセスしたときの話で、SPI他ではそれほどclassが大きいものでも効能は薄いと思います。24bit/384kHz再生が理論的に可能なアクセスできているようで、おめでとうございます。さて質問ですが、64セクターリードとコマンドのオーバヘッドが少なくGoodなのですが、8G以下のSDでは、1クラスタ8セクタでは?リードオーバヘッドが多くなりそうな・・・。
返信削除4bitではなく1bitですがSPIモードではなくSDモードで動かしています。4bitにするのは多分あまり困難ではないのですが、IOの同時動作数を削減し電源のゆれを少しでも軽減する意図であえて1bitで考えています。
返信削除一概には言えないと思いますが、速いClassのほうがReadデータが出てくるまでの時間は速いのではないかと思います。(多分SPIモードでも)”SDHCカードの調査 Readデータ出力遅延ってかなり長い”で測定した結果では少なくともその傾向にあります。
CMD18(READ_MULTIPLE_BLOCK)はクラスタ境界を超えてもCMD12で停止するまでリードを継続します。
後で書くつもりですが、クラスタ単位ではなくFPGA内部のFIFOバッファの蓄積量で、少なくなったら読出しの開始/溢れそうになったら読出し停止というような制御する予定ですので、クラスタが8セクタでもあまり問題にはならないと思います。
kou様
返信削除詳細な返信ありがとうございます。
不案内なもので・・・失礼しました。
さわりだけ考えてみたが実行せず作りきれなかったもので、完成を楽しみに拝見させて頂きます。