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