マイコン工作実験日記

Microcontroller を用いての工作、実験記録

SPI割り込みではまる

2013-08-08 21:55:24 | SAM4
デジタルフィルターによるBPFは動いたので、LCDへの各バンドの音量表示をおこなっているのですが、画面表示で問題発生。

LCDはSPIで接続していますが、本来は描画しないはずの領域に時たまゴミのように線が入るという症状が発生。SPIへはDMAを使って出力していますが、その終了はSPIのTXEMPTYがセットされたことを割り込みで検出しています。この割り込みの動きがおかしいのではないかと考えて調べてみると、送信回数のおよそ2倍ちかい割り込みが発生しているではありませんか。どういうわけか許可していない条件でも割り込みが発生しているようです。さらに追いかけていくと、この問題はIISCとABDACBを動かしてWT32からのストリームを再生している時に発生するようです。

改めてデータシートでSPIタイミングを確認してみて愕然。SPI2/SPI5の時間が613nsとなっています。これではSPIの送信クロックの最大周波数は1.6MHz程度という計算になります。ほんとにこんなもんなんでしょうか?これまでSAM3Sで使っていたコードを流用していたので、12MHzで動かしてましたよぉ。クロック下げてみると確かにおかしな割り込みの発生頻度は減るようですが、ゼロにはなりません。

無駄な割り込みが発生しているのは気味が悪いので、送信終了の検出にはDMA完了割り込みを使うように変更。ただし、送信DMAが完了しても、それは最後のデータがSPIへ送られたことを示しているだけで、SPIからLCDへの実際の転送はその後発生します。そこで、送信DMA完了を検出したら、さらにTXEMPTYがセットされるのをポーリング待ちしてやります。

考えてみると、SPIのDMAよりもIISCやABDACBのDMAの方が優先度を高く設定していますので、SPIへのDMA送信がタイミングが遅くなる可能性があります。すると、自動的にCSかHighに戻ってしまうかもしれません。ゴミ表示はその影響で発生していたのかもしれません。そこで、SPIの初期化にCSAATを追加してCSをアクティブにしたまま保つことに。



今度は調子良く動いているようなのでSPIクロックを12MHzに戻してみましたが、問題無く動いているようです。