到目前為止,我們已經(jīng)討論了 SPI 通信和 UART 通信的基礎(chǔ)知識,現(xiàn)在讓我們討論本系列的最后一個協(xié)議,即集成電路間協(xié)議(I2C)。
如果您曾經(jīng)構(gòu)建過使用 OLED 顯示器 、 氣壓傳感器或陀螺儀/加速度計模塊的項目,您可能會發(fā)現(xiàn)自己正在使用 I2C。
I2C 通信簡介
I2C 結(jié)合了 SPI 和 UART 的最佳特性。使用 I2C,您可以將多個從機(jī)連接到單個主機(jī)(類似 SPI),并且可以讓多個主機(jī)控制一個或多個從機(jī)。當(dāng)您希望使用多個微控制器將數(shù)據(jù)記錄到單個存儲卡或?qū)⑽谋撅@示到單個 LCD 時,這非常有用。
與 UART 通信一樣,I2C 僅使用兩根線在設(shè)備之間傳輸數(shù)據(jù):

SDA(串行數(shù)據(jù)) ——主機(jī)和從機(jī)發(fā)送和接收數(shù)據(jù)的線路。
I2C 是一種串行通信協(xié)議,因此數(shù)據(jù)沿著單根線(SDA 線)逐位傳輸。
與 SPI 類似,I2C 也是同步的,因此位的輸出與位的采樣通過主機(jī)和從機(jī)共享的時鐘信號同步。該時鐘信號始終由主機(jī)控制。

I2C 的工作原理
使用 I2C 時,數(shù)據(jù)以消息形式傳輸。 消息被分解成數(shù)據(jù)幀 。每條消息包含一個地址幀(包含從設(shè)備的二進(jìn)制地址)以及一個或多個數(shù)據(jù)幀(包含正在傳輸?shù)臄?shù)據(jù))。消息還包含起始和停止條件、讀/寫位以及每個數(shù)據(jù)幀之間的 ACK/NACK 位:

起始條件: 在 SCL 線從高電平切換為低電平之前, SDA 線從高電平切換為低電平。
停止條件: SCL 線從低電平變?yōu)楦唠娖胶螅?SDA 線也從低電平變?yōu)楦唠娖健?/strong>
地址幀: 每個從機(jī)獨有的 7 位或 10 位序列,用于在主機(jī)想要與從機(jī)對話時識別該從機(jī)。
讀/寫位: 單個位指定主機(jī)是否向從機(jī)發(fā)送數(shù)據(jù)(低電壓電平)或向從機(jī)請求數(shù)據(jù)(高電壓電平)。
ACK/NACK 位: 消息中的每一幀后面都有一個確認(rèn)/不確認(rèn)位。如果成功接收地址幀或數(shù)據(jù)幀,接收設(shè)備會向發(fā)送方返回一個 ACK 位。
尋址
I2C 沒有像 SPI 那樣的從機(jī)選擇線,因此它需要另一種方式讓從機(jī)知道數(shù)據(jù)正在發(fā)送給它,而不是其他從機(jī)。它通過尋址來實現(xiàn)這一點。地址幀始終是新消息中起始位之后的第一個幀。
主設(shè)備將其想要通信的從設(shè)備的地址發(fā)送給與其連接的每個從設(shè)備。然后,每個從設(shè)備將主設(shè)備發(fā)送的地址與其自身的地址進(jìn)行比較。如果地址匹配,則向主設(shè)備發(fā)送一個低電壓 ACK 位。如果地址不匹配,則從設(shè)備不執(zhí)行任何操作,SDA 線保持高電平。
讀/寫位
地址幀末尾包含一個位,用于告知從機(jī)主設(shè)備是要向其寫入數(shù)據(jù)還是從其接收數(shù)據(jù)。如果主設(shè)備要向從機(jī)發(fā)送數(shù)據(jù),則讀/寫位為低電平。如果主設(shè)備正在向從機(jī)請求數(shù)據(jù),則該位為高電平。
數(shù)據(jù)框
主機(jī)檢測到從機(jī)的 ACK 位后,即可準(zhǔn)備發(fā)送第一個數(shù)據(jù)幀。
數(shù)據(jù)幀始終為 8 位長,并以最高有效位優(yōu)先發(fā)送。每個數(shù)據(jù)幀后緊接著一個 ACK/NACK 位,用于驗證該幀是否已成功接收。主設(shè)備或從設(shè)備(取決于發(fā)送數(shù)據(jù)的設(shè)備)必須接收到 ACK 位,才能發(fā)送下一個數(shù)據(jù)幀。
所有數(shù)據(jù)幀發(fā)送完畢后,主機(jī)可以向從機(jī)發(fā)送停止條件,以停止傳輸。停止條件是指 SCL 線電壓由低變高后,SDA 線電壓由低變高,而 SCL 線電壓保持高電平。
I2C 數(shù)據(jù)傳輸步驟
1、主機(jī)通過將 SDA 線從高電平切換到低電平, 然后將 SCL 線從高電平切換到低電平,向每個連接的從機(jī)發(fā)送啟動條件:
2、主設(shè)備向每個從設(shè)備發(fā)送其想要與之通信的從設(shè)備的 7 位或 10 位地址,以及讀/寫位:
3、每個從機(jī)將主機(jī)發(fā)送的地址與自身地址進(jìn)行比較。如果地址匹配,從機(jī)將 SDA 線拉低一位,返回 ACK 位。如果主機(jī)發(fā)送的地址與從機(jī)自身的地址不匹配,從機(jī)將 SDA 線保持高電平。
4.主機(jī)發(fā)送或接收數(shù)據(jù)幀:

5、每個數(shù)據(jù)幀傳輸完成后,接收設(shè)備都會向發(fā)送方返回另一個 ACK 位,以確認(rèn)成功接收該幀:
6、要停止數(shù)據(jù)傳輸,主機(jī)在切換 SDA 為高之前,通過將 SCL 切換為高來向從機(jī)發(fā)送停止條件:
單主多從
由于 I2C 使用尋址技術(shù),因此一個主設(shè)備可以控制多個從設(shè)備。使用 7 位地址,可以提供 128(2 ^7 )個唯一地址。使用 10 位地址并不常見,但可以提供 1,024(2 ^10 )個唯一地址。要將多個從設(shè)備連接到一個主設(shè)備,請按如下方式連接它們,并使用 4.7K 歐姆上拉電阻將 SDA 和 SCL 線連接到 Vcc:

多主多從
多個主設(shè)備可以連接到一個或多個從設(shè)備。同一系統(tǒng)中多個主設(shè)備的問題在于,當(dāng)兩個主設(shè)備嘗試同時通過 SDA 線發(fā)送或接收數(shù)據(jù)時。為了解決這個問題,每個主設(shè)備在發(fā)送消息之前都需要檢測 SDA 線是低電平還是高電平。如果 SDA 線為低電平,則表示另一個主設(shè)備已控制總線,該主設(shè)備應(yīng)等待發(fā)送消息。如果 SDA 線為高電平,則表示可以安全發(fā)送消息。要將多個主設(shè)備連接到多個從設(shè)備,請使用下圖,并使用 4.7K 歐姆上拉電阻將 SDA 和 SCL 線連接到 Vcc:

I2C 的優(yōu)點和缺點
與其他協(xié)議相比,I2C 有很多方面可能聽起來比較復(fù)雜,但有一些很好的理由可以解釋為什么您可能想或不想使用 I2C 來連接特定設(shè)備:
優(yōu)點
僅使用兩根電線
支持多主多從
ACK/NACK 位確認(rèn)每個幀已成功傳輸
硬件比 UART 簡單
著名且廣泛使用的協(xié)議
缺點
數(shù)據(jù)傳輸速率比 SPI 慢
數(shù)據(jù)幀的大小限制為8位
實現(xiàn)所需的硬件比 SPI 更復(fù)雜
-
通信
+關(guān)注
關(guān)注
18文章
6391瀏覽量
140037 -
主機(jī)
+關(guān)注
關(guān)注
0文章
1053瀏覽量
36741 -
I2C
+關(guān)注
關(guān)注
28文章
1556瀏覽量
131215
發(fā)布評論請先 登錄
i2c總線是什么意思 i2c通信咋樣 i2c通信的詳細(xì)講解
【NuMaker-M2354試用】I2C測試分享
I2C的簡介
I2C總線的原理是什么
i2c總線相關(guān)知識
I2C總線控制系統(tǒng)的構(gòu)成_I2C總線控制系統(tǒng)的特點
I2C總線物理拓?fù)浣Y(jié)構(gòu)_I2C總線協(xié)議解析
你不能不知的I2C總線
I2C的通信時序應(yīng)用案例解析
I2C 為什么只要兩根線就能搞定通信?
評論