2015年11月23日月曜日

PSoC 5LPでSPI DAC(MCP4922)を動かす。

PSoC 4とPSoC 5LPでは使えるSPIのコンポーネントが違うので簡単にテスト。

ボードは「基板付き体験編 ARM PSoCで作るMyスペシャル・マイコン」の付属基板を使った。

ブレッドボード図



PSoC Creator Top Design


PSoC Creator ピンアサイン


<main.c>

 #include <project.h>  
 #define TX_DATA_SIZE  (2u)  
 int main()  
 {  
   uint8 txBuffer[TX_DATA_SIZE];  
   CyGlobalIntEnable; /* Enable global interrupts. */  
   SPIM_Start();  
   for(;;)  
   {  
     uint16 i;  
     for (i = 0; i < 4096; i++) {  
       // Highバイト(0x30=OUTA/BUFなし/1x/シャットダウンなし)   
       txBuffer[0] = ((i >> 8) & 0x0f) | 0x30;  
       txBuffer[1] = i & 0x00ff;   
       Pin_LDAC_Write(1u);  
       SPIM_PutArray(txBuffer, TX_DATA_SIZE);  
       while (0u == (SPIM_ReadTxStatus() & SPIM_STS_SPI_DONE)) {  
         // wait  
       }  
       Pin_LDAC_Write(0u);  
       CyDelay(1u);  
     }  
   }  
 }  

1usのサンプリング間隔でノコギリ波を出力させている。

出力波形


24MHz駆動、 SPI Data Rate 4MHz


まずは基本的なスペックで動作させてみた。


ch1:MOSI ch2:SCLK


ch1:CS ch2:SCLK


ch1:LDAC ch2:SCLK

LDACはプログラムで出力しているので、SPI通信の処理時間はコミコミで6.960us。
while (0u == (SPIM_ReadTxStatus() & SPIM_STS_SPI_DONE)) {
    //wait
}
と、SPI通信が完了するまでWaitしているが、この処理を取り除くと


ch1:LDAC ch2:SCLK

SPI通信が終わる前にLDACがLに落ちている。←これではダメなので待ち処理は必要だ。


60MHz駆動、 SPI Data Rate 20MHz


MCP4922は仕様では20MHzまで動作するのでSPI Clockを上げてみた。

PSoC 5LPのMaster Clockは以下のとおり設定。



ch1:MOSI ch2:SCLK

SCLKの周波数は、表示では「(2)15.03MHz」となっている。波形数えてみても5区間で波形8個なので
100ns * 5 / 8 = 62.5ns
1 / 62.5ns = 16MHz
SPI Masterコンポーネントでは20MHzに設定しているので謎。


ch1:CS ch2:SCLK


ch1:LDAC ch2:SCLK

SPI通信にかかる時間を2.412us(だいたい414.6kHz)まで減らせた。