武 婷等
在電子消費品、通訊及工業電子等應用領域,許多看似不相關的設計常常有許多相似之處,比如幾乎每個系統都有這幾個部分組成:處理器、數據存儲介質及應用專用電路,如廣播、電視中用到的數字調諧器、信號處理器,或支持語音撥號的電話中需要的DTMF發生器等。而它們之間的數據傳遞通常都有距離短、流量小、突發性等特點,如何利用這些共性,使電路的設計簡單而性能穩定呢?本文介紹由Philips公司提出的I2C總線很好地解決了這個問題。 I2C總線為兩線雙向串行傳輸總線,它為模塊之間的數據傳遞提供了一種方便有效的方法,特別適合應用于有很多模塊、彼此之間非頻繁數據傳遞的設計中。文中介紹了I2C總線協議,并給出了其軟件的實現方法,最后提出了硬件連接方法中應注意的問題。
I2C總線協議
1.協議概述
I2C總線僅占用系統的兩個I/O口,一條作為串行數據線SDA,一條作為串行時鐘線SCL,線上外加上拉電阻,在不傳數據時SCL、SDA總保持高電平。連在每一個總線上的器件都有一個唯一地址,它們彼此之間只有簡單的Master/Slaver關系:
Master:控制時鐘線,產生啟動信號、時鐘信號、停止信號。控制線上的發送和接收節奏。
Slaver:處于從機地位,按SCL線上的時鐘接收SDA線上的數據或發送數據到SDA線上。
它是個真正的多主控總線方式,如果有兩個或兩個以上Master同時有數據傳送請求時,通過檢測發出去的數據是否和SDA線上的數據相同來判斷是否發生沖突,數據不同將放棄此次傳輸,通過這種沖突檢測、仲裁機制可以防止數據沖突。

I2C總線要求所有連在I2C總線上的器件都必須是開漏或開集輸出,用以實現線與的功能,可使不同Master產生的時鐘同步,也解決Master和Slaver之間速度不匹配問題。I2C總線的傳輸速度:標準模式可達100kbit/s,快速模式可達400kbit/s,高速模式可達3.4Mbit/s。
2.協議規范
I2C總線數據傳輸時序圖見圖1、圖2,其中,圖1為寫模式時序,圖2為讀模式時序。其協議規定:數據以字節為單元,每字節8位,SCL的每一時鐘脈沖發送一位,先高位后低位。應答位緊跟每個字節之后。接收數據是在時鐘的高電平期采樣數據,所以改變SDA線上的數據必須在時鐘的低電平期,數據在時鐘的高電平期應保持不變,正是數據傳輸的這個特點,I2C總線利用SCL高電平時改變SDA來作為開始(start)和結束(stop)命令。
開始命令信號(start):在SCL為高電平時,產生一個1→0跳變,表示開始一個數據傳輸周期。
結束命令信號(stop):在SCL為高電平時,產生一個0→1跳變,表示結束一個數據傳輸周期。
從機地址(Slaver address):每個I2C總線上的器件都有唯一的地址。這個地址分固定部分和可編程部分,同類器件的固定地址相同,因為有可編程部分,所以允許有多個同類或相同器件放在同一總線上。從機地址必須緊跟start命令信號之后,與讀寫指示位組成一個字節發送。I2C線上所有處于從機地位的器件在接到start信號后的第一字節后檢查是否和自己的地址相符,如果相符發送應答信號(在SCL的第9個時鐘維持SDA線為低電平),不符,仍保持自己SDA口輸出為高。I2C總線也支持10位地址,本文主要討論7位地址方式。

讀寫位(R/W):讀操作,此位置1;寫操作,此位置0。
應答位(ACK):每字節后緊跟的第一個時鐘對應的SDA數據,這個數據也必須在時鐘高電平期維持不變。
無論是讀模式還是寫模式都是相對Master來定義的。
當Master處于寫模式:即Master要向Slaver送數據。Master先發start信號;緊跟著發送7位Slaver地址和讀寫指示位0;Slaver確認地址和自己相符后置應答位SDA為低電平,并判斷讀寫位,準備接收數據,若地址不符置高電平;Master檢查應答位為高,發送stop信號結束此次數據傳輸周期, 如果為低,繼續發送數據,Slaver每接收一字節數據,發送一低應答信號,Master檢查到低應答信號后才繼續發送下一個字節數據,否則發送stop信號停止發送;當Master數據發送完畢后,也會自動發送stop信號停止此周期傳送。時序見圖1。

當Master處于讀模式:即Master要讀Slaver數據。Master先發start信號;緊跟著發送7位Slaver地址和讀寫指示位1;Slaver確認地址和自己相符后置應答位SDA為低電平,并判斷讀寫位,準備數據發送,若地址不符置應答位為高電平;Master檢查應答位為高,發送stop信號結束此次數據傳輸周期,如果為低,繼續發送時鐘信號,Slaver按SCL上的時鐘將數據放到SDA上,每當Master接收到一字節數據后,發送低應答位給Slaver,Master要停止接收,發送高應答位給Slaver,告訴Slaver不再接收數據,然后發stop信號結束此次數據傳輸周期。時序見圖2。
I2C總線接口的軟件實現
本文給出的I2C總線接口程序流程圖為在I2C總線上處于Master地位的總線接口程序。程序入口參數:HDADDS(從機地址右移1位)、 FLRW(讀寫標志位)、REF(存放發送/接收參數在RAM中存放的首地址,數據由高地址到低地址讀取或存放)、 SDRVCT(發送參數的個數,不包括HDADDS)。圖3為程序流程圖,在本刊的網站上給出了具體程序,供讀者參考。

I2C總線硬件設計
在硬件電路設計中應注意以下幾點:
(1)I2C總線驅動能力和連在總線上的器件的等效電容有關,也就是說所有連在總線上的器件產生的電容負載不能超過400pF。
(2)在I2C總線上,如果所接器件的I/O口的輸入電平邏輯判斷固定為1.5V和3V,與該芯片的供電電壓無關,則該器件在I2C總線上可獨立供電,此時I2C的SDA和SCL經上拉電阻連接到5V±10%;如果所接器件的I/O口的輸入電平邏輯判斷和該芯片的供電電壓有關,那么它們必須統一接到相同的供電電壓上,且I2C的SDA和SCL必須經上拉電阻也連接在這電壓上。圖4給出I2C總線上混合這兩類器件的電路連接。圖中的右邊兩個為輸入電平和供電電壓無關的器件,左邊兩個為輸入電平和供電電壓有關的器件。
結束語
采用I2C總線的系統很容易實現模塊的修改,因為加入一個支持I2C接口的模塊到I2C總線或從I2C上去除一個模塊無需附加接口電路,且不影響其它電路。I2C總線靈活性好,器件地址可編程,數據傳輸協議可由自己靈活約定,且容易查錯。該總線還具有低耗、寬電壓范圍、適用溫度范圍廣、抗干擾能力強等特點,因此被廣泛應用于電路設計中。