由主設備產生,是門控的,即只在傳輸期間有效,在沒有數據操做時,是無脈衝波形的。在一個邊沿輸出數據、另外一個邊緣採樣數據。編程
雙向數據引腳,方向取決於設備是主設備仍是從設備。測試
做爲從機時的片選信號;ui
PFx:做爲主機時的設備選擇信號。spa
4. 時鐘的極性與相位問題:3d
這裏的設置要取決於咱們所採用的設備的SPI接口模式,假如設備是上升沿採樣,降低沿輸出,空閒時間爲高電平,則對應的DSP設置爲:CPOL = 1, CPHA = 1,即模式4.code
5. 時鐘頻率問題:blog
時鐘頻率是由SPI_BAUD register決定的,計算方法爲:接口
SCK = SCLK/(2*SPI_BAUD);ci
假設咱們SCLK = 120MH,SPI_BAUD = 4,則SCK = 15M,即SPI的波特率爲15MHz。input
6.其它寄存器的設置
其它寄存器的設置按照寄存器的手冊相關位的說明便可,須要解釋的是SPI_CTL中TIMOD位的設置。
從時鐘SCK與數據的關係波形中注意到,在8個時鐘週期中,能夠同時發送一個字節的數據,同時採樣一個字節的數據。本例程中設置爲01,也就是發起傳輸是由向SPI_TDBR寄存器中寫數據致使的。那接受數據時如何發起SCLK呢?答案是要在讀SPI_RDBR以前,發送一個字節的數,這個數發送完成的同時,採樣也結束了。所以:
所以(這裏爲16位操做):
7.具體的代碼:
void init_spi(void) { *pSPI_BAUD=4; //配置速率爲1/4系統時鐘 SPI速率 = SCLK/2*SPI_BAUD *pSPI_FLG |=FLS2; //選擇SPISEL2接口做爲slave選擇引腳 //enable spi,master mode,MSB first,16 bit transfer //CPOL,CPHA(slave select pin controlled by software) //start transfer with write of SPI_TDBR *pSPI_CTL = SPE|MSTR|CPHA|CPOL|SIZE|0x0001; } uint16_t spi_send_read_data(uint16_t data) { uint16_t i; *pSPI_FLG &= ~FLG2; //將SPISEL2拉到0 *pSPI_TDBR = data; //將數據送入SPI傳輸數據寄存器 while(*pSPI_STAT & TXS); //查看SPI傳輸狀態是否完成,用示波器測試要花費一個CLK週期; //讀過程 while(!(*pSPI_STAT & RXS));//查看SPI傳輸狀態是否有數據須要接收 i = *pSPI_RDBR; //讀取數據 *pSPI_FLG |= FLG2; //將SPISEL2拉到1,完成數據傳輸 return i; }