常用總線協議基礎(I2C)


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

>特點:

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

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

簡單有效,支持多主控。

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

>物理接口

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

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

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

>通信

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

如下圖所示:

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

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

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

如下圖所示:

 

 

這個圖示為向地址為0x51的EEPROM進行寫2個字節的數據0x50和0x0F.

一個I2C過程由“起始”開始, 接着是我們要通信的設備的地址,有一位標記此操作是“讀”還是“寫”;要讀取或寫入的“數據”,最后是個“終止”位。

還有其它的一些細節,比如在每個字節傳輸以后需要一個”應答“位,參看波形圖。

 

 

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

 

 

【其他】

I2C的數據傳輸速率位於串口和SPI之間,大部分I2C設備支持100KHz和400KHz模式。使用I2C傳輸數據會有一些額外消耗:每發送8bits數據,就需要額外1bit的元數據(ACK或NACK)。I2C支持雙向數據交換,由於僅有一根數據線,故通信是半雙工的。
硬件復雜度也位於串口和SPI之間,而軟件實現可以相當簡單。

 如果兩個master都想在同一條空閑總線上傳輸,此時必須能夠使用某種機制來選擇將總線控制權交給哪個master,這是通過時鍾同步和仲裁來完成的,而被迫讓出控制權的master則需要等待總線空閑后再繼續傳輸。在單一master的系統上無需實現時鍾同步和仲裁。

 

參考博客################################################

本文非原創,只是個人了解的資料整理:

1.https://www.cnblogs.com/microxiami/p/8527464.html

2.https://zhuanlan.zhihu.com/p/137568249

3.https://zhuanlan.zhihu.com/p/26579936

4.https://www.stepfpga.com/doc/i2c

5.https://blog.csdn.net/jasonchen_gbd/article/details/77431951


免責聲明!

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



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