SPI 協定是由摩托羅拉公司提出的通訊協定(Serial PeripheralInterface),即串行外圍裝置接口,是一種高速全雙工的通信總線。它被廣泛地使用在 ADC、 LCD 等裝置與 MCU間,要求通訊速率較高的場合。
SPI總線是一種高速全雙工同步串行通信總線,它可以使CPU與各種外圍裝置以串行方式進行通信以交換資訊。SPI的主要應用領域包括:EEPROM、FLASH、AD轉換器、各種傳感器等裝置通信領域。SPI總線協定在不同的半導體公司的具體實施細節可能有所不同,是以具體的應用還是要參考特定器件的資料手冊。SPI總線支援全雙工通信,而且支援高速應用(100Mbp速率以上)。SPI協定支援的字長不限于8位,可以根據應用的特點靈活選擇消息的字長。在點對點的通信中,SPI協定不需要進行尋址操作,顯得簡單且高效。但是SPI協定并沒有流控制和應答機制,是以在可靠性方面可能較差。
一。 SPI 實體層

SPI 通訊使用 3 條總線及片選線, 3 條總線分别為 SCK、 MOSI、 MISO,片選線為
SS
(1) SS( 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 協定層
1. SPI 基本通訊過程
這是一個主機的通訊時序。 NSS、 SCK、 MOSI 信号都由主機控制産生,而 MISO 的信号由從機産生,主機通過該信号線讀取從機的資料。 MOSI 與 MISO 的信号隻在 NSS 為低電平的時候才有效,在 SCK 的每個時鐘周期 MOSI 和 MISO 傳輸一位資料。
以上通訊流程中包含的各個信号分解如下:
1.1 通訊的起始和停止信号
在圖 25-2 中的标号處, NSS 信号線由高變低,是 SPI 通訊的起始信号。 NSS 是每個從機各自獨占的信号線,當從機在自己的 NSS 線檢測到起始信号後,就知道自己被主機選中了,開始準備與主機通訊。在圖中的标号處, NSS 信号由低變高,是 SPI 通訊的停止信号,表示本次通訊結束,從機的選中狀态被取消。
1.2 資料有效性
SPI 使用 MOSI 及 MISO 信号線來傳輸資料,使用 SCK 信号線進行資料同步。 MOSI及 MISO 資料線在 SCK 的每個時鐘周期傳輸一位資料,且資料輸入輸出是同時進行的。資料傳輸時, MSB 先行或 LSB 先行并沒有作硬性規定,但要保證兩個 SPI 通訊裝置之間使用同樣的協定,一般都會采用圖 25-2 中的 MSB 先行模式。觀察圖中的标号處, MOSI 及 MISO 的資料在 SCK 的上升沿期間變化輸出,在 SCK 的下降沿時被采樣。即在 SCK 的下降沿時刻, MOSI 及 MISO 的資料有效,高電平時表示資料“1”,為低電平時表示資料“0”。在其它時刻,資料無效, MOSI 及 MISO為下一次表示資料做準備。
SPI 每次資料傳輸可以 8 位或 16 位為機關,每次傳輸的機關數不受限制。
1.3 CPOL/CPHA 及通訊模式
上面講述的圖 25-2 中的時序隻是 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 的時序圖。首先,根據 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 的偶數邊沿被采樣
由 CPOL 及 CPHA 的不同狀态, SPI 分成了四種模式,見表 25-1,主機與從機需要工作在相同的模式下才可以正常通訊,實際中采用較多的是“模式 0”與“模式 3”。