Blackfin DSP(六):BF533的SPORT接口


1.特性

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

        

 

2.接口信號說明

        

3.串行時鍾T/RCLK

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

  

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

4.幀同步信號T/RFS

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

  

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

        

                        圖 1 : 

  因此,我通常並不計算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; //讀取數據

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM