2015年12月22日火曜日

STM32F1のSPIをDMAで双方向

STM32F1のSPI1を分周比2(バスクロック36MHz)で双方向通信した時のキャプチャです。



2バイトか3バイト程度を送ったところで少し隙間が空いてしまいます。これはDMAの帯域が足りないために、転送に遅延が発生していると推測できます。

F1のSPIはDMA1_3にTXが、DMA1_2にRXが設定されており、双方向で通信する場合にはDMA1の2chを使用することになります。36Mbit/secは4.5Mbyte/secですから、それが双方向で9Mbyte/secとなります。
一方、DMAは1転送に8クロック必要らしいので、72MHz動作では9Mbyte/secが限界となります。あれ、帯域足りてるじゃん。

おそらく1chだけを転送する場合は9Mbyte/secがフルに出るのですが、複数の転送を行う場合は次のデータを選ぶための比較が発生するためにフルで使用することができないのでしょう。

気になるデータの取りこぼしですが、先に書いたとおりSPIのTXが3、RXが2で、DMAは数字の小さいほうが優先されますから、受信のほうが優先度が高くなります。そのため受信データが転送されていない場合は送信が一時的に停止されるはずです。

ということで、「SPIをDMA転送したらきっちりSPI帯域使い切れるぜ!」と思ったらDMAの帯域が足りないというオチでした。それでもソフトウェアでフラグをポーリングして1バイトずつ送るよりは早いんですが。
もちろん送信だけの一方向通信なら受信データを読む必要はありませんから、SDカードへデータを書く場合は帯域をフルに使えます。バス速度的には 書き込み速度>読み込み速度 というちょっと不思議な感じになりそうです。

0 件のコメント:

コメントを投稿