I2C總線(xiàn)是由Philips公司開(kāi)發(fā)的一種簡(jiǎn)單、雙向二線(xiàn)制同步串行總線(xiàn)。它只需要兩根線(xiàn)即可傳送信息。它結(jié)合了SPI和UART的優(yōu)點(diǎn),您可以將多個(gè)從機(jī)連接到單個(gè)主機(jī)(如SPI那樣),也可以使用多個(gè)主機(jī)控制一個(gè)或多個(gè)從機(jī)。當(dāng)您想讓多個(gè)微控制器將數(shù)據(jù)記錄到單個(gè)存儲(chǔ)卡或?qū)⑽谋撅@示到單個(gè)LCD時(shí),這將非常有用。
*SDA * (Serial Data) – 數(shù)據(jù)線(xiàn)。
***SCL ***(Serial Clock) – 時(shí)鐘線(xiàn)。
I2C是串行通信協(xié)議,因此數(shù)據(jù)沿著SDA一點(diǎn)一點(diǎn)地傳輸。與SPI一樣,I2C也需要時(shí)鐘同步信號(hào)且時(shí)鐘始終由主機(jī)控制。
I2C的數(shù)據(jù)傳輸是以多個(gè)msg的形式進(jìn)行,每個(gè)msg都包含從機(jī)的二進(jìn)制 地址幀 ,以及一個(gè)或多個(gè) 數(shù)據(jù)幀 ,還包括開(kāi)始條件和 停止條件 ,讀/寫(xiě)位和數(shù)據(jù)幀之間的 ACK / NACK位 :
啟動(dòng)條件 : 當(dāng)SCL是高電平時(shí),SDA從高電平向低電平切換。
停止條件 : 當(dāng)SCL是高電平時(shí),SDA由低電平向高電平切換。
地址幀 : 每個(gè)從屬設(shè)備唯一的7位或10位序列,用于主從設(shè)備之間的地址識(shí)別。
讀/寫(xiě)位 : 一位,如果主機(jī)是向從機(jī)發(fā)送數(shù)據(jù)則為低電平,請(qǐng)求數(shù)據(jù)則為高電平。
ACK/NACK : 消息中的每個(gè)幀后均帶有一個(gè)ACK/NACK位。如果成功接收到地址幀或數(shù)據(jù)幀,接收設(shè)備會(huì)返回一個(gè)ACK位用于表示確認(rèn)。
尋址
由于I2C沒(méi)有像SPI那樣的片選線(xiàn),因此它需要使用另一種方式來(lái)確認(rèn)某一個(gè)從設(shè)備,而這個(gè)方式就是 —— **尋址 **。
主機(jī)將要通信的從機(jī)地址發(fā)送給每個(gè)從機(jī),然后每個(gè)從機(jī)將其與自己的地址進(jìn)行比較。如果地址匹配,它將向主機(jī)發(fā)送一個(gè)低電平ACK位。如果不匹配,則不執(zhí)行任何操作,SDA線(xiàn)保持高電平。
讀/寫(xiě)位
地址幀的末尾包含一個(gè)讀/寫(xiě)位。如果主機(jī)要向從機(jī)發(fā)送數(shù)據(jù),則為低電平。如果是主機(jī)向從機(jī)請(qǐng)求數(shù)據(jù),則為高電平。
數(shù)據(jù)幀
當(dāng)主機(jī)檢測(cè)到從機(jī)的ACK位后,就可以發(fā)送第一個(gè)數(shù)據(jù)幀了。數(shù)據(jù)幀始終為8位,每個(gè)數(shù)據(jù)幀后緊跟一個(gè)ACK / NACK位,來(lái)驗(yàn)證接收狀態(tài)。當(dāng)發(fā)送完所有數(shù)據(jù)幀后,主機(jī)可以向從機(jī)發(fā)送停止條件來(lái)終止通信。
傳輸步驟
- 在SCL線(xiàn)為高電平時(shí),主機(jī)通過(guò)將SDA線(xiàn)從高電平切換到低電平來(lái)啟動(dòng)總線(xiàn)通信。
- 主機(jī)向總線(xiàn)發(fā)送要與之通信的從機(jī)的7位或10位地址,以及讀/寫(xiě)位:
- 每個(gè)從機(jī)將主機(jī)發(fā)送的地址與其自己的地址進(jìn)行比較。如果地址匹配,則從機(jī)通過(guò)將SDA線(xiàn)拉低一位返回一個(gè)ACK位。如果主機(jī)的地址與從機(jī)的地址不匹配,則從機(jī)將SDA線(xiàn)拉高。
- 主機(jī)發(fā)送或接收數(shù)據(jù)幀:
- 傳輸完每個(gè)數(shù)據(jù)幀后,接收設(shè)備將另一個(gè)ACK位返回給發(fā)送方,以確認(rèn)已成功接收到該幀:
- 隨后主機(jī)將SCL切換為高電平,然后再將SDA切換為高電平,從而向從機(jī)發(fā)送停止條件。
單個(gè)主機(jī)VS多個(gè)從機(jī)
由于I2C使用尋址功能,可以通過(guò)一個(gè)主機(jī)控制多個(gè)從機(jī)。使用7位地址時(shí),最多可以使用128(2 ^7^ )個(gè)唯一地址。使用10位地址并不常見(jiàn),但可以提供1,024(2 ^10^ )個(gè)唯一地址。如果要將多個(gè)從機(jī)連接到單個(gè)主機(jī)時(shí),請(qǐng)使用4.7K歐的上拉電阻將它們連接,例如將SDA和SCL線(xiàn)連接到Vcc:
多個(gè)主機(jī)VS多個(gè)從機(jī)
I2C支持多個(gè)主機(jī)同時(shí)與多個(gè)從機(jī)相連,當(dāng)兩個(gè)主機(jī)試圖通過(guò)SDA線(xiàn)路同時(shí)發(fā)送或接收數(shù)據(jù)時(shí),就會(huì)出現(xiàn)問(wèn)題。因此每個(gè)主機(jī)都需要在發(fā)送消息之前檢測(cè)SDA線(xiàn)是低電平還是高電平。如果SDA線(xiàn)為低電平,則意味著另一個(gè)主機(jī)正在控制總線(xiàn)。如果SDA線(xiàn)高,則可以安全地發(fā)送數(shù)據(jù)。如果要將多個(gè)主機(jī)連接到多個(gè)從機(jī),請(qǐng)使用4.7K歐的上拉電阻將SDA和SCL線(xiàn)連接到Vcc:
優(yōu)劣
與其他協(xié)議相比,I2C可能聽(tīng)起來(lái)很復(fù)雜。以下是一些利弊,可幫助您確定它們是否適合您的項(xiàng)目需求:
優(yōu)點(diǎn)
- 僅使用兩根電線(xiàn)
- 支持多個(gè)主機(jī)和多個(gè)從機(jī)
- ACK / NACK位用于確認(rèn)每個(gè)幀都已成功傳輸
- 硬件比UART更簡(jiǎn)單
- 眾所周知且被廣泛使用的協(xié)議
缺點(diǎn)
- 數(shù)據(jù)傳輸速率比SPI慢
- 數(shù)據(jù)幀的大小限制為8位
-
lcd
+關(guān)注
關(guān)注
34文章
4438瀏覽量
168306 -
SPI
+關(guān)注
關(guān)注
17文章
1721瀏覽量
92057 -
I2C總線(xiàn)
+關(guān)注
關(guān)注
8文章
406瀏覽量
61157
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論