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(); }