2017年6月8日木曜日

【raspberry pi】 SPIの波形はどうなってるの?(3) 転送レート測定

今回は、SPIを動かしてみて、転送レートを測定してみたというハナシなのですが、最近書いたいくつかの記事と関連しているんです.

まず最初は、こちらの記事です.
【にわかAVマニアの二匹目のどじょう】セットトップボックス A95X R1+5.1chデコーダ+PAM8610 試用レポ
この記事にて、5.1chデコーダーのDACの写真を載せました.これは確かTIの既知のICですから、このピンから5.1ch音声データを取り出せるはずです.レートは600kB/sぐらいです.
取り出した音声データをデジタル信号処理して、イコライジングだとか音場補正システムを自作したいと思っています.昔からやりたかったんです.

それで、デジタル信号処理はラズパイでやらせりゃいいかなと思います.だとすると、5.1chデコーダからラズパイへデジタルデータを注入してやらなくちゃいけません.それで調査した経緯を書いたのがコチラの記事だったのです.
【rapsberry pi】 外部データストリームをDMAでメモリへ展開したいんだが
調査結果としては、選択肢はSPIであろうが、SPIにはフロー制御が無いので難しいぞという結果になりました.

ラズパイのSPIの動作モードを知りたくて、オシロで観測したのがこちらの記事でした.
【raspberry pi】 SPIの波形はどうなってるの?(1)
【raspberry pi】 SPIの波形はどうなってるの?(2)

------
今回はSPIの転送レートを実測してみました.

使ったラズパイマシンは以前HDMIモニタを製作したこちらのPCです.
液晶の裏面の右下のがFPGAボードで、SPI slave回路を載せてあります.
FPGAに実装したSPI slaveには、次の機能を持たせます.
・50kHzで16bit 6chのインクリメンタルデータ生成.50k*2*6=600kB/S
・FIFOはdualportで、入力は16bit6ch、出力はSPI slaveである
・FIFOサイズは、97bit*512word =約4kB
・16bit 6ch=96bitだが、FIFO fullフラグを1bit追加して97bit幅にしてある
・FIFOサイズが512wordなのでおよそ10mS分しかバッファできないため、SPI slaveが10mS以内にFIFOを空にしてくれないとover flowしてしまう
・SPI slaveがPCから0x01を受信すると、SPI slaveはfull/emptyフラグをPCへ返す (擬似フロー制御のカラクリ)
・SPI slaveがPCから0x00を受信すると、SPI slaveは16bit 6chを順次PCへ返す

ラズパイ上で動くソフトの機能は、
・SPIライブラリはとりあえずwiringPiを使った
・wiringPiのAPIの制限と思われるが、最大バッファサイズ=4kBらしい
・SPI_SCLK=20MHzで動かす
・13バイトに1回0x01を送信することで、FIFOのfull/emptyを調査し、擬似フロー制御と成す (fullなら失敗、emptyなら破棄)
・main loopは4kBYTE転送の無限loopである.loopにdelay()を入れておく
・転送レートを計算する

以上のカラクリにより、FIFOがoverflowしない速度でラズパイのmain loopが動けば成功と定義します.具体的には、
SPI転送時間(4KB) + いろいろなoverhead + delay() < 10mSec
が成功の条件でしょう.

-----
転送レートの測定結果

loopに挿入したdelay(xx)のxxをパラメータとして転送レートをメモりました.
 delay    rate       FIFO status
 10mS    316kB/S    overflowしている  NG
 8mS     375kB/S    overflowしている  NG
 7mS     413kB/S    overflowしている  NG
 6mS     458kB/S    overflowしている  NG
 5mS     510kB/S    overflowしている  NG
 4mS     588kB/S    overflowしている  NG
 3mS     630kB/S    overflowなし、emptyあり   OK
 2mS     542kB/S    overflowなし、emptyあり   OK
 1mS     414kB/S    overflowなし、emptyあり   OK

・合格ラインはdelay()を3mSec以下にしてようやくoverflowが止まりました.意外に余裕が少ない印象です.
・20Mbpsで4kB=32kbit転送に要する期間は計算上1.6mSに過ぎません.さらにdelay 3msですから、いろいろなoverheadで半分以上喰っていると推測されます.
・delay 3msのときの転送レートは630kB/Sで最大でした.650じゃない理由は追求不足です.
・delay 2msや1msで転送レートが劣化したのは不思議ですが、loopのoverheadを省みず忙しなく読みに行き過ぎる上に、empty=空読みが増えてグダグダになってしまった結果と思われます.


今後は、main loopをDMAだのスレッドだのにしなくちゃいけないと思います.それじゃないと6ch分の畳み込み演算をしてる暇がない気がします.

かしこ

0 件のコメント:

コメントを投稿