1.特性
bf533有兩個SPORT口(synchronous serial Port),即同步串行接口。完全獨立的接收和發送通道,且每個通道都具有緩沖,最高速度可達SCLK/2。最大支持32bit字長,可進行硬件u-law和A-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; //讀取數據
