2014年1月28日火曜日

SDカードのマルチブロックライト

無事SPIのDMA転送が動くようになったので
SDカードにマルチブロック転送を仕掛けてみました
(SPI-DMAは後で別のエントリに書きます)

今回はSPIの送信だけをDMA化しました
受信処理はソフトウェアループです
それとコマンドの送信などもソフトウェアで行っています

基本的に僕はロガーでしか使わないので、高速な読み取りが不要というのが大きいです
どちらかと言えば4KiBとか8KiBのバッファを一気にカードに書き込みたい感じなので


FatFsを使ってバッファをSDカードに書き込んだ時の波形です

茶色がクロック オレンジがMOSI 赤がMISO 黄色がCSです
書き込みのバッファはXorshiftで初期化しているため乱数が入っています

1ブロック目の後はビジーが出力されますが
2ブロック目以降はビジーがほとんど発生していません
おそらく1ブロック目で内部バッファ等を初期化して、2ブロック目以降はバッファが溜まるまでとりあえず貯めこんでいく みたいな感じだと思います

上のキャプチャはクロック周波数18MHzですが
36MHzの場合は更にビジーの比率が大きくなります
(ちなみにSDカードはSPIで25MHzくらいまでらしいので、36MHzはかなりのオーバークロックです)

36MHzクロックでは10240バイトの転送に20mSecほどかかりました
およそ520kByte/secといったところです

ロガーでデータを書き込む場合、8KiBくらいのバッファを確保しておいて、6-7kByte程度でカードに書き込みを試行するとして、およそ30ミリ秒もあれば書き込めそうです(理想状態のカードと仮定して)
内部処理をうまくやれば十分現実的な値でしょう
そもそもいままではソフトウェアループで書いていたので、おそらくDMA化して2倍から3倍にはなっていると思います

コレ以上の高速化はSPIを使っている限りほぼ不可能でしょう
あとはバックグラウンド処理で、SDカード周りの専有時間を減らす等ですが さすがにそれは面倒なのでやらないかな。。
SDIOとかも結構面倒な気がするのと とりあえず現状ではSPIアクセスでも十分な速度なため、ちまちまと最適化して完了 という感じになりそうです

0 件のコメント:

コメントを投稿