【总线】一文看懂 I2C 通信协议
目錄
?
I2C 總線(xiàn)協(xié)議概述
參數(shù)總結(jié)
I2C 的工作原理
尋址
讀/寫(xiě)位
數(shù)據(jù)幀
I2C數(shù)據(jù)傳輸?shù)牟襟E
具有多個(gè)從機(jī)的單個(gè)主機(jī)
具有多個(gè)從機(jī)的多個(gè)主機(jī)
I2C的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
缺點(diǎn)
?
I2C 總線(xiàn)協(xié)議概述
I2C 總線(xiàn)廣泛應(yīng)用在 OLED 顯示器、氣壓傳感器或陀螺儀/加速度計(jì)模塊的項(xiàng)目。
I2C結(jié)合了SPI和UART的最佳功能。使用I2C,可以將多個(gè)從機(jī)連接到單個(gè)主機(jī)(如SPI),并且可以讓多個(gè)主機(jī)控制單個(gè)或多個(gè)從機(jī)。當(dāng)希望有多個(gè)微控制器將數(shù)據(jù)記錄到單個(gè)存儲(chǔ)卡或?qū)⑽谋撅@示到單個(gè)LCD時(shí),這非常有用。
與UART通信一樣,I2C僅使用兩根線(xiàn)在設(shè)備之間傳輸數(shù)據(jù):
SDA(串行數(shù)據(jù)):主機(jī)和從機(jī)發(fā)送和接收數(shù)據(jù)的線(xiàn)路。
SCL(串行時(shí)鐘):傳輸時(shí)鐘信號(hào)的線(xiàn)路。
I2C是一種串行通信協(xié)議,因此數(shù)據(jù)沿著單線(xiàn)(SDA線(xiàn))逐位傳輸。
與SPI一樣,I2C是同步的,因此位的輸出通過(guò)主機(jī)和從機(jī)之間共享的時(shí)鐘信號(hào)與位采樣同步。時(shí)鐘信號(hào)始終由主站控制。
參數(shù)總結(jié)
| 所需的線(xiàn)數(shù) | 2 |
| 最大的速率 | 標(biāo)準(zhǔn)模式:100kbps 快速模式:400kbps 高速模式:3.4Mbps 極速模式:5Mbps |
| 同步或異步 | 同步 |
| 串行或并行 | 串行 |
| 主機(jī)的最大個(gè)數(shù) | 沒(méi)有限制 |
| 從機(jī)的最大個(gè)數(shù) | 1008 |
I2C 的工作原理
使用I2C,數(shù)據(jù)在消息中傳輸。?消息被分解為數(shù)據(jù)幀。每條消息都有一個(gè)地址幀,其中包含從機(jī)的二進(jìn)制地址,以及一個(gè)或多個(gè)包含正在傳輸?shù)臄?shù)據(jù)的數(shù)據(jù)幀。該消息還包括每個(gè)數(shù)據(jù)幀之間的開(kāi)始和停止條件、讀/寫(xiě)位和 ACK/NACK 位:
?
啟動(dòng)條件:SCL線(xiàn)路從高電平切換到低電平之前,SDA線(xiàn)路從高電平切換到低電平。
停止條件:SCL線(xiàn)路從低電平切換到高電平后,SDA線(xiàn)路從低電平切換到高電平。
地址幀:每個(gè)從機(jī)唯一的 7 位或 10 位序列,當(dāng)主機(jī)想要與其通信時(shí),該序列標(biāo)識(shí)從機(jī)。
讀/寫(xiě)位:?指定主機(jī)是向從機(jī)(低電平)發(fā)送數(shù)據(jù)還是從中請(qǐng)求數(shù)據(jù)(高電平)的單個(gè)位。
ACK/NACK 位:消息中的每個(gè)幀后跟一個(gè)確認(rèn)/不確認(rèn)位。如果成功接收地址幀或數(shù)據(jù)幀,則從接收方向發(fā)送方返回 ACK 位。
尋址
I2C沒(méi)有像SPI那樣的從屬選擇線(xiàn),因此它需要另一種方式讓從機(jī)知道數(shù)據(jù)正在發(fā)送給它,而不是另一個(gè)從機(jī)站。它通過(guò)尋址來(lái)做到這一點(diǎn)。地址幀始終是新消息中起始位之后的第一個(gè)幀。
主機(jī)將它想要與之通信的從機(jī)的地址發(fā)送給連接到它的每個(gè)從機(jī)。然后,每個(gè)從機(jī)將從主機(jī)發(fā)送的地址與其自己的地址進(jìn)行比較。如果地址匹配,則將低電平ACK位發(fā)送回主機(jī)。如果地址不匹配,則從機(jī)不執(zhí)行任何操作,并且 SDA 線(xiàn)路保持高電平。
讀/寫(xiě)位
地址幀在末尾包含一個(gè)位,通知從機(jī)是要向其寫(xiě)入數(shù)據(jù)還是從中讀出數(shù)據(jù)。如果主機(jī)要向從機(jī)寫(xiě)數(shù)據(jù),讀/寫(xiě)位為低電平。如果主站從從站讀數(shù)據(jù),則該位為高電平。
數(shù)據(jù)幀
在主機(jī)檢測(cè)到來(lái)自從機(jī)的ACK位后,第一個(gè)數(shù)據(jù)幀就可以發(fā)送了。
數(shù)據(jù)幀的長(zhǎng)度始終為 8 位,并且首先發(fā)送最高有效位。每個(gè)數(shù)據(jù)幀后緊跟一個(gè) ACK/NACK 位,以驗(yàn)證是否已成功接收該幀。在發(fā)送下一個(gè)數(shù)據(jù)幀之前,ACK位必須由主機(jī)或從機(jī)接收(取決于發(fā)送數(shù)據(jù)的人)。
發(fā)送完所有數(shù)據(jù)幀后,主機(jī)可以向從機(jī)發(fā)送停止條件以停止傳輸。停止條件是 SCL 線(xiàn)路上的電平從低到高的電壓轉(zhuǎn)換之后,在 SDA 線(xiàn)路上的電平從低到高的轉(zhuǎn)換,而SCL 線(xiàn)路保持高電平。
I2C數(shù)據(jù)傳輸?shù)牟襟E
1. 主機(jī)將啟動(dòng)條件從高電平切換至低電平,將SDA線(xiàn)路從高電平切換至低電平,將啟動(dòng)條件發(fā)送到每個(gè)連接的從機(jī):
?
?
2. 主機(jī)向每個(gè)從機(jī)發(fā)送它想要與之通信的從機(jī)的7位或10位地址,以及讀/寫(xiě)位:
?
3. 每個(gè)從機(jī)將主機(jī)發(fā)送的地址與自己的地址進(jìn)行比較。如果地址匹配,則從機(jī)通過(guò)將SDA線(xiàn)拉低一位來(lái)返回ACK位。如果來(lái)自主機(jī)的地址與從機(jī)自己的地址不匹配,則從機(jī)將 SDA 線(xiàn)路保持不變維持在高電平。
?
4. 主機(jī)發(fā)送或接收數(shù)據(jù)幀:
?
5. 傳輸完每個(gè)數(shù)據(jù)幀后,接收方向發(fā)送方返回另一個(gè)ACK位,以確認(rèn)成功接收幀:
?
6.為了停止數(shù)據(jù)傳輸,主機(jī)通過(guò)在將SDA切換為高電平之前將SCL切換為高電平向從站發(fā)送停止條件:
具有多個(gè)從機(jī)的單個(gè)主機(jī)
由于I2C使用尋址,因此可以從單個(gè)主機(jī)控制多個(gè)從機(jī)。對(duì)于 7 位地址,可以使用 128 (2^7) 個(gè)唯一地址。使用 10 位地址的情況不常見(jiàn),但提供 1,024 (2^10) 個(gè)唯一地址。要將多個(gè)從站連接到單個(gè)主站,要像圖中這樣連接它們,使用4.7KΩ上拉電阻器將SDA和SCL線(xiàn)路連接到Vcc:
?
具有多個(gè)從機(jī)的多個(gè)主機(jī)
多個(gè)主站可以連接到單個(gè)從機(jī)或多個(gè)從機(jī)。當(dāng)兩個(gè)主機(jī)嘗試通過(guò)SDA線(xiàn)路同時(shí)發(fā)送或接收數(shù)據(jù)時(shí),同一系統(tǒng)中多個(gè)主機(jī)的問(wèn)題就出現(xiàn)了。為了解決這個(gè)問(wèn)題,每個(gè)主機(jī)都需要在傳輸消息之前檢測(cè)SDA線(xiàn)是低還是高。如果 SDA 線(xiàn)路較低,則意味著另一個(gè)主機(jī)控制總線(xiàn),主機(jī)應(yīng)等待發(fā)送消息。如果 SDA 線(xiàn)路較高,則傳輸消息是安全的。要將多個(gè)主機(jī)連接到多個(gè)從機(jī),要像圖中這樣連接它們,使用4.7KΩ上拉電阻器將SDA和SCL線(xiàn)路連接到Vcc:
?
I2C的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 僅使用兩根電線(xiàn)
- 支持多個(gè)主機(jī)和多個(gè)從機(jī)
- ACK/NACK 位確認(rèn)每幀都已成功傳輸
- 硬件比 UART 更簡(jiǎn)單
- 眾所周知且廣泛使用的協(xié)議
缺點(diǎn)
- 數(shù)據(jù)傳輸速率比 SPI 慢
- 數(shù)據(jù)幀的大小限制為8位
- 需要實(shí)現(xiàn)比SPI更復(fù)雜的硬件
?常見(jiàn)總線(xiàn)匯總
【總線(xiàn)】一文看懂 UART 通信協(xié)議
?
總結(jié)
以上是生活随笔為你收集整理的【总线】一文看懂 I2C 通信协议的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第六集 MSF构思阶段项目团队的组建
- 下一篇: Coolite Toolkit入门指南