2015年10月19日月曜日

PSoC 4でSPI Masterコンポーネントを使う MCP4922編

結論として、SPI MasterコンポーネントはSCBコンポーネントより高速に動作させることができた。

ブレッドボード図

SCBモードと比べてMOSI(オレンジの線)だけがピンの位置が異なっている。

ピン接続表

PSoC Creator TopDesign

SPI Masterコンポーネントのclockに入力したクロック周波数の1/2がSPIのクロックになる。

PSoC Creatorのプロジェクト
https://github.com/ryood/PSoC_SPI_Master_Component_Test/tree/master/PSoC_SPI_Master_Test

出力波形


main.c: メインルーチン

 int main()  
 {  
   CyGlobalIntEnable; /* Enable global interrupts. */  
   SPIM_Start();  
   uint16 i = 0;  
   for(;;)  
   {  
     DACSetVoltage16bit(i);  
     //DACSetVoltage(i);  
     i += 8;  
     if (i == 4096)   
       i = 0;  
   }  
 }  

として、ノコギリ波を出力した。

SPI Master Component
input clock:48MHz(SPI clock: 24MHz)

(2)F: 564.2Hz

MCP4922はMax:20MHzなので仕様外だが、動作した。

SPI Master Component
input clock:24MHz(SPI clock: 12MHz)

(2)F: 431.7Hz

SCB Component
SPI clock: 8MHz(最大)

(2)F: 349.4Hz

タイミング制御なしで連続して出力しているので周波数が高い方が処理速度が速い。

SPI信号


SPI Master Component
input clock:48MHz(SPI clock: 24MHz)

ch1: LDAC ch2: SCLK

(1)T: 3.460us

ch1のHの時間は500ns * 4.5div = 2.25us

「T:」は波形の周期

SPI Master Component
input clock:24MHz(SPI clock: 12MHz)

(1)T: 4.530us

ch1のHの時間は500ns * 6.5div = 3.25us

SCB Component
SPI clock: 8MHz(最大)

(1)T: 4.940us

ch1のHの時間は500ns * 7.4div = 3.7us

ch2はSPIのSCLKだが、間欠的なので「(2)F:」は正確な周波数が表示されていないと思う。

SPIのデータ送信の前後でLDAC(ラッチ)をH/Lしているのでこの間隔がSPI通信の実行時間になる。

SPI Masterコンポーネントの24MHzはMCP4922の方の仕様外なので、12MHzを使うとしても、SCBコンポーネントの8MHzより速い。

サンプリング区間との比較

サンプリング周波数を48,000Hzにすると
1 / 48,000Hz = だいたい20.83us
20.83us - 3.25us = 17.58us
なので、このスキマ時間で波形生成の演算+αをやらないといけないようだ。

前回「PSoC 4 Pioneer Kitでリズムマシンのプログラムの処理時間を計測」で一番早い結果を見ると、「Releseモードでコンパイル」で0.332sだったので
0.332s / 48,000 = だいたい6.7us
なのでなんとかいけるかな?

メモ:


  • 足りなかたらサンプリング周波数を32,000Hzに落とす。あるいは仕様を無視してSPIのSCLKを24MHzでやる。
  • SPI MasterコンポーネントはMOSI、MISOをまとめて3Wireでやるモードもあるので配線の具合では試してみる。
  • PSoC 4にはDMAがない。なのでSPI MasterのExampleプロジェクトはやれなかった。DMAが使えればもうちょっとCPU時間を節約できるかも?やっぱそろそろPSoC 5LPも使っていこうか