模擬SPI協議時序


  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 }

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM