SPI(Serial Peripheral Interface,串行外設接口)是一種高速、全雙工、同步的串行通信協(xié)議,由摩托羅拉公司于20世紀80年代開發(fā),廣泛應用于短距離設備間的數據傳輸,如微控制器與傳感器、存儲器、顯示屏等外設的通信。其核心優(yōu)勢在于結構簡單、傳輸速度快、支持多設備連接,成為嵌入式系統(tǒng)中最常用的通信協(xié)議之一。
一、SPI的基本硬件結構
SPI協(xié)議的硬件連接采用四線制(部分簡化場景可省略部分線路),核心信號線包括:
SCLK(Serial Clock,串行時鐘):由主設備(Master)產生,用于同步主從設備的數據傳輸,決定通信速率。時鐘頻率可根據設備支持范圍調整,通常在幾MHz到幾十MHz之間。
MOSI(Master Out Slave In,主出從入):主設備向從設備發(fā)送數據的信號線,數據由主設備通過該線路傳輸到從設備。
MISO(Master In Slave Out,主入從出):從設備向主設備返回數據的信號線,數據由從設備通過該線路傳輸到主設備,實現(xiàn)全雙工通信。
SS(Slave Select,從設備選擇):由主設備控制,用于指定當前通信的從設備。SPI支持一主多從架構,每個從設備都有獨立的SS線(或通過譯碼器共享),主設備通過拉低某一從設備的SS線使其進入工作狀態(tài)。
在通信過程中,主設備負責初始化通信并提供時鐘信號,從設備則被動響應主設備的操作。這種“主從模式”確保了通信的有序性,避免多設備競爭總線的問題。
二、SPI的通信原理與時序
SPI的通信基于“同步移位”機制,主設備通過SCLK時鐘信號同步數據的發(fā)送與接收,具體過程如下:
1. 通信初始化
主設備首先拉低目標從設備的SS線,告知該從設備即將進行數據傳輸。此時,未被選中的從設備會忽略SCLK和MOSI信號,僅等待自身SS線被激活。
2. 數據傳輸時序
SPI的數據傳輸以“位”為單位,主設備和從設備通過MOSI和MISO線同時交換數據,實現(xiàn)全雙工通信。其關鍵時序參數包括:
時鐘極性(CPOL):定義SCLK在空閑狀態(tài)(無數據傳輸時)的電平。CPOL=0時,空閑狀態(tài)為低電平;CPOL=1時,空閑狀態(tài)為高電平。
時鐘相位(CPHA):定義數據采樣的時刻。CPHA=0時,數據在SCLK的第一個跳變沿(上升沿或下降沿)被采樣;CPHA=1時,數據在第二個跳變沿被采樣。
通過CPOL和CPHA的組合,SPI支持四種通信模式,不同設備需約定一致的模式才能正常通信。例如,SD卡通常使用模式0(CPOL=0,CPHA=0),而某些傳感器可能使用模式3(CPOL=1,CPHA=1)。
3. 數據幀格式
SPI協(xié)議對數據幀格式(如位數、校驗位等)沒有強制規(guī)定,由主從設備協(xié)商確定,常見的幀長為8位(1字節(jié))。傳輸時,主設備通過移位寄存器將數據逐位發(fā)送到MOSI線,同時從MISO線逐位接收從設備的數據,一次時鐘脈沖完成一位數據的雙向傳輸。例如,主設備發(fā)送0x55(二進制01010101)時,從設備可能同時返回0xAA(二進制10101010),8個時鐘脈沖后完成整字節(jié)的交換。