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