I2C總線通訊協議


I2C總線通訊協議

1. I2C總線簡介

I2C是Inter-Integrated Circuit的簡稱,讀作:I-squared-C。由飛利浦公司於1980年代提出,為了讓主板、嵌入式系統或手機用以連接低速周邊外部設備而發展。

主要用途:

SOC和周邊外設間的通信(如:EEPROM,電容觸摸芯片,各種Sensor等)。

1.1 物理接口

I2C總線只使用兩條雙向漏極開路的信號線(串行數據線:SDA,及串行時鍾線:SCL),並利用電阻上拉。I2C總線僅僅使用SCL、SDA兩根信號線,就實現了設備間的數據交互,極大地簡化了對硬件資源和PCB板布線空間的占用。I2C總線廣泛應用在EEPROM、實時時鍾、LCD、及其他芯片的接口。I2C允許相當大的工作電壓范圍,典型的電壓基准為:+3.3V或+5V。

SCL(Serial Clock):串行時鍾線,傳輸CLK信號,一般是主設備向從設備提供
SDA(Serial Data):串行數據線,傳輸通信數據

I2C總線接口內部結構如下圖所示:

I2C總線接口內部結構

I2C使用一個7bit的設備地址,一組總線最多和112個節點通信。最大通信數量受限於地址空間及400pF的總線電容。

常見的I2C總線以傳輸速率的不同分為不同的模式:標准模式(100Kbit/s)、低速模式(10Kbit/s)、快速模式(400Kbit/s)、高速模式(3.4Mbit/s),時鍾頻率可以被下降到零,即暫停通信。

該總線是一種多主控總線,即可以在總線上放置多個主設備節點,在停止位(P)發出后,即通訊結束后,主設備節點可以成為從設備節點。

主設備節點:產生時鍾並發起通信的設備節點
從設備節點:接收時鍾並響應主設備節點尋址的設備節點

 1)I2C通信雙方地位不對等,通信由主設備發起,並主導傳輸過程,從設備按I2C協議接收主設備發送的數據,並及時給出響應。
 2)主設備、從設備由通信雙方決定(I2C協議本身無規定),既能當主設備,也能當從設備(需要軟件進行配置)。
 3)主設備負責調度總線,決定某一時刻和哪個從設備通信。同一時刻,I2C總線上只能有一對主設備、從設備通信。
 4)每個I2C從設備在I2C總線通訊中有一個I2C從設備地址,該地址唯一,是從設備的固有屬性,通信中主設備通過從設備地址來找到從設備。

I2C總線多主設備結構如下圖所示:

I2C總線多主設備結構

1.2 通訊特征

串行、同步、非差分、低速率

1)串行通信,所有的數據以位為單位在SDA線上串行傳輸
2)同步通信,即雙方工作在同一個時鍾下,一般是通信的A方通過一根CLK信號線,將A設備的時鍾傳輸到B設備,B設備在A設備傳輸的時鍾下工作。同步通信的特征是:通信線中有CLK。
3)非差分,I2C通信速率不高,且通信距離近,使用電平信號通信。
4)低速率,I2C一般是同一個板子上的兩個IC芯片間通信,數據量不大,速率低。速率:幾百KHz,速率可能不同,不能超過IC的最高速率。

1.3 I2C總線狀態

I2C總線上有兩種狀態:

空閑態:沒有設備發生通信。
忙態:其中一個從設備和主設備通信,I2C總線被占用,其他從設備處於等待狀態。

2. I2C總線通信協議

時序:在通信中時序是通信線上按時間順序發生的電平變化,及這些電平變化對通信的意義。

每個通信周期都由一個起始位開始通信,由一個結束位結束通信,中間部分是傳遞的數據。

每個通信周期,主設備會先發8位的從設備地址(從設備地址由高7位的實際從設備地址和低1位的讀/寫標志位組成),主設備以廣播的形式發送從設備地址,I2C總線上的所有從設備收到地址后,判斷從設備地址是否匹配,不匹配的從設備繼續等待,匹配的設備發出一個應答信號。

同一時刻,主設備、從設備只能有一個設備發送數據。

2.1 起始位和結束位

I2C總線通訊由起始位開始通訊,由結束位停止通訊,並釋放I2C總線。起始位和結束位都由主設備發出。
起始位(S):在SCL為高電平時,SDA由高電平變為低電平
結束位(P):在SCL為高電平時,SDA由低電平變為高電平

如下圖所示:

I2C的起始位與停止位

2.2 數據格式與應答

I2C數據以字節(即8bits)為單位傳輸,每個字節傳輸完后都會有一個ACK應答信號。應答信號的時鍾是由主設備產生的。

應答(ACK):拉低SDA線,並在SCL為高電平期間保持SDA線為低電平
非應答(NOACK):不要拉低SDA線(此時SDA線為高電平),並在SCL為高電平期間保持SDA線為高電平

在傳輸期間,如果從設備來不及處理主設備發送的數據,從設備會保持SCL線為低電平,強迫主設備等待從設備釋放SCL線,直到從設備處理完后,釋放SCL線,接着進行數據傳輸。

如下圖所示:

I2C的數據格式與應答信號

2.3 數據傳輸通訊

1)寫數據

開始數據傳輸后,先發送一個起始位(S),主設備發送一個地址數據(由7bit的從設備地址,和最低位的寫標志位組成的8bit字節數據,該讀寫標志位決定數據的傳輸方向),然后,主設備釋放SDA線,並等待從設備的應答信號(ACK)。每一個字節數據的傳輸都要跟一個應答信號位。數據傳輸以停止位(P)結束,並且釋放I2C總線。

2)讀數據

開始通訊時,主設備先發送一個起始信號(S),主設備發送一個地址數據(由7bit的從設備地址,和最低位的寫標志位組成的8bit字節數據),然后,主設備釋放SDA線,並等待從設備的應答信號(ACK),從設備應答主設備后,主設備再發送要讀取的寄存器地址,從設備應答主設備(ACK),主設備再次發送起始信號(Sr),主設備發送設備地址(包含讀標志),從設備應答主設備,並將該寄存器的值發送給主設備;

讀取單字節數據
主設備要讀取的數據,如果是只有一個字節的數值,就要結束應答,主設備要先發送一個非應答信號(NOACK),再發送結束信號(P);
讀取多字節數據
主設備要讀取的數據,如果是大於一個字節的多個數據,就發送ACK應答信號(ACK),而不是非應答信號(NOACK),然后主設備再次接收從設備發送的數據,依次類推,直到主設備讀取的數值是最后一個字節數據后,需要主設備給從設備發送非應答信號(NOACK),再發送結束信號(P),結束I2C通訊,並釋放I2C總線。

I2C的數據傳輸

注意:所有的數據傳輸過程中,SDA線的電平變化必須在SCL為低電平時進行,SDA線的電平在SCL線為高電平時要保持穩定不變。如下圖所示:

I2C數據位變化與時鍾線關系

3. 總結

本文講述了I2C總線的特征和總線協議,具體的實現方法有兩種:

一種是:I2C總線協議的軟件模擬實現方法
另一種是:Linux內核中I2C模塊的實現方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM