SPI(Serial Peripheral Interface)總線是一種高速、串行、全雙工通信總線,由Motorola公司設計並推廣。
優點是支持全雙工通信,傳輸速率快,SCLK時鍾頻率最高可以達到50MHz左右。
缺點是沒有流控制機制,不像I2C有應答機制,也不像UART有數據幀校驗機制。
總線引腳
SPI總線以主從方式工作,支持多主多從、單主多從、單主單從模式,擁有四個信號線:
MISO – Master Input Slave Output,主設備數據輸入,從設備數據輸出;
MOSI – Master Output Slave Input,主設備數據輸出,從設備數據輸入;
SCLK – Serial Clock,時鍾信號,由主設備產生;
需要注意的是,SCLK只有在數據傳輸的過程中產生時鍾周期,不進行數據傳輸時保持高電平或者低電平;
CS – Chip Select,從設備使能信號,由主設備控制。
其中CS信號線主要用於片選,實際通信使用MISO/MOSI/SCLK三根信號線。
單主單從模式如下:
單主多從模式如下:(每個SPI設備由一根獨立的CS片選信號進行片選)
總線時序
根據CPOL(時鍾極性)和CPHA(時鍾相位)的組合區分,SPI總線時序有四種模式。SPI通信的雙方必須同時工作在其中一種模式下,往往是主控制器匹配SPI設備的工作模式。
Mode0:CPOL=0,CPHA=0
Mode1:CPOL=0,CPHA=1
Mode2:CPOL=1,CPHA=0
Mode3:CPOL=1,CPHA=1
其中SPI 0和SPI 3兩種模式最常用。
CPOL用來控制SCLK信號的Active狀態是高電平還是低電平。
0 - SCLK高電平為Active狀態
1 - SCLK低電平為Active狀態
CPHA用來控制MOSI和MISO在第幾個SCLK邊沿進行數據采樣。
0 - 第一個SCLK邊沿采樣,第二個邊沿發送
1 - 第一個SCLK邊沿發送,第二個邊沿采樣
總結:
SPI總線協議本身並不復雜,這就意味着復雜性在SPI設備驅動的軟件編碼上,具體體現在:
1)SPI總線協議沒有數據校驗機制,因此,必須根據SPI設備支持的SCLK時鍾頻率范圍設置SPI時鍾頻率,實際應用中,可能會碰到示波器量時序信號沒問題,但是SPI設備不回復數據或者回復數據錯誤的情況,大概率就是因為時鍾頻率不滿足SPI設備要求導致的;
2)SPI控制器的發送是直接將數據寫入一個移位寄存器中,該移位寄存器跟隨SCLK時鍾發送數據;SPI控制器的接收與發送同步進行,也就是說發送數據的同時,也在接收數據,而接收數據是寫入一個緩存寄存器中,如果緩存寄存器的值不及時讀取的話,后續接收的數據會直接丟棄而不是覆蓋到該緩存寄存器中,因此,每一次寫數據之后,一定要讀取數據,即使讀取的數據無意義。
3)SPI設備往往不會主動發送數據,而是被動應答;而SPI總線只有在主機發送數據的時候才會產生SCLK時鍾周期信號,因此,往往讀數據時,需要主機往SPI總線上發送任意數據;
4)SPI設備往往需要特定的時序進行操作,而不能像RAM一樣隨機讀寫,比如MMC/SDCard;