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

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