SPI是串行外設接口總線,摩托羅拉公司開發的一種全雙工,同步通信總線,有四線制和三線制。
在單片機系統應用中,單片機常常是被用來當做主機(MASTER),外圍器件被當做從機(SLAVE)。
所以,在以下的介紹中,都是默認單片機是主機模式進行說明的。
SPI總線相對於IIC總線,無總裁機制,無應答機制。
SPI常用的四線制分別是,MISO(主入從出)、MOSI(主出從入)、SCK(同步時鍾線)、CS(片選線,也有是NSS)。
主從機之間典型的接線方式如下所示:

按照時鍾線的時鍾極性(CPOL)和相位(CPHA),將SPI總線區分成4種工作方式。
具體區分如下:
當時鍾極性(CPOL==0)時:表示時鍾線空閑狀態為低電平;
當時鍾極性(CPOL==1)時:表示時鍾線空閑狀態為高電平;
當時鍾相位(CPHA==0)時:表示數據在時鍾的第一個邊沿輸出;
當時鍾相位(CPHA==1)時:表示數據在時鍾的第二個邊沿輸出;
如上所示,CPOL和CPHA兩兩組合,可表示4種工作方式,假設配置CPOL=0,CPHA=0,表示數據線在空閑時處於低電平,主機數據在時鍾的第一個邊沿(也就是上升沿被輸出),在第二個邊沿(也就是下降沿被讀入)。
需要注意的是,主機的配置必須根據從機設計,例如,從機是上升沿輸出,下降沿輸入。那么,主機在配置的過程當中,必須采用上升沿輸出,下降沿輸入,即SPI0工作方式。
采用I/O端口模擬SPI協議時序,可以很好地加深對於SPI總線的理解。
SPI寫時序模擬:
1 void SPI_write(unsigned char dat) 2 { 3 unsigned char temp; 4 for(temp=0x80;temp!=0;temp>>=1) 5 { 6 SCK=0; 7 if(temp&dat==0) 8 { 9 MOSI=0; 10 } 11 else
12 { 13 MOSI=1; 14 } 15 SPI_delay(); //讓MOSI穩定
16 SCK=1; 17 } 18 }
SPI讀時序模擬:
1 unsigned char SPI_read(void) 2 { 3 unsigned char temp; 4 unsigned char dat; 5 for(temp=0x80;temp!=0;temp>>=1) 6 { 7 SCK=1; 8 SPI_delay(); //讓SCK穩定
9 SCK=0; 10 if(MISO==1) 11 { 12 dat|=temp; 13 } 14 else
15 { 16 dat&=~temp; 17 } 18 } 19 return dat; 20 }
