IIC 的一些特征: 兩條總線:串行數(shù)據(jù)總線(SDA)和串行時(shí)鐘總線(SCL) 真正的多主機(jī)總線 連接到相同總線的ic數(shù)量只受到總線的最大電容400pF限制。 串行8位雙向數(shù)據(jù)在標(biāo)準(zhǔn)模式下可達(dá)100K bit/s 快速模式400K bit/s,高速模式下3.4Mbit/s.
數(shù)據(jù)有效性規(guī)定: IIC總線在進(jìn)行數(shù)據(jù)傳輸時(shí),SCL在高電平區(qū)間,SDA上的電平必須保持穩(wěn)定 SDA的數(shù)據(jù)的高或者低電平狀態(tài)只有在SCL線的時(shí)鐘信號(hào)是低電平時(shí)才能改變。
起始和停止條件: 起始:SCL高電平時(shí),SDA由高電平向低電平切換。 停止:SCL高電平時(shí),SDA由低電平向高電平切換。
模擬時(shí)序如下: 起始與終止:
 應(yīng)答與非應(yīng)答:
 總線上進(jìn)行一次數(shù)據(jù)傳輸?shù)耐ㄐ鸥袷剑?br>
相關(guān)模擬時(shí)序的驅(qū)動(dòng)函數(shù):包括(start,stop,respons,write_byte,read_byte) -----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- //SCL高電平區(qū)間,SDA一個(gè)下降沿啟動(dòng)信號(hào) void Start() { SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); } -----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- //SCL在高電平區(qū)間,SDA一個(gè)上升沿停止信號(hào) void Stop() { SDA=0; delay(); SCL=1; delay(); SDA=1; delay(); } -----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- //SCL在高電平區(qū)間,SDA被從設(shè)備拉低表示應(yīng)答, //(SDA==1)&&(i<255)表示如果一段時(shí)間未收到從期間 //的應(yīng)答則默認(rèn)從期間已經(jīng)收到而不再等待應(yīng)答信號(hào) void Respons() { uchari=0; SCL=1; delay(); while((SDA==1)&&(i<255)) i++; SCL=0; delay(); } -----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- //CY 為PSW寄存器中的CY位 //先移位,然互使用SCL控制發(fā)出去 void Write_Byte(uchar date) { uchari,temp; temp=tada; for(i=0;i<8;i++) { temp=temp<<1; SCL=0; delay(); SDA=CY; delay(); SCL=1; delay(); } SCL=0; delay(); SDA=1; delay(); }
-----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- //定義臨時(shí)變量K,K左移一位后與SDA進(jìn)行或運(yùn)算, //依次把8個(gè)獨(dú)立地位放入一個(gè)字節(jié)中來接受完成 void Read_Byte() { uchari,k; SCL=0; delay(); SDA=1; for(i=0;i<8;i++) { SCL=1; delay(); k=(k<<1)|SDA; SCL=0; delay(); } delay(); returnk; } -----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- 底層驅(qū)動(dòng)完成以后,我們需要對(duì)實(shí)際的芯片使用通訊協(xié)議來進(jìn)行操作。 目前大多的情況下一般比較受歡迎的是AT24cxx 系列。 AT24Cxx系列主要有: 以下系列:
 以下僅以AT24C02為例來進(jìn)行說明: AT24C02芯片地址為:1010,其控制字格式如下:
 其中A2,A1,A0為可編程選擇地址,此處A2,A1,A0均接地,即000, 因此發(fā)送寫信號(hào)的尋址字節(jié)為:10100000,即0XA0, 因此發(fā)送讀信號(hào)的尋址字節(jié)為:10100001,即0XA1,
下圖為寫一個(gè)字節(jié)的數(shù)據(jù)格式,有圖可知道:向AT24C02中寫入一個(gè)字節(jié)的時(shí)候,需要: 先發(fā)一個(gè)起始信號(hào),再發(fā)一個(gè)字節(jié)的控制字, 在發(fā)送一個(gè)字節(jié)的控制字地址,都得到應(yīng)答信號(hào)后, 再發(fā)送要存入的數(shù)據(jù),最后發(fā)一個(gè)停止信號(hào)! So,一個(gè)字節(jié)的數(shù)據(jù)已經(jīng)寫入AT24C02中,OK!下面是數(shù)據(jù)格式,如圖:
 程序如下: ----------------------------------------------------------------------------------------------------------------------- //任意地址,寫入數(shù)據(jù) void Write_Add(uchar address,uchar date) { Start();
Write_Byte(0xA0); Respons(); Write_Byte(address); Respons(); Write_Byte(date); Respons();
Stop } -----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- 下圖為讀一個(gè)字節(jié)的數(shù)據(jù)格式,其讀取一個(gè)字節(jié)的數(shù)據(jù)和寫入時(shí)候差不多,此處不再累贅,讀一字節(jié)數(shù)據(jù)格式如圖:
 程序如下: -----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- //任意地址,讀出數(shù)據(jù) void Read_Add(uchar address) { uchardate;
Start(); Write_Byte(0XA0); Respons(); Write_Byte(address); Respons();
Start(); Write_Byte(0XA1); Respons(); date=Read_Byte(); Stop();
returnbyte; } -----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
以上幾位IIC的基本通訊時(shí)序的相關(guān)講解,可參與時(shí)序圖進(jìn)行理解??!
|