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