I2C總線概述
I2C(Inter-Integrated Circuit)總線是一種由PHILIPS公司在80年代開發的兩線式串行總線,用于連接微控制器及其外圍設備。I2C總線最主要的優點是其簡單性和有效性。由于接口直接在組件之上,因此I2C總線占用的空間非常小,減少了電路板的空間和芯片管腳的數量,降低了互聯成本。總線的長度可高達25英尺,并且能夠以10Kbps的最大傳輸速率支持40個組件。I2C總線的另一個優點是,它支持多主控(multimastering),其中任何能夠進行發送和接收的設備都可以成為主總線。一個主控能夠控制信號的傳輸和時鐘頻率。當然,在任何時間點上只能有一個主控。
I2C總線的構成及信號類型
I2C總線是由數據線SDA和時鐘SCL構成的串行總線,可發送和接收數據。在IC與IC之間進行雙向傳送,最高傳送速率100kbps。對于并聯在一條總線上的每個IC都有唯一的地址。
I2C總線有兩根信號線,一根為SDA(數據線),一根為SCL(時鐘線),時鐘信號是由主控器件產生。I2C總線在傳送數據過程中共有三種類型信號,它們分別是:開始信號、結束信號和應答信號。
開始信號:SCL為高電平時,SDA由高電平轉變為低電平跳變,表示開始通信。
結束信號:SCL為高電平時,SDA由低電平轉變為高電平跳變,結束結束通信。
應答信號:接收數據的IC在接收到一個字節數據后,向發送數據的IC發出特定的低電平脈沖,表示已收到數據。
開始和結束信號都是由主機發出的,應答信號是由從機發出的,開始和結束通信過程的時序如圖1所示。
這些信號中,起始信號是必需的,結束信號和應答信號,都可以不要。
I2C總線操作時序
I2C總線必須由主機(通常為微控制器)控制,主機產生串行時鐘(SCL)控制總線的傳輸方向,并產生起始和停止條件。SDA線上的數據狀態僅在SCL為低電平的期間才能改變,SCL為高電平的期間,SDA狀態的改變被用來表示起始和停止條件。
控制字節
控制字節
在通信開始信號之后,發送的必須是器件的控制字節,其中高四位為器件類型識別符,接著三位為片選,最后一位為讀寫位,當為1時為讀操作,為0時為寫操作。該字節前七位表示器件的地址。
(注:SCL線上1~7位為7位接收器件地址,第8位為讀寫位,第9位為ACK應答位,緊接著的為第一個數據字節,然后是一位應答位,后面繼續第2個數據字節。)
I2C總線的數據傳送
A、主機向從機發送數據,數據傳送方向在整個傳送過程中不變。
A表示應答,/A表示非應答(高電平)。S表示起始信號,P表示終止信號。
B、主機在第一個字節(尋址字節)后,立即由從機讀數據。

在從機產生響應時,主機從發送變成接收,從機從接收變成發送。之后,數據由從機發送,主機接收,每個應答由主機產生,時鐘信號仍由主機產生。若主機要終止本次傳輸,則發送一個非應答信號(A),接著主機產生停止條件。
C、在傳送過程中,當需要改變傳送方向時,起始信號和從機地址都被重復產生一次,但兩次讀/寫方向位正好反相
在多主的通信系統中。總線上有多個節點,它們都有自己的尋址地址,可以作為從節點被別的節點訪問,同時它們都可以作為主節點向其它的節點發送控制字節和傳送數據。但是如果有兩個或兩個以上的節點都向總線上發送啟動信號并開始傳送數據,這樣就形成了沖突。要解決這種沖突,就要進行仲裁的判決,這就是I2C總線上的仲裁。
I2C總線上的仲裁分兩部分:SCL線的同步和SDA線的仲裁。
A、SCL線的同步(時鐘同步)
SCL同步是由于總線具有線“與”的邏輯功能,即只要有一個節點發送低電平時,總線上就表現為低電平。當所有的節點都發送高電平時,總線才能表現為高電平。
由于線“與”邏輯功能的原理,當多個節點同時發送時鐘信號時,在總線上表現的是統一的時鐘信號。這就是SCL的同步原理。
B、SDA仲裁
SDA線的仲裁也是建立在總線具有線“與”邏輯功能的原理上的。
節點在發送1位數據后,比較總線上所呈現的數據與自己發送的是否一致。是,繼續發送;否則,退出競爭。
SDA線的仲裁可以保證I2C總線系統在多個主節點同時企圖控制總線時通信正常進行并且數據不丟失。總線系統通過仲裁只允許一個主節點可以繼續占據總線。
C、仲裁過程
DATA1和DATA2分別是主節點向總線所發送的數據信號;
SDA為總線上所呈現的數據信號,SCL是總線上所呈現的時鐘信號。
當主節點1、2同時發送起始信號時,兩個主節點都發送了高電平信號。這時總線上呈現的信號為高電平,兩個主節點都檢測到總線上的信號與自己發送的信號相同,繼續發送數據。
第2個時鐘周期,2個主節點都發送低電平信號,在總線上呈現的信號為低電平,仍繼續發送數據。
在第3個時鐘周期,主節點1發送高電平信號,而主節點2發送低電平信號。根據總線的線“與”的邏輯功能,總線上的信號為低電平,這時主節點1檢測到總線上的數據和自己所發送的數據不一樣,就斷開數據的輸出級,轉為從機接收狀態。
這樣主節點2就贏得了總線,而且數據沒有丟失,即總線的數據與主節點2所發送的數據一樣,而主節點1在轉為從節點后繼續接收數據,同樣也沒有丟掉SDA線上的數據。因此在仲裁過程中數據沒有丟失。
I2C總線注意點
1.進行數據傳送時,在SCL為高電平期間,SDA線上電平必須保持穩定,只有SCL為低時,才允許SDA線上電平改變狀態。并且每個字節傳送時都是高位在前。
2.對于應答信號,ACK=0時為有效應答位,說明從機已經成功接收到該字節,若為1則說明接受不成功。
3.如果從機需要延遲下一個數據字節開始傳送的時間,可以通過把SCL電平拉低并保持來強制主機進入等待狀態。
4.主機完成一次通信后還想繼續占用總線在進行一次通信,而又不釋放總線,就要利用重啟動信號Sr。它既作為前一次數據傳輸的結束,又作為后一次傳輸的開始。
5.總線沖突時,按“低電平優先”的仲裁原則,把總線判給在數據線上先發送低電平的主器件。
6.在特殊情況下,若需禁止所有發生在I2C總線上的通信,可采用封鎖或關閉總線,具體操作為在總線上的任一器件將SCL鎖定在低電平即可。
7.SDA仲裁和SCL時鐘同步處理過程沒有先后關系,而是同時進行的。