文章目錄
SPI總線詳解
一、SPI簡介
SPI英文全稱(Serial Perripheral Interface),即串行外圍設備接口,是一種同步全雙工串行接口,MCU可以通過SPI方式與各種外圍設備進行高速數據通信
二、SPI協議
2.1 軟件協議
SPI是四線通訊協議,有4條邏輯線,這四根線功能如下:
連線 | 功能 |
---|---|
CS | 用於 Master 設備片選 Slave設備, 使被選中的 Slave 設備能夠被 Master 設備所訪問 |
SCK | 主要的作用是 Master 設備往 Slave 設備傳輸時鍾信號, 控制數據交換的時機以及速率 |
MISO | Master Out Slave Input 主機輸入數據,從機輸出數據 |
MOSI | Master InputSlave Out 主機輸出數據,從機輸入數據 |
4線SPI進行通訊時首先拉低CS片選信號選中目標從機,因為SPI可以進行多機通訊,然后SCK要產生連續的脈沖信號,在每個SCK信號的邊沿,MISO線上的數據(高電平為1,低電平為0,電平由Slave控制)傳輸到主機Master,而MOSI線上的數據(高電平為1,低電平為0,電平由Master控制)傳輸到從機Slave,參考協議圖如下:CS拉低后,在SCK邊沿MISO發送1到主機,MOSI發送0到從機
以上就是SPI通訊大致流程,除此之外SPI通訊協議根據SCK空閑電平的高低和時鍾脈沖的第一個邊沿還是第二個邊沿傳數據可以分為4種,四種模式我列在下表:
模式 | 特點 |
---|---|
模式1 | SCK空閑電平為低電平,數據傳輸在SCK的第一個邊沿 |
模式2 | SCK空閑電平為低電平,數據傳輸在SCK的第二個邊沿 |
模式3 | SCK空閑電平為高電平,數據傳輸在SCK的第一個邊沿 |
模式4 | SCK空閑電平為高電平,數據傳輸在SCK的第二個邊沿 |
2.2 硬件SPI
SPI通訊一般是基於硬件SPI收發器進行通訊的,主機和從機間都有一個SPI收發器,收發器的簡圖如下:
簡圖上主要描述了3個寄存器類別:
寄存器 | 功能 |
---|---|
SSPBUF(Synchronous Serial Port Buffer) | 指SPI設備里面的內部緩沖區, 一般以FIFO(先進先出)方式臨時存儲數據 |
SSPSR(Synchronous Serial Port Register) | 指SPI 設備里面的移位寄存器(Shift Regitser),它的作用是根據設置好的位寬把數據移入或者移出SSPBUF |
Controller | 指控制寄存器組,配置SPI總線的傳輸模式 |
使用流程: 用戶配置控制寄存器組,裝載數據到SSPBUF緩沖區,拉低CS,啟動SCK電平后,在SCK產生邊沿信號是,通過移位寄存器將0/1信號傳輸到主機或者從機,硬件SPI通訊用戶只需要配置速率,位寬,拉低片選傳入數據就行,具體的協議傳輸過程則有收發器自己完成,減少CPU的負擔,傳輸穩定且方便,缺點就是需要借助硬件資源,成本較高
2.3 軟件SPI
SPI的實現除了通過硬件SPI來實現,也可以通過軟件SPI進行實現,軟件SPI就是用IO口模擬SPI端口的協議,這總方向代碼編寫比較麻煩,但是對硬件資源要求不高,可擴展性強
如果要編寫軟件SPI代碼可以參考這篇文章: 軟件模擬SPI接口程序代碼(4種模式)
三、SPI協議特點
3.1 采用主- 從控制模式
兩個SPI 設備之間通信必須由主設備 (Master) 來控制從設備(Slave),一個 Master 設備可以通過提供 SCK信號進而控制是否數據傳輸,並且在多從機控制時,與IIC通過地址選擇從機不同,SPI協議使用片選CS對 Slave 設備進行選擇,達到多從機選擇通信的目的
3.2 同步通信
SPI通信方式屬於同步通信,首先了解一下同步和異步通信區別
-
同步通信: 同步通信是一種連續串行傳送數據的通信方式,一次通信只傳送一幀信息,在沒有信息要傳輸時,要填上空字符進行傳輸,而不是選擇停止通信,因為同步傳輸不允許有間隙
-
異步通信: 異步通信在發送字符時,所發送的字符之間的時間間隔可以是任意的,因為每一個字符的開始和結束的地方都有設置標志位,即加上開始位和停止位,以便使接收端能夠正確地將每一個字符接收下來
參考文章:同步通信與異步通信區別
3.3 全雙工通信
SPI通信時是全雙工通信,雙工指的是主機與從機可以進行雙向通信,全雙工指雙向通信可以同時進行,半雙工指的是雙向通信不能同時進行,以其他方式比如一發一回的形式進行,此處SPI通信在每個時鍾邊沿到來時進行了雙向數據交換,交換是同時進行的,所以SPI是全雙工、而IIC通信不能同時進行雙向通信,所以他是半雙工通信