SPI(中)——通訊過程時序

接上篇:SPI協議(上)——基礎介紹

坦誠地講,SPI通訊過程相比於I2C要簡單很多。

很多初學者有一個疑惑。很多人都說I2C很簡單,但其實學起來並沒有那麼輕鬆的感覺,初次接觸的人還是比較難入門的,需要慢慢消化。

通訊開始

通過控制選定的NSS信號線的電平高低決定通訊的起始與否。

查閱stm32引腳原理圖可知,晶元有提供一個連接到從設備的NSS引腳。但實際中很多常常會在初始化外設時將NSS引腳配置為軟體控制,換言之,就是將NSS引腳當做是一個普通GPIO引腳,而通過控制該引腳的電平狀態來產生起始/停止信號。

即,從設備的NSS引腳電平被置低,則通訊開始,在通訊過程中,NSS保持低電平狀態。NSS信號線電平被拉高則結束通訊。

數據發送

圖17-1

上圖是在SPI工作在主模式、全雙工模式下進行連續傳輸的時序圖。這裡簡單講解下整個的通訊過程。

  1. 把需要發送的數據寫入數據寄存器SPI_DR,該數據會被寫入到發送緩衝區;
  2. SCK開始運行,MOSI線通過移位寄存器把發送緩衝區的數據逐位傳輸。全雙工模式下,發送和接收是同時進行的,此時MISO則把數據一位一位存進接收緩衝區;
  3. 傳輸完成一幀數據後,狀態寄存器SPI_SR的TXE位會被置1,表示發送緩衝區為空,可以再次往SPI_DR寫入數據進行發送;RXNE位也被置1,表示接收緩衝區非空,可以讀取緩衝區數據獲取內容。

需要注意的是,全雙工模式下,接收和發送是同時進行的,即使是只接收數據,也是需要向從設備發送數據,以觸發SCK時鐘的運行,這樣從設備才能向主機發送數據。例如常常通過讀取從設備的ID,以此識別設備,我們就需要向設備發送相應指令以獲取設備ID(可以通過閱讀設備手冊獲得具體指令)。

還有一點很重要,在進行flash的數據寫入前,必須對目標存儲矩陣進行擦除,關於這一點,也會在後續的文章中講解。

-----------------------------------------------------------------------

文章首發於知乎專欄 - stm32,轉載請私信,並註明原文出處。

推薦閱讀:

Sound of silence: 數據傳輸的小眾黑科技
DMA數據傳輸
可不可以用動態圖像(動態二維碼)傳輸數據,具體怎麼實現?
一台電腦要向n台電腦傳文件,假設傳輸50G給他們,n台電腦可以相互傳輸,一次只能向一台電腦傳,怎麼做?

TAG:通信 | 数据传输 | SPI |