16 IIC通訊協議

2021-06-27 17:41:55 字數 3829 閱讀 9579

1、iic簡介

iic即inter-integrated circuit(積體電路匯流排),它由飛利浦設計於80年代設計出來的,是一種半雙工通訊方式。(spi是全雙工方式)它是由時鐘線sda與資料線scl構成序列匯流排。可以在ic與ic、ic與cpu之間進行雙向傳送。主機按照一定的通訊協議給從機進行位址定址及資訊傳輸,其中資料的傳輸方向及傳輸位址都是有主機決定的。其典型的物理結構方式如下圖所示:

2、通訊的起始與結束訊號

起始訊號:時鐘線scl處於高電平,資料線sda下降沿;

終止訊號:時鐘線scl處於高電平,資料線sda上公升沿;

3、iic傳輸資料有效性

以序列的方式進行傳輸,要求在時鐘線scl高電平期間,資料線sda上的數值不可發生變化,且以資料位的最高位開始傳輸。

4、應答訊號與非應答訊號

iic通訊中

每乙個位元組必須保證是8位長度。資料傳送時,先傳送最高位(msb),每乙個被傳送的位元組後面都必須跟隨一位應答位(即一幀共有9位)。如果一段時間內沒有收到從機的應答訊號,則自動認為從機已正確接收到資料。即在時鐘的第九個時鐘週期給主機乙個應答或者非應答訊號,應答訊號從機傳送給主機的乙個低脈衝訊號。

5、iic完整的通訊過程

一般iic通訊包括這些過程,起始訊號、傳送位址、資料傳送、應答(不應答)過程、停止訊號。完成乙個完整的位元組資料傳輸需要9個時鐘週期(8個位數據+1個應答(非應答週期))。在乙個位元組傳輸後可能會出現乙個時鐘的低電平,用於處理其他的事情,比如中斷等事件。

6、定址約定

在開始訊號之後的第乙個位元組,主機傳送包含從機的位址資訊及資料的寫讀方向讀(1)、寫(0);當從機發現主機傳送的位址資訊與自身的位址資訊

一致時,傳送乙個應答訊號給主機,主機在接收到應答訊號後傳送訪問位址,再接收到從機的應答訊號,這樣就算握手完成了。

7、主機傳送1個位元組資料給從機過程

開始訊號後,主機給所有從機傳送乙個包含位址與讀寫方向的位元組資料,從機將傳送的位址與自身的位址進行比較,如果一致,則傳送乙個應答訊號給主機。主機接收到應答訊號後,再傳送乙個要訪問的位址,接收到從機的應答後開始傳送資料。

8、主機接收乙個來自從機資料的過程

開始訊號後,主機給所有從機傳送乙個包含位址及寫方向的資料位,位址相同的從機傳送乙個應答訊號之後,主機在傳送定址資訊,得到應答訊號後,主機在傳送一次包含位址資訊及讀方向的位元組。就可以開始傳送資料,從機不傳送應答訊號說明乙個位元組的傳送已經完成。

序列e2prom是基於i2c-bus 的儲存器件,遵循二線制協議,由於其具有介面方便,體積小,資料掉電不丟失等特點,在儀器儀表及工業自動化控制中得到大量的應用。其管腳配置如下:

10、24c02操作

對於24co2晶元,開始訊號後第乙個位元組資料格式如下,高四位固定為1010,a2、a1、a0固定該器件在電路的位址。

11、iic操作**解析:

起始訊號:

//產生 iic 起始訊號

void iic_start(void)

終止訊號:

//產生 iic 停止訊號

void iic_stop(void)

產生應答訊號:

//產生 ack 應答

void iic_ack(void)

不產生應答訊號:

void iic_nack(void)

傳送乙個位元組:

//iic 傳送乙個位元組

//返回從機有無應答

//1,有應答

//0,無應答       

void iic_send_byte(u8 txd)

}     

判斷是否有應答訊號:

//等待應答訊號到來

//返回值:1,接收應答失敗

//     0,接收應答成功

u8 iic_wait_ack(void)

}iic_scl=0;//時鐘輸出 0   

return 0;  

} 其中

#define read_sda   pcin(11)  //輸入sda  即讀取資料線的狀態

接收乙個位元組:

//讀1個位元組,ack=1時,傳送ack,ack=0,傳送nack   

u8 iic_read_byte(unsigned char ack)

if (!ack)

iic_nack();//傳送nack

else

iic_ack(); //傳送ack   

return receive;

}在24c02指定位址讀取乙個資料

//在at24cxx指定位址讀出乙個資料

//readaddr:開始讀數的位址  

//返回值  :讀到的資料

u8 at24cxx_readonebyte(u16 readaddr)

else iic_send_byte(0xa0+((readaddr/256)<<1));   //傳送器件位址0xa0,寫資料

iic_wait_ack(); 

iic_send_byte(readaddr%256);   //傳送低位址

iic_wait_ack();

iic_start();  

iic_send_byte(0xa1);           //進入接收模式

iic_wait_ack();

temp=iic_read_byte(0);

iic_stop();//產生乙個停止條件

return temp;

}24c02寫乙個資料:

//在at24cxx指定位址寫入乙個資料

//writeaddr  :寫入資料的目的位址    

//datatowrite:要寫入的資料

void at24cxx_writeonebyte(u16 writeaddr,u8 datatowrite)

else

iic_wait_ack();

iic_send_byte(writeaddr%256);   //傳送低位址

iic_wait_ack();

iic_send_byte(datatowrite);     //傳送位元組

iic_wait_ack();  

iic_stop();//產生乙個停止條件 

delay_ms(10);

}總結:嚴格按照時序來完成。

附上:關於iic通訊的文章

IIC 通訊協議

原文 i2c匯流排進行資料傳送時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線上的高電平或低電平狀態才允許變化。起始和終止訊號 scl線為高電平期間,sda線由高電平向低電平的變化表示起始訊號 scl線為高電平期間,sda線由低電平向高電平的變化表示終止...

IIC 通訊協議

i2c匯流排進行資料傳送時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線上的高電平或低電平狀態才允許變化。起始和終止訊號 scl線為高電平期間,sda線由高電平向低電平的變化表示起始訊號 scl線為高電平期間,sda線由低電平向高電平的變化表示終止訊號。...

IIC 通訊協議

簡要過程 主機傳送起始位,這會通知匯流排上的所有裝置傳輸開始了,接下來主機傳送裝置位址 讀 寫訊號,與這一位址匹配的從裝置將成為從機並與主機進行傳輸,而其它從裝置將會退出此次通訊。主機匹配到從機後,主機傳送它所要讀取或寫入的從機的內部暫存器位址 然後傳送資料 資料傳送完畢後,傳送停止位。詳細過程 簡...