I2C(Inter-Integrated Circuit)總線是一種由PHILIPS公司開發(fā)的兩線式串行總線,,用于連接微控制器及其外圍設備。I2C總線產(chǎn)生于在80年代,最初為音頻和視頻設備開發(fā),,如今主要在服務器管理中使用,其中包括單個組件狀態(tài)的通信,。例如管理員可對各個組件進行查詢,,以管理系統(tǒng)的配置或掌握組件的功能狀態(tài),如電源和系統(tǒng)風扇,??呻S時監(jiān)控內(nèi)存、硬盤,、網(wǎng)絡,、系統(tǒng)溫度等多個參數(shù),,增加了系統(tǒng)的安全性,方便了管理,。
1 I2C總線特點
I2C總線最主要的優(yōu)點是其簡單性和有效性,。由于接口直接在組件之上,因此I2C總線占用的空間非常小,,減少了電路板的空間和芯片管腳的數(shù)量,,降低了互聯(lián)成本??偩€的長度可高達25英尺,,并且能夠以10Kbps的最大傳輸速率支持40個組件。I2C總線的另一個優(yōu)點是,,它支持多主控(multimastering),, 其中任何能夠進行發(fā)送和接收的設備都可以成為主總線。一個主控能夠控制信號的傳輸和時鐘頻率,。當然,,在任何時間點上只能有一個主控。
2 I2C總線工作原理
2.1 總線的構成及信號類型
I2C總線是由數(shù)據(jù)線SDA和時鐘SCL構成的串行總線,,可發(fā)送和接收數(shù)據(jù),。在CPU與被控IC之間、IC與IC之間進行雙向傳送,,最高傳送速率100kbps,。各種被控制電路均并聯(lián)在這條總線上,但就像電話機一樣只有撥通各自的號碼才能工作,,所以每個電路和模塊都有唯一的地址,,在信息的傳輸過程中,I2C總線上并接的每一模塊電路既是主控器(或被控器),,又是發(fā)送器(或接收器),,這取決于它所要完成的功能。CPU發(fā)出的控制信號分為地址碼和控制量兩部分,,地址碼用來選址,,即接通需要控制的電路,確定控制的種類,;控制量決定該調(diào)整的類別(如對比度,、亮度等)及需要調(diào)整的量。這樣,,各控制電路雖然掛在同一條總線上,,卻彼此獨立,互不相關,。
I2C總線在傳送數(shù)據(jù)過程中共有三種類型信號,, 它們分別是:開始信號,、結(jié)束信號和應答信號。
開始信號:SCL為高電平時,,SDA由高電平向低電平跳變,,開始傳送數(shù)據(jù)。
結(jié)束信號:SCL為低電平時,,SDA由低電平向高電平跳變,,結(jié)束傳送數(shù)據(jù)。
應答信號:接收數(shù)據(jù)的IC在接收到8bit數(shù)據(jù)后,,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的低電平脈沖,,表示已收到數(shù)據(jù)。CPU向受控單元發(fā)出一個信號后,,等待受控單元發(fā)出一個應答信號,,CPU接收到應答信號后,根據(jù)實際情況作出是否繼續(xù)傳遞信號的判斷,。若未收到應答信號,,由判斷為受控單元出現(xiàn)故障。
目前有很多半導體集成電路上都集成了I2C接口,。帶有I2C接口的單片機有:CYGNAL的 C8051F0XX系列,,PHILIPSP87LPC7XX系列,MICROCHIP的PIC16C6XX系列等,。很多外圍器件如存儲器、監(jiān)控芯片等也提供I2C接口,。
3 總線基本操作
I2C規(guī)程運用主/從雙向通訊,。器件發(fā)送數(shù)據(jù)到總線上,則定義為發(fā)送器,,器件接收數(shù)據(jù)則定義為接收器,。主器件和從器件都可以工作于接收和發(fā)送狀態(tài)。 總線必須由主器件(通常為微控制器)控制,,主器件產(chǎn)生串行時鐘(SCL)控制總線的傳輸方向,,并產(chǎn)生起始和停止條件。SDA線上的數(shù)據(jù)狀態(tài)僅在SCL為低電平的期間才能改變,,SCL為高電平的期間,,SDA狀態(tài)的改變被用來表示起始和停止條件。參見圖1,。
圖1 串行總線上的數(shù)據(jù)傳送順序
3.1 控制字節(jié)
在起始條件之后,,必須是器件的控制字節(jié),其中高四位為器件類型識別符(不同的芯片類型有不同的定義,,EEPROM一般應為1010),,接著三位為片選,,最后一位為讀寫位,當為1時為讀操作,,為0時為寫操作,。如圖2所示。
圖2 控制字節(jié)配置
3.2 寫操作
寫操作分為字節(jié)寫和頁面寫兩種操作,,對于頁面寫根據(jù)芯片的一次裝載的字節(jié)不同有所不同,。關于頁面寫的地址、應答和數(shù)據(jù)傳送的時序參見圖3,。
圖3 頁面寫
3.3 讀操作
讀操作有三種基本操作:當前地址讀,、隨機讀和順序讀。圖4給出的是順序讀的時序圖,。應當注意的是:最后一個讀操作的第9個時鐘周期不是“不關心”,。為了結(jié)束讀操作,主機必須在第9個周期間發(fā)出停止條件或者在第9個時鐘周期內(nèi)保持SDA為高電平,、然后發(fā)出停止條件,。
圖4 順序讀
4 實例:X24C04與MCS-51單片機軟硬件的實現(xiàn)
X24C04是XICOR公司的CMOS 4096位串行EEPROM,內(nèi)部組織成512×8位,。16字節(jié)頁面寫,。與MCS-51單片機接口如圖5所示。由于SDA是漏極開路輸出,,且可以與任何數(shù)目的漏極開路或集電極 開路輸出“線或”(wire-Ored)連接,。上拉電阻的選擇可參考X24C04的數(shù)據(jù)手冊。下面是通過I2C接口對X24C04進行單字節(jié)寫操作的例程,。流程圖及源程序如下:
圖5 X24C04與51單片機接口
,;名稱:BSENT
;描述:寫字節(jié)
,;功能:寫一個字節(jié)
,;調(diào)用程序:無
;輸入?yún)?shù):A
,;輸出參數(shù):無
BSEND: MOV R2,#08H ,;1字節(jié)8位
SENDA: CLR P3.2 ;
RLC A ,;左移一位
MOV P3.3,C ,;寫一位
SETB P3.2
DJNZ R2,SENDA ;寫完8個字節(jié),?
CLR P3.2 ,;應答信號
SETB P3.3
SETB P3.2
RET
圖6 流程圖
5 結(jié)束語
在I2C總線的應用中應注意的事項總結(jié)為以下幾點 :
1) 嚴格按照時序圖的要求進行操作,
2) 若與口線上帶內(nèi)部上拉電阻的單片機接口連接,可以不外加上拉電阻,。
3) 程序中為配合相應的傳輸速率,,在對口線操作的指令后可用NOP指令加一定的延時。
4) 為了減少意外的干擾信號將EEPROM內(nèi)的數(shù)據(jù)改寫可用外部寫保護引腳(如果有),,或者在EEPROM內(nèi)部沒有用的空間寫入標志字,,每次上電時或復位時做一次檢測,判斷EEPROM是否被意外改寫,。