I2C(Inter-Integrated Circuit)總線是Philips公司推出的一種雙向二線制同步串行總線,僅用兩根線即可實現(xiàn)器件之間的數(shù)據(jù)傳送。目前很多芯片集成了I2C總線接口,如CYGNAL公司的C805IF0XX系列單片機、實時日歷時鐘芯片PCF8563及數(shù)字溫度傳感器LM75等。
1.I2C總線的引腳功能
如圖6-7所示,I2C總線通過兩根線將多個芯片(包括MCU)連接在一起,其中,SDA和SCL都是雙向傳輸線,分別用于傳輸數(shù)據(jù)和時鐘信號。這兩個引腳必須經(jīng)過上拉電阻與正電源相接,如圖6-8所示。另外,在總線空閑時,SDA和SCL都是高電平。
圖6-7 I2C總線接口擴展示意圖
圖6-8 I2C總線接口電氣結(jié)構(gòu)圖
需要注意,在圖6-7中并沒有指出從機或主機,這是因為I2C是一種多主機的總線,可以有多個主機,且主從關(guān)系可以根據(jù)任務(wù)要求而更改。當(dāng)有個多個主機時,I2C總線可以通過內(nèi)部的競爭檢測和仲裁電路進行仲裁處理,以保證數(shù)據(jù)正確傳輸。另外,主機是產(chǎn)生時鐘信號并初始化數(shù)據(jù)傳輸?shù)钠骷?,只有帶CPU的器件才能成為主機。每個器件都有一個唯一的地址編號,被主機通過地址編號尋址訪問的器件是從機。
2.I2C總線的引腳時序
I2C總線的數(shù)據(jù)傳輸過程由主機控制。在該過程中,主機的操作可以分為以下幾個步驟:①發(fā)送啟動信號;②傳輸從機地址,并確認(rèn)數(shù)據(jù)傳輸方向(主機輸出從機輸入,或主機輸入從機輸出);③與從機之間進行數(shù)據(jù)傳輸(發(fā)送或讀取);④發(fā)送停止信號。I2C總線信號的時序由主機產(chǎn)生和控制,下面分別進行介紹。
(1)啟動信號和停止信號的時序
啟動信號和停止信號分別用于確定數(shù)據(jù)傳輸?shù)拈_始和結(jié)束。如圖6-9所示,當(dāng)SCL為高電平時,若SDA引腳出現(xiàn)下降沿,則產(chǎn)生啟動信號;反之,當(dāng)SCL為高電平,而SDA引腳出現(xiàn)上升沿時,則產(chǎn)生停止信號。
圖6-9啟動信號與停止信號的引腳時序
a)啟動信號b)停止信號
(2)數(shù)據(jù)傳送時序
數(shù)據(jù)傳送過程中,如圖6-10所示,當(dāng)SCL為高電平時,SDA引腳上的信號是被傳送的數(shù)據(jù)位(低電平為“0”,高電平為“1”),必須保持穩(wěn)定;若要更改被傳送的數(shù)據(jù)位,則必須先令SCL為低電平??梢?,I2C總線僅在SCL為高電平時傳送數(shù)據(jù)。
圖6-10數(shù)據(jù)傳輸過程中的引腳時序
(3)響應(yīng)信號時序
I2C總線以字節(jié)為單位傳送數(shù)據(jù)和地址。傳送時高位在前、低位在后。每發(fā)送完一個字節(jié)后,發(fā)送方都要求接收方返回一個響應(yīng)信號。響應(yīng)信號有兩種,分別是應(yīng)答信號ACK和非應(yīng)答信號ACK,其時序如圖6-11所示,下面分析該時序。
圖6-11響應(yīng)信號的引腳時序
a)應(yīng)答信號ACK b)非應(yīng)答信號ACK
1)若主機為發(fā)送方,則發(fā)送完一個字節(jié)后,需要從機進行應(yīng)答。此時,主機在SCL引腳產(chǎn)生一個時鐘脈沖(高電平),并將SDA引腳設(shè)置為高電平(即釋放對總線的控制)。接收方若需繼續(xù)接收下一個數(shù)據(jù),則主動將SDA引腳設(shè)置為低電平。即產(chǎn)生如圖6-11a所示的ACK信號。主機檢測到ACK信號后將繼續(xù)發(fā)送下一個數(shù)據(jù)。若接收方不需要接收下一個數(shù)據(jù),則不更改SDA引腳狀態(tài),使其保持高電平。即產(chǎn)生如圖6-11b所示的ACK信號。主機檢測到ACK信號后,將產(chǎn)生如圖6-9b所示的停止信號,并結(jié)束發(fā)送。
2)若主機為接收方,則接收完一個字節(jié)數(shù)據(jù)后,主動產(chǎn)生一個應(yīng)答信號。如果主機希望接收新數(shù)據(jù),則該應(yīng)答信號為ACK信號。檢測到ACK信號的從機將發(fā)送下一個數(shù)據(jù)。如果主機不需要接收新數(shù)據(jù),則應(yīng)答信號為ACK信號。從機檢測到ACK信號后,將停止發(fā)送、釋放SDA線(即使其為高電平)。之后,主機可以發(fā)送停止信號,結(jié)束本次數(shù)據(jù)傳輸。
3.I2C總線的數(shù)據(jù)幀格式
如前所述,I2C總線傳輸數(shù)據(jù)之前除了發(fā)送啟動信號外,還要發(fā)送從機地址,并確認(rèn)數(shù)據(jù)傳輸方向。具體方法是,主機發(fā)送啟動信號后,接著再向從機發(fā)送一個字節(jié)數(shù)據(jù)。如圖6-12所示,該數(shù)據(jù)的高7位是從機的地址;最低位(第0位)R W代表數(shù)據(jù)的傳輸方向,0表示主機是發(fā)送方(向從機寫數(shù)據(jù)),1表示主機是接收方(讀從機的數(shù)據(jù))。
沒有I2C總線接口的單片機,如MCS-51單片機等,可以利用自身的并行I/O引腳模擬產(chǎn)生I2C總線時序,以實現(xiàn)對I2C總線接口器件的擴展。例如,在圖6-13中,8051單片機用P1.0和P1.1模擬I2C總線的SDA和SCL引腳。
圖6-12 I2C總線的從機地址格式
圖6-13引腳模擬I2C總線