模擬IIC協議時序


IIC是飛利浦公司開發的兩線式串行總線,主要應用在單片機和外圍電子器件之間的數據通訊。

IIC總線優點是節約總線數,穩定,快速,是目前芯片制造上非常流行的一種總線,大多數單片機已經片內集成了IIC總線接口,無需用戶自己模擬,只需配置相關寄存器即可使用,但是,為了更好地理解IIC總線協議,可以自行按照IIC時序圖進行模擬,加深理解。

IIC總線有兩條串行線,其一是時鍾線SCK,其二是數據線SDA。

在尋常的應用之中,單片機常常作為主機,外圍器件作為從機使用。

每一個從機器件都擁有唯一的一個地址,這個地址在芯片手冊上會有詳細的介紹,一般還需要自行配置芯片管腳上的高低電平,來實現確定從機地址的目的。

硬件設計上,SCK線和SDA線通過典型的4.7K電阻進行上拉,保證兩條線空閑時保持高電平狀態。

SDA上的數據在SCK高電平期間必須穩定,SDA上的數據在SCK期間才可以被更改。

IIC總線的時序分析:

起始信號:在SCK高電平期間,SDA一個下降沿,即構成了IIC的起始信號。

終止信號:在SCK高電平期間,SDA一個上升沿,即構成了IIC的終止信號。

程序上的模擬如下所示:

1->IIC起始信號模擬程序:

 

 1 void IIC_start(void)  2 {  3     SCK=1;  4     SDA=1;  5  IIC_delay();  6     SDA=0;  7  IIC_delay();  8     SCK=0;  9  IIC_delay(); 10 }

 

2->IIC終止信號模擬程序:

 1 void IIC_end(void)  2 {  3     SCK=0;  4     SDA=0;  5  IIC_delay();  6     SCK=1;  7  IIC_delay();  8     SDA=1;  9  IIC_delay(); 10 }

IIC發送數據:
在IIC一次發送8位數據,數據發送時,總是高位在前,分8次傳送出去。

IIC發送數據模擬程序:

 

 1 void IIC_write(unsigned char dat)  2 {  3     unsigned char temp;  4     for(temp=0x80;temp!=0;temp>>=1)  5  {  6             if(temp&dat==0)  7  {  8                         SDA=0;  9  } 10             else
11  { 12                         SDA=1; 13  } 14  IIC_delay(); 15             SCK=1; 16  IIC_delay(); 17             SCK=0; 18  } 19 }

 

IIC接收應答模擬程序:

 

 1 bit Get_IIC_ack(void)  2 {  3  bit ack;  4         SDA=1;        //釋放數據線,准備接收應答
 5         SCK=1;  6         if(SDA==1)  7  {  8                 ack=0;//無應答信號
 9  } 10         else
11  { 12                 ack=1;//有應答信號
13  } 14         SCK=0; 15  IIC_delay(); 16         return ack; 17 }

 

IIC讀取數據模擬程序:

 1 unsigned char IIC_Read(void)  2 {  3         unsigned char temp;  4         unsigned char dat;  5         SDA=1; //釋放總線准備接收
 6         for(temp=0x80;temp!=0;temp>>=1)  7  {  8  IIC_delay();  9                 SCK=1; 10                 if(SDA==1) 11  { 12                         dat|=temp; 13  } 14                 else
15  { 16                         dat&=~temp; 17  } 18                 SCK=0; 19  } 20         return dat; 21 }

IIC非應答信號模擬程序:

void IIC_No_ack(void) { SDA=1; SCK=1; IIC_delay(); SCK=0; IIC_delay(); }

IIC應答信號模擬程序:

void IIC_ack(void) { SDA=0; SCK=1; IIC_delay(); SCK=0; IIC_delay(); }

 


免責聲明!

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



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