【STM32筆記5】SPI的時序解讀與硬件運用(即硬件SPI的實現,另有硬件SPI和軟件SPI的差異說明)

一、SPI簡介

1、SPI(Serial Peripheral Interfac)即串行外圍設備接口,標準SPI總線由四根線組成:串行時鐘線(SCLK)、主機輸入/從機輸出線(MISO)、主機輸出/從機輸入線(MOSI)和片選信號(CS)。SPI是一種高速的,全雙工,同步的通信總線,並且在芯片的管腳上只佔用四根線,節約了芯片的管腳,同時爲PCB的佈局上節省空間,提供方便,主要應用在EEPROM,FLASH,實時時鐘,AD轉換器,還有數字信號處理器和數字信號解碼器之間。

SPI允許芯片與外部設備以半/全雙工、同步、串行方式通信。此接口可以被配置成主模式,併爲外部從設備提供通信時鐘(SCLK)。接口還能以多主配置方式工作。 它可用於多種用途,包括使用一條雙向數據線的雙線單工同步傳輸,還可使用CRC校驗的可靠通信。

2、內部結構圖

注:

MOSI腳相互連接,MISO腳相互連接。這樣,數據在主和從之間串行地傳輸(MSB位在前)。 通信總是由主設備發起。主設備通過MOSI腳把數據發送給從設備,從設備通過MISO引腳回傳數據。這意味全雙工通信的數據輸出和數據輸入是用同一個時鐘信號同步的;時鐘信號由主設備通過SCLK腳提供。  

SPI接口一般使用4條線通信:

(1)MISO: 主設備數據輸入,從設備數據輸出

(2)MOSI :主設備數據輸出,從設備數據輸入

(3)SCLK:時鐘信號,由主設備產生

(4)CS:從設備片選信號,由主設備控制

3、SPI工作原理總結

(1)硬件上爲4根線。
(2)主機和從機都有一個串行移位寄存器,主機通過向它的SPI串行寄存器寫入一個字節來發起一次傳輸。
(3)串行移位寄存器通過MOSI信號線將字節傳送給從機,從機也將自己的串行移位寄存器中的內容通過MISO信號線返回給主機。所以兩個移位寄存器中的內容就被交換。
(4)外設的寫操作和讀操作是同步完成的。如果只進行寫操作,主機只需忽略接收到的字節;反之,若主機要讀取從機的一個字節,就必須發送一個空字節來引發從機的傳輸。

二、SPI總線數據傳輸時的時序圖(即設備和從設備的SCLK腳、 MISO腳、MOSI腳直接連接的主或從時序圖)

 

時序解讀:

CPOL時鐘極性和CPHA時鐘相位的組合選擇數據捕捉的時鐘邊沿。故SPI_CR寄存器的CPOL和CPHA位,能夠組合成四種可能的時序關係,如上圖所示。CPOL(時鐘極性)位控制在沒有數據傳輸時時鐘的空閒狀態電平,此位對主模式和從模式下的設備都有效。如果CPOL被清'0',SCLK引腳在空閒狀態保持低電平;如果CPOL被置'1',SCLK引腳在空閒狀態保持高電平。如果CPHA(時鐘相位)位被置'1',SCLK時鐘的第二個邊沿(CPOL位爲0時就是下降沿,CPOL位爲'1'時就是上升沿)進行數據位的採樣,數據在第二個時鐘邊沿被鎖存。如果CPHA位被清'0',SCLK時鐘的第一邊沿(CPOL位爲'0'時就是下降沿,CPOL位爲'1'時就是上升沿)進行數據位採樣,數據在第一個時鐘邊沿被鎖存。故數據輸出通過SDO線,數據在時鐘上沿或下沿時改變,在緊接着的下沿或上沿被讀取。完成一位數據傳輸,輸入也使用同樣原理。這樣,在至少8次時鐘信號的改變(上沿和下沿爲一次),就可以完成8位數據的傳輸。

SCLK信號線只由主設備控制,從設備不能控制信號線。同樣,在一個基於SPI的設備中,至少有一個主控設備。這樣的傳輸方式有一個優點,與普通的串行通訊不同,普通的串行通訊一次連續傳送至少8位數據,而SPI允許數據一位一位的傳送,甚至允許暫停,因爲SCLK時鐘線由主控設備控制,當沒有時鐘跳變時,從設備不採集或傳送數據。即主設備通過對SCLK時鐘線的控制可以完成對通訊的控制。需要注意的是,不同的SPI設備的實現方式不盡相同,主要是數據改變和採集的時間不同,在時鐘信號上沿或下沿採集有不同定義。

注: 

(1)在改變 CPOL/CPHA 位之前,必須清除SPE位將 SPI 禁止。
(2)主和從必須配置成相同的時序模式。
(3)SCLK 的空閒狀態必須和 SPI_CR1 寄存器指定的極性一致 (CPOL爲'1'時,空閒時應上拉 SCLK 爲高電平;CPOL爲'0'時,空閒時應下拉 SCLK 爲低電平 ) 。
(4)數據幀格式 (8 位或 16 位 ) 由 SPI_CR1 寄存器的DFF位選擇,並且決定發送 / 接收的數據長度。

下面以STM32FI的SPI2爲例,分別進行初始化(參數配置)、SPI速度設置(如1、8、16、256分頻)、讀寫一個字節功能的實現,其代碼實現參考如下三張圖:

1、SPI2的初始化

2、SPI速度設置函數

3、讀寫一個字節功能函數

另:

軟件SPI:用IO模擬SPI時序,這個模擬過程全部是CPU在負責執行,爲了知穩定得存取數據,你可能會插入軟件延時,這個時間在讀取數據量不大的情況下並不明顯,但是基本上你在讀取過程中,其他非中斷非異常程序是無法得到執行。
硬件SPI:首先這個數據存道儲的過程是不需要CPU參與得,程序中配置好SPI的訪問時序,開啓中斷,CPU就可以在中斷函數中搬移數據,省下了軟件模擬IO得存取時間。
仔細研究就會發現,CPU在進行SPI中斷服務程序還版是需要耽誤時間得,這個過程在大數據量傳輸中還是很耗時,ARM中Cortex-M3內核得處理器在硬件SPI上加入了DMA,這個DMA直接從SPI的數據寄存器,軟件配置好DMA之後,基本上整個傳輸都不要權CPU參與,軟件設計得好的話,整個數據傳輸都不要CPU參與,此時CPU就可以做更多其他有意義的事了。

附:此文爲本人經STM32實戰後總結所得,歡迎大家參考指點,謝謝。

 

 

 

 

 


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章