I2C(或IIC)代表IC間通信,是流行的微控制器通信協(xié)議之一。I2C通常用于與傳感器通信,但也可用于許多其他應用。I2C 是一種同步協(xié)議,這意味著它有一條時鐘線(有關同步和異步通信的更多信息,請參閱我們關于該主題的文章)。
I2C 通信
雖然 I2C 只使用兩條通信線(時鐘和數(shù)據),但它可以在同一條 I2C 總線上容納多個設備;這是通過使用尋址方案實現(xiàn)的,總線上的每個設備都有一個唯一的地址。通信開始時,首先要發(fā)送通信所針對的設備地址,然后被尋址的設備必須確認它已存在并準備好進行通信。
由于只有一條數(shù)據線(SDA - 串行數(shù)據)用于發(fā)送和接收數(shù)據(半雙工),因此需要一種方案,使通信中的主設備和從設備都能控制數(shù)據線,而不會發(fā)生沖突。必須避免總線沖突,即一個設備試圖向總線寫入高電平,而另一個設備試圖向總線寫入低電平,這將造成短路。
為了實現(xiàn)這一目標,我們采用了一種開漏方案,即任一設備只能將總線驅動為 "低 "或以其他方式 "釋放",而上拉電阻則用于在總線釋放時將線路拉高(如果你不熟悉開漏或上拉電阻這兩個術語,請參閱我們的相關文章)。時鐘線(SCL - 串行時鐘)也采用了這種方案,并使用一些創(chuàng)新技術為 I2C 協(xié)議添加了一些有用的功能--稍后將詳細介紹。
下圖說明了 I2C 通信序列的典型特征:

通信開始時,I2C 總線處于空閑狀態(tài)--時鐘線和數(shù)據線均無驅動,因此被上拉電阻器拉高。然后,主設備(啟動通信的設備)首先將 SDA 線拉高,然后將 SCL 線拉低,從而啟動通信--這被定義為啟動條件。
接著,主站傳輸希望與之通信的設備的 7 位地址,然后是一個 "讀或寫 入"位,表示主站希望向設備寫入 (0) 還是從設備讀取 (1)。數(shù)據線在時鐘線的上升沿被視為有效(從設備讀取),數(shù)據先傳輸最重要位(MSB)(如果你不熟悉 "最小有效位 "和 "最重要位 "這兩個術語,可以本文閱讀更多內容)。
地址傳輸完成后,假定被尋址的從屬設備存在于 I2C 總線上,主設備將釋放數(shù)據線(漏極開路),從屬設備將在一個時鐘周期內保持數(shù)據線低電平,以確認(ack)其存在并準備通信。如果從屬設備不在總線上,則上拉電阻會將數(shù)據線拉高,主設備就知道從屬設備不可用。
在這個階段,數(shù)據可在主站和從站之間傳輸。如果正在讀取數(shù)據,則從站將傳輸數(shù)據(同時主站繼續(xù)驅動時鐘線);如果正在寫入數(shù)據,則主站將傳輸數(shù)據。每個數(shù)據字節(jié)后都有一個 Ack 位,在此期間,接收器(可能是主站,也可能是從站,取決于哪一方傳輸數(shù)據)應將數(shù)據線保持為低電平,以表示它已接收到通信(并已準備好進行下一次通信,如果適用的話。)
時鐘拉伸
I2C 總線上的從屬設備可以通過將時鐘 (SCL) 線保持為低電平來延遲響應(如果它們仍在忙并且尚未準備好響應),這種功能被稱為 "時鐘拉伸";一旦準備好響應,從屬設備就會釋放時鐘線并繼續(xù)數(shù)據傳輸。這與 UART 的流量控制線(CTS/RTS)類似,但不需要額外的通信線路(注意 SPI 協(xié)議沒有流量控制功能)。

一個或多個數(shù)據字節(jié)可依次傳送,每個字節(jié)后都會出現(xiàn)一個應答。

重復啟動
由于從屬設備可能有許多可讀取的值(如多個傳感器讀數(shù)值以及設置值),因此從屬設備可能要求主設備在進行實際讀取之前,首先寫入一條指令,說明要讀取的內容。在這種情況下,主站將首先發(fā)出一條寫入指令,其中的數(shù)據就是要讀取的內容,然后主站將立即發(fā)出讀取指令。但在這中間不會發(fā)出停止,而是主站使用重復啟動條件(隨后是 7 位地址和 1 位讀/寫位,顯然現(xiàn)在已設置為讀取)來實現(xiàn)從寫入到讀取的切換。要發(fā)出重復啟動,主站首先將數(shù)據線置高,然后將時鐘線置低,最后將數(shù)據線置低,再將時鐘線置高。

數(shù)據速率和距離
I2C 總線上的通信速度通常為 100kHz 或 400kHz。這些相對較低的速度可滿足少量數(shù)據傳輸?shù)男枰?SPI(使用 MHz 范圍內的時鐘,可能采用雙模式或四模式)通常是需要傳輸大量數(shù)據的高吞吐量應用的首選。I2C 通常只用于相對較短的通信距離,但也有通過差分對傳輸 I2C 以實現(xiàn)較長距離通信的方案(有關差分對的更多信息,請參閱我們有關高速設計的文章)。
Proteus 包括一個雙模式(主模式或從模式)I2C 協(xié)議分析儀,你可以將其放置在原理圖上并布線。然后,你就鍵入 I2C 序列并將其注入到正在運行的仿真中,并可以查看從 I2C 總線上的其他設備接收到的數(shù)據包。這是一個出色的教學工具,可以快速、輕松地測試主模式和從模式固件。你會發(fā)現(xiàn)許多示例設計都包括與傳感器或多處理器項目的 I2C 通信,這些都可以在演示版中進行模擬。
本文章版權歸英國Labcenter公司所有,由廣州風標電子提供翻譯,原文鏈接如下:https://www.labcenter.com/blog/sim-i2c-protocol/