I2C是Inter-Integrated Circuit的簡稱,讀做:I-squared-C。由飛利浦公司於1980年代提出,爲了讓主板、嵌入式系統或手機用以鏈接低速周邊外部設備而發展。html
主要用途:併發
SOC和周邊外設間的通訊(如:EEPROM,電容觸摸芯片,各類Sensor等)。ui
I2C總線只使用兩條雙向漏極開路的信號線(串行數據線:SDA,及串行時鐘線:SCL),並利用電阻上拉。I2C總線僅僅使用SCL、SDA兩根信號線,就實現了設備間的數據交互,極大地簡化了對硬件資源和PCB板佈線空間的佔用。I2C總線普遍應用在EEPROM、實時時鐘、LCD、及其餘芯片的接口。I2C容許至關大的工做電壓範圍,典型的電壓基準爲:+3.3V或+5V。3d
SCL(Serial Clock):串行時鐘線,傳輸CLK信號,通常是主設備向從設備提供
SDA(Serial Data):串行數據線,傳輸通訊數據code
I2C總線接口內部結構以下圖所示:htm
I2C使用一個7bit的設備地址,一組總線最多和112個節點通訊。最大通訊數量受限於地址空間及400pF的總線電容。blog
常見的I2C總線以傳輸速率的不一樣分爲不一樣的模式:標準模式(100Kbit/s)、低速模式(10Kbit/s)、快速模式(400Kbit/s)、高速模式(3.4Mbit/s),時鐘頻率能夠被降低到零,即暫停通訊。接口
該總線是一種多主控總線,便可以在總線上放置多個主設備節點,在中止位(P)發出後,即通信結束後,主設備節點能夠成爲從設備節點。資源
主設備節點:產生時鐘併發起通訊的設備節點
從設備節點:接收時鐘並響應主設備節點尋址的設備節點get
1)I2C通訊雙方地位不對等,通訊由主設備發起,並主導傳輸過程,從設備按I2C協議接收主設備發送的數據,並及時給出響應。 2)主設備、從設備由通訊雙方決定(I2C協議自己無規定),既能當主設備,也能當從設備(須要軟件進行配置)。 3)主設備負責調度總線,決定某一時刻和哪一個從設備通訊。同一時刻,I2C總線上只能有一對主設備、從設備通訊。 4)每一個I2C從設備在I2C總線通信中有一個I2C從設備地址,該地址惟一,是從設備的固有屬性,通訊中主設備經過從設備地址來找到從設備。
I2C總線多主設備結構以下圖所示:
串行、同步、非差分、低速率
1)串行通訊,全部的數據以位爲單位在SDA線上串行傳輸
2)同步通訊,即雙方工做在同一個時鐘下,通常是通訊的A方經過一根CLK信號線,將A設備的時鐘傳輸到B設備,B設備在A設備傳輸的時鐘下工做。同步通訊的特徵是:通訊線中有CLK。
3)非差分,I2C通訊速率不高,且通訊距離近,使用電平信號通訊。
4)低速率,I2C通常是同一個板子上的兩個IC芯片間通訊,數據量不大,速率低。速率:幾百KHz,速率可能不一樣,不能超過IC的最高速率。
I2C總線上有兩種狀態:
空閒態:沒有設備發生通訊。
忙態:其中一個從設備和主設備通訊,I2C總線被佔用,其餘從設備處於等待狀態。
時序:在通訊中時序是通訊線上按時間順序發生的電平變化,及這些電平變化對通訊的意義。
每一個通訊週期都由一個起始位開始通訊,由一個結束位結束通訊,中間部分是傳遞的數據。
每一個通訊週期,主設備會先發8位的從設備地址(從設備地址由高7位的實際從設備地址和低1位的讀/寫標誌位組成),主設備以廣播的形式發送從設備地址,I2C總線上的全部從設備收到地址後,判斷從設備地址是否匹配,不匹配的從設備繼續等待,匹配的設備發出一個應答信號。
同一時刻,主設備、從設備只能有一個設備發送數據。
I2C總線通信由起始位開始通信,由結束位中止通信,並釋放I2C總線。起始位和結束位都由主設備發出。
起始位(S):在SCL爲高電平時,SDA由高電平變爲低電平
結束位(P):在SCL爲高電平時,SDA由低電平變爲高電平
以下圖所示:
I2C數據以字節(即8bits)爲單位傳輸,每一個字節傳輸完後都會有一個ACK應答信號。應答信號的時鐘是由主設備產生的。
應答(ACK):拉低SDA線,並在SCL爲高電平期間保持SDA線爲低電平
非應答(NOACK):不要拉低SDA線(此時SDA線爲高電平),並在SCL爲高電平期間保持SDA線爲高電平
在傳輸期間,若是從設備來不及處理主設備發送的數據,從設備會保持SCL線爲低電平,強迫主設備等待從設備釋放SCL線,直到從設備處理完後,釋放SCL線,接着進行數據傳輸。
以下圖所示:
開始數據傳輸後,先發送一個起始位(S),主設備發送一個地址數據(由7bit的從設備地址,和最低位的寫標誌位組成的8bit字節數據,該讀寫標誌位決定數據的傳輸方向),而後,主設備釋放SDA線,並等待從設備的應答信號(ACK)。每個字節數據的傳輸都要跟一個應答信號位。數據傳輸以中止位(P)結束,而且釋放I2C總線。
開始通信時,主設備先發送一個起始信號(S),主設備發送一個地址數據(由7bit的從設備地址,和最低位的寫標誌位組成的8bit字節數據),而後,主設備釋放SDA線,並等待從設備的應答信號(ACK),從設備應答主設備後,主設備再發送要讀取的寄存器地址,從設備應答主設備(ACK),主設備再次發送起始信號(Sr),主設備發送設備地址(包含讀標誌),從設備應答主設備,並將該寄存器的值發送給主設備;
讀取單字節數據:
主設備要讀取的數據,若是是隻有一個字節的數值,就要結束應答,主設備要先發送一個非應答信號(NOACK),再發送結束信號(P);
讀取多字節數據:
主設備要讀取的數據,若是是大於一個字節的多個數據,就發送ACK應答信號(ACK),而不是非應答信號(NOACK),而後主設備再次接收從設備發送的數據,依次類推,直到主設備讀取的數值是最後一個字節數據後,須要主設備給從設備發送非應答信號(NOACK),再發送結束信號(P),結束I2C通信,並釋放I2C總線。
注意:全部的數據傳輸過程當中,SDA線的電平變化必須在SCL爲低電平時進行,SDA線的電平在SCL線爲高電平時要保持穩定不變。以下圖所示:
本文講述了I2C總線的特徵和總線協議,具體的實現方法有兩種:
一種是:I2C總線協議的軟件模擬實現方法。 另外一種是:Linux內核中I2C模塊的實現方法。