注目の投稿

技術Note一覧

このブログのメインコンテンツである技術Noteの一覧

2017/09/24

altera_spi_core と bcm2835

nios側でspiデータが来るのをポーリングで待つように処理したところ,RPi側からbcm2835_spi_transfern()でデータを送信したときにSPIcoreのROE (Receiver Overrun Error)が立ってしまう.ROEはniosでデータ読み出しする前に,次のspiデータを受信してしまうと発生する.

仕方なくbcm2835_spi_transfer()で1byteずつ送信し,byte間をbcm2835_delayMicroseconds()で埋めた.ある程度delayを増やすと上手く行く.しかし,安定して通信できるのがbcm2835_delayMicroseconds(2000)あたり.これより小さいとうまくいかない.この設定でスマホからRPi→FPGA→サーボを操作すると,体感0.1secくらいのもっさり感がある.



Nios側で1byte受信後の処理に時間をかけすぎと考え,当該処理を高速化したところ,bcm2835_delayMicroseconds(10)まで小さくしてもROEが立たなくなり,サーボのもっさり感は軽減された.

が不満が残る.なぜなら,byte間ウェイトが大きくてかっこ悪いから.本来bcm2835_spi_transfern()でbyte間ウェイト0.4us程度なのに対して,現状bcm2835_delayMicroseconds(10)を挟むことで実質100us程度(関数自体の呼び出しに80us程度かかるとリファレンスにある)かかっている.
理論上は,通信1回あたり50byteと仮定すると,100*50=5000us=5ms程度の遅延だから体感できるほどではないはずだけれども,かっこ悪い.

FIFOで受信データバッファを作ってbcm2835_spi_transfern()を使えるようにしたいが,SPI通信をVHDL実装するところから始めたり色々めんどくさそうなので,とりあえずは今後の課題とする.

また,ポーリングではなく割り込みで受信したらどうなるかも気になる.が,そんなに変わらないような気もするし,ロボコンに向けて作成中のプログラム構造も変わるので保留する.