Blackfin DSP(六):BF533的SPORT接口

1.特性ui

  bf533有兩個SPORT口(synchronous serial Port),即同步串行接口。徹底獨立的接收和發送通道,且每一個通道都具備緩衝,最高速度可達SCLK/2。最大支持32bit字長,可進行硬件u-lawA-law壓縮。結構框圖以下:spa

        

 

2.接口信號說明3d

        

3.串行時鐘T/RCLKcode

  由SPORTx_TCLKDIV和SPORTx_RCLKDIV兩個16位寄存器決定分頻的值,假設系統時鐘爲SCLK,則串行時鐘的計算公式爲:blog

  

例如,SCLK=133MHz,RCLKDIV = 4時,獲得的RCLK freq = 133/(2*(4+1))=13.3MHz。接口

4.幀同步信號T/RFS同步

  幀同步信號的分頻是由SPORTx_TFSDIV和SPORTx_RFSDIV寄存器的值決定的,計算公式以下:it

  

  注意到,幀同步信號的頻率是對串行時鐘頻率的分頻,而不是對系統時鐘SCLK的分頻,所以,在相鄰的兩個幀同步信號之間,有(T/RFSDIV+1)個串行位時鐘,看下圖的說明:class

        

                        圖 1 : require

  所以,我一般並不計算T/RFS信號的頻率,而是把它理解爲Number of transmit clock cycles counted before generatingTFS pulse,該值就等於T/RFSDIV+1.圖中所示TFSDIV = 8,8+1 = 9 > 8所以兩個字節的數據之間有一個bit的無關位。

5. 工做模式

  1)提早幀同步和延遲幀同步

    提早同步模式,幀同步信號比數據早一個串行時鐘週期。

    

  2)有幀模式和無幀模式

    有幀模式:對於每個字,都須要一個幀信號;

    無幀模式:在第一個字傳送後,忽視幀信號,可是幀信號是一直按照咱們的設置繼續產生的,只不過被忽視了;

    

5.程序實例與講解:

1)發送端設置:

void Init_Sport1_TX(int TCLKDIV)
{

    //SPORTx_TCLK frequency = (SCLK frequency)/(2 x (SPORTx_TCLKDIV + 1))
    *pSPORT1_TCLKDIV    =    TCLKDIV;
    //the number of cycles between frame sync pulses
    *pSPORT1_TFSDIV        =    8;
    // driving data with rising edge,late frame sync,active low
    //sync require, inter FS used, internal tclk used
    *pSPORT1_TCR1        =   LATFS|LTFS|TFSR|ITFS| ITCLK;
    // 8 bit word length
    *pSPORT1_TCR2        =    7;
    // 發送使能
     *pSPORT1_TCR1       = (*pSPORT1_TCR1 | TSPEN);
}

按照該程序設置,能夠獲得圖1所示的波形。

2)接收端設置:

通常狀況下,接收端的設置和發送端一致,只不過接收端通常使用發送端的幀同步信號FS和位時鐘SCLK因此配置爲external FS和external SCLK

void Init_Sport1_RX(int RCLKDIV)
{
    //SPORTx_RCLK frequency = (SCLK frequency)/(2 x (SPORTx_RCLKDIV + 1))
    *pSPORT1_RCLKDIV    =    RCLKDIV;
    //the number of cycles between frame sync pulses
    *pSPORT1_RFSDIV        =  8;
    // sync require, external FS used, external rclk used
    *pSPORT1_RCR1        =    LARFS|LRFS|RFSR;
    // 8 bit word length
    *pSPORT1_RCR2        =    7;
    *pSPORT1_RCR1       = (*pSPORT1_RCR1 | RSPEN);//使能SPORT1接收
}

3)發送數據:

 *pSPORT1_TX16 =d;  
while((*pSPORT1_STAT&0x0040)!=0x0040);     /*等待上一次發送完成 */

4)接收數據:

while(!(*pSPORT1_STAT & RXNE));//查看SPI傳輸狀態是否有數據須要接收
i = *pSPORT1_RX16; //讀取數據
相關文章
相關標籤/搜索