1、SPI協議簡介
1.1、SPI接口
SPI 協議是由摩托羅拉公司提出的通訊協議(Serial Peripheral Interface),即串行外圍設備接口,是一種高速全雙工的通信總線。SPI(Serial Peripheral Interface--串行外設接口)總線系統是一種同步串行外設接口,它可以使MCU與各種外圍設備以串行方式進行通信以交換信息。SPI總線可直接與各個廠家生產的多種標准外圍器件相連,包括FLASHRAM、網絡控制器、LCD顯示驅動器、A/D轉換器和MCU等。該接口一般使用4條線:串行時鍾線(SCLK)、主機輸入/從機輸出數據線MISO、主機輸出/從機輸入數據線MOSI和低電平有效的從機選擇線NSS。
1.2、應用
SPI接口的全稱是"Serial Peripheral Interface",意為串行外圍接口,是Motorola首先在其MC68HCXX系列處理器上定義的。SPI接口主要應用在EEPROM、FLASH、實時時鍾、AD轉換器, ADC、 LCD 等設備與 MCU 間,還有數字信號處理器和數字信號解碼器之間,要求通訊速率較高的場合。
SPI接口是在CPU和外圍低速器件之間進行同步串行數據傳輸,在主器件的移位脈沖下,數據按位傳輸,高位在前,低位在后,為全雙工通信,數據傳輸速度總體來說比I2C總線要快,速度可達到幾Mbps。
1.3、接口信號
(1)MOSI – 主器件數據輸出,從器件數據輸入
(2)MISO – 主器件數據輸入,從器件數據輸出
(3)SCLK –時鍾信號,由主器件產生,最大為fPCLK/2,從模式頻率最大為fCPU/2
(4)NSS – 從器件使能信號,由主器件控制,有的IC會標注為CS(Chip select)
在點對點的通信中,SPI接口不需要進行尋址操作,且為全雙工通信,顯得簡單高效。在多個從器件的系統中,每個從器件需要獨立的使能信號,硬件上比I2C系統要稍微復雜一些。
SPI接口在內部硬件實際上是兩個簡單的移位寄存器,傳輸的數據為8位,在主器件產生的從器件使能信號和移位脈沖下,按位傳輸,高位在前,低位在后。如下圖所示,在SCLK的上升沿上數據改變,同時一位數據被存入移位寄存器。
2、SPI通訊詳解
2.1 、SPI 物理層
SPI 通訊設備之間的常用連接方式見下圖:
SPI 通訊使用 3 條總線及片選線, 3 條總線分別為 SCK、 MOSI、 MISO,片選線為/S,它們的作用介紹如下:
(1) /S/S( Slave Select):從設備選擇信號線,常稱為片選信號線,也稱為 NSS、 CS,以下用 NSS 表示。 當有多個 SPI 從設備與 SPI 主機相連時,設備的其它信號線 SCK、MOSI 及 MISO 同時並聯到相同的 SPI 總線上,即無論有多少個從設備,都共同只使用這 3 條總線;而每個從設備都有獨立的這一條 NSS 信號線,本信號線獨占主機的一個引腳,即有多少個從設備,就有多少條片選信號線。 I2C 協議中通過設備地址來尋址、選中總線上的某個設備並與其進行通訊;而 SPI 協議中沒有設備地址,它使用 NSS 信號線來尋址,當主機要選擇從設備時,把該從設備的 NSS 信號線設置為低電平,該從設備即被選中,即片選有效,接着主機開始與被選中的從設備進行 SPI 通訊。所以SPI 通訊以 NSS 線置低電平為開始信號,以 NSS 線被拉高作為結束信號。
(2) SCK (Serial Clock): 時鍾信號線,用於通訊數據同步。它由通訊主機產生,決定了通訊的速率,不同的設備支持的最高時鍾頻率不一樣,如 STM32 的 SPI 時鍾頻率最大為fpclk/2,兩個設備之間通訊時,通訊速率受限於低速設備。
(3) MOSI (Master Output, Slave Input): 主設備輸出/從設備輸入引腳。主機的數據從這條信號線輸出,從機由這條信號線讀入主機發送的數據,即這條線上數據的方向為主機到從機。
(4) MISO(Master Input,, Slave Output): 主設備輸入/從設備輸出引腳。主機從這條信號線讀入數據,從機的數據由這條信號線輸出到主機,即在這條線上數據的方向為從機到主機。
2.2 、協議層
與 I2C 的類似, SPI 協議定義了通訊的起始和停止信號、數據有效性、時鍾同步等環節。
(1)、SPI 基本通訊過程
先看看 SPI 通訊的通訊時序,見下圖:
這是一個主機的通訊時序。 NSS、 SCK、 MOSI 信號都由主機控制產生,而 MISO 的信號由從機產生,主機通過該信號線讀取從機的數據。 MOSI 與 MISO 的信號只在 NSS 為低電平的時候才有效,在 SCK 的每個時鍾周期 MOSI 和 MISO 傳輸一位數據。
(2)、通訊的起始和停止信號
在圖中的標號1處,NSS 信號線由高變低,是 SPI 通訊的起始信號。 NSS 是每個從機各自獨占的信號線,當從機檢在自己的 NSS 線檢測到起始信號后,就知道自己被主機選中了,開始准備與主機通訊。在圖中的標號處, NSS 信號由低變高,是 SPI 通訊的停止信號,表示本次通訊結束,從機的選中狀態被取消。
(3)、數據有效性
SPI 使用 MOSI 及 MISO 信號線來傳輸數據,使用 SCK 信號線進行數據同步。 MOSI及 MISO 數據線在 SCK 的每個時鍾周期傳輸一位數據,且數據輸入輸出是同時進行的。數據傳輸時, MSB 先行(高位先行)或 LSB(低位先行)先行並沒有作硬性規定,但要保證兩個 SPI 通訊設備之間使用同樣的協定,一般都會采用上圖中的 MSB 先行(高位先行)模式。
觀察圖中的2345標號處, MOSI 及 MISO 的數據在 SCK 的上升沿期間變化輸出,在 SCK 的下降沿時被采樣。即在 SCK 的下降沿時刻, MOSI 及 MISO 的數據有效,高電平時表示數據“1”,為低電平時表示數據“0”。在其它時刻,數據無效, MOSI 及 MISO為下一次表示數據做准備。
SPI 每次數據傳輸可以 8 位或 16 位為單位,每次傳輸的單位數不受限制。
(4)、 CPOL(時鍾極性)/CPHA(時鍾相位)及通訊模式
上面講述的圖中的時序只是 SPI 中的其中一種通訊模式, SPI 一共有四種通訊模式,它們的主要區別是總線空閑時 SCK 的時鍾狀態以及數據采樣時刻。為方便說明,在此引入“時鍾極性CPOL”和“時鍾相位 CPHA”的概念。
時鍾極性 CPOL 是指 SPI 通訊設備處於空閑狀態時, SCK 信號線的電平信號(即 SPI 通訊開始前、 NSS 線為高電平時 SCK 的狀態)。 CPOL=0 時, SCK 在空閑狀態時為低電平,CPOL=1 時,則相反。
時鍾相位 CPHA 是指數據的采樣的時刻,當 CPHA=0 時, MOSI 或 MISO 數據線上的信號將會在 SCK 時鍾線的“奇數邊沿” 被采樣。當 CPHA=1 時,數據線在 SCK 的“偶數邊沿” 采樣。見下圖:
CPHA=0 時的 SPI 通訊模式
我們來分析這個 CPHA=0 的時序圖。首先,根據 SCK 在空閑狀態時的電平,分為兩種情況。 SCK 信號線在空閑狀態為低電平時, CPOL=0;空閑狀態為高電平時, CPOL=1。
無論 CPOL=0 還是=1,因為我們配置的時鍾相位 CPHA=0,在圖中可以看到, 采樣時刻都是在 SCK 的奇數邊沿。注意當 CPOL=0 的時候,時鍾的奇數邊沿是上升沿,而CPOL=1 的時候,時鍾的奇數邊沿是下降沿。所以 SPI 的采樣時刻不是由上升/下降沿決定的。 MOSI 和 MISO 數據線的有效信號在 SCK 的奇數邊沿保持不變,數據信號將在 SCK 奇數邊沿時被采樣,在非采樣時刻, MOSI 和 MISO 的有效信號才發生切換。
類似地,當 CPHA=1 時,不受 CPOL 的影響,數據信號在 SCK 的偶數邊沿被采樣,見下圖:
CPHA=1 時的 SPI 通訊模式
由 CPOL 及 CPHA 的不同狀態, SPI 分成了四種模式,見下表,主機與從機需要工作在相同的模式下才可以正常通訊,實際中采用較多的是“模式 0”與“模式 3”
SPI的4種模式