VS1011eとの通信方法
今回mp3デコーダVS1011との通信はゲートモードを利用しました。
少しトリッキーな方法なので備忘録として記載しておきます。
○VS1011の転送仕様を考える
VS1011とはSPI通信を使用してデータの送信を行うのですが
VS1011側に一方的にデータを送信できる訳ではありません。
DREQというビジー信号を見ながら送信を制御する必要があります。
こういうフロー制御をSPIで行うにはDREQの立ち上がり割込みで
処理するのが王道かと思われますが、
割込みを用いずにハードウェアだけで転送を済ませられればCPUの負荷を減らせます。
○DMAマジ天使
下記に図示します。(右下クリックで拡大)
○転送の流れ
A.DREQがHになりSTM32のタイマ入力へゲート信号として入力される。
B.ゲートが有効になった事でタイマクロックが供給され、アップカウンタが増加する。
C.カウンタのオーバーフローによりメモリ→SPI送信バッファへのDMA転送リクエストが発生し処理される。
D.VS1011へのSPI送信が行われる。
E. A~DをDREQがLになるまで繰り返す。
F.DREQがLになるとタイマクロックの供給が止まる。
G.VS1011の内部処理でバッファに空きが出たらDREQがHになるので、以後A~Gを繰り返す。
この通信方法の条件としては
A.SPI送信バッファへの転送はDMAによって行われる為、送信完了フラグはチェックしていない。
よってカウンタのオーバーフローの間隔はSPI送信処理よりも十分に長くなければいけない。
B.当然、SPIによる転送速度はVS1011のデコード速度よりも早くなければならない。
○データ構造
STM32側のmp3データバッファはリングバッファで実装しています。
まずリングバッファのサイズとDMA(サーキュラーモード)の転送サイズを同じ値に設定します。
そして半分転送完了時及び完全転送完了時に割込みを発生させ、
リングバッファの転送済み部分を半分ずつ詰める事でDMAは常にデータを転送し続けられます。
(秋月300円液晶の時と同じ処理です)
この処理は自分にとってテンプレートのようになってきていますw
○実際の転送仕様
SPI通信速度 :2.25Mbps(1バイトの通信に約5μsec)
カウンタオーバーフロー間隔 :13.8μsec(72kHz)
リングバッファサイズ :4kbyte(この条件では最低2kbyteは必要でした)
STM32は多機能過ぎて戸惑う事も多いですが、
それだけ問題解決の為の手段が多いとも言えるので覚える価値はあると思います。
私は数学やパズルは苦手ですが、
こういう機能をグリグリ組み合わせて問題を解くのは割と楽しいです。