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