一、SPI簡介
SPI,即Serial Peripheral Interface的英文縮寫。從字面意思看就是串行外部設備接口,是一種全雙工、高速、同步的通信總線。
SPI最早是摩托羅拉公司開發的全雙工同步串行總線,用於微控制器(MCU)連接外部設備之間的同步串行通信,主要應用於Flash、數模轉換器、信號處理器、控制器、EEPROM存儲器等外設中。
SPI總線屬於一主多從接口,和I2C不同的是,SPI 采用CS片選來控制主機與從機通信。現在的單片機幾乎都支持SPI總線,其已經成為一種高速、同步、雙工的通用標准,在IoT產品中得到廣泛應用。
二、SPI有幾根線?
SPI通常有4根線(四線制),可實現全雙工通信
【SCK】: 串行時鍾(Serial Clock)
【MOSI】:主發從收信號(Master Output, Slave Input)
【MISO】:主收從發信號(Master Input, Slave Output
【CS/CS】:片選信號(Slave Select)

SPI應用也有3根線(三線制),實現半雙工通信。

三、SPI通信原理
SPI模塊為了和外設進行數據交換,根據外設工作要求,其輸出串行同步時鍾極性和相位可以進行配置,通過CPHA(時鍾相位)、CPOL(時鍾極性)來控制設備的通信模式。

時鍾極性CPOL是用來配置SCK的電平在哪種狀態時是有效狀態或者空閑狀態。時鍾相位CPHA是用來配置數據采樣是在哪個邊沿:
CPHA=0,數據采樣是在第1個邊沿,數據發送在第2個邊沿
CPHA=1,數據采樣是在第2個邊沿,數據發送在第1個邊沿
CPOL=0,當SCLK=0時處於空閑態,有效狀態就是SCLK處於高電平時
CPOL=1,當SCLK=1時處於空閑態,有效狀態就是SCLK處於低電平時

CPHA=0、CPOL=0:此時空閑態時,SCK處於低電平,數據采樣是在第1個邊沿,就是SCK由低電平到高電平的跳變,所以數據采樣是在上升沿(准備數據),(發送數據)數據發送是在下降沿。
CPHA=0、CPOL=1:此時空閑態時,SCK處於高電平,數據采集是在第1個邊沿,即SCK由高電平到低電平的跳變,所以數據采集是在下降沿,數據發送是在上升沿。
CPHA=1、CPOL=0:此時空閑態時,SCK處於低電平,數據發送是在第1個邊沿,即SCK由低電平到高電平的跳變,所以數據采樣是在下降沿,數據發送是在上升沿。
CPHA=1、CPOL=1:此時空閑態時,SCK處於高電平,數據發送是在第1個邊沿,即SCK由高電平到低電平的跳變,所以數據采集是在上升沿,數據發送是在下降沿。
另外,分享個時序圖識圖方法。交叉線:數據允許發生改變,但不一定要變。平行線:數據不允許發生改變,必須穩定發送。

再細說傳輸時序。SPI接口在內部硬件實際上是兩個簡單的移位寄存器,傳輸的數據為8位,在主器件產生的從器件使能信號和移位脈沖下,按位傳輸,高位在前,低位在后。如下圖所示,在SCLK的下降沿上數據改變,上升沿一位數據被存入移位寄存器。SPI接口沒有指定的流控制,沒有應答機制確認是否接收到數據。

通過以上SPI總線常識的簡單描述,我們大致可以了解到SPI具有高速、同步、全雙工、總線結構、主從通信模式等優勢,但也存在無指定流控制,也沒有應答機制確認等短板。