"也許你聽(tīng)說(shuō)過(guò)I2C,或者你也正在使用I2C,但你有沒(méi)有了解過(guò)什么是I2C?I2C是如何工作的?讓我們一起了解一下什么是I2C?以及它的工作原理吧!"
什么是I2C
I2C(Inter-Integrated Circuit)是一種使用多主從結(jié)構(gòu)的串行通信總線。它是由飛利浦在20世紀(jì)80年代初設(shè)計(jì)的。I2C對(duì)于主板、嵌入式系統(tǒng)或手機(jī)和外圍元件之間的通信是很方便的。由于其簡(jiǎn)單性,I2C被廣泛用于微控制器和傳感器、顯示器、物聯(lián)網(wǎng)設(shè)備、EEPROM等的通信。I2C由兩條線組成,SCL和SDA,這兩條數(shù)據(jù)線需要連接到上拉電阻,當(dāng)總線處于空閑狀態(tài)時(shí),SCL和SDA處于高電平,I2C總線按照一定的協(xié)議工作。
接下來(lái),讓我們看一下I2C協(xié)議。I2C支持多個(gè)從屬設(shè)備,也就是說(shuō),多個(gè)I2C從屬設(shè)備可以連接到一個(gè)I2C控制器上。這些不同的I2C從屬設(shè)備有不同的設(shè)備地址,這樣I2C主控制器可以通過(guò)I2C設(shè)備的設(shè)備地址訪問(wèn)指定的設(shè)備地址,一條I2C總線連接多個(gè)I2C設(shè)備,如圖所示:
SDA和SCL鏈接必須連接到一個(gè)上拉電阻,通常是4.7KΩ。其余的I2C從機(jī)與SDA和SCL線相連接,這樣就可以通過(guò)SDA和SCL線訪問(wèn)多個(gè)I2C設(shè)備。
I2C的特點(diǎn)
1. 只需要一條數(shù)據(jù)線SDA和一條時(shí)鐘線SCL,SDA(串行數(shù)據(jù)線)和SCL(串行時(shí)鐘線)都是雙向的I/O線
SCL(串行時(shí)鐘):串行時(shí)鐘線,用于傳輸CLK信號(hào),一般由主設(shè)備提供給從設(shè)備
SDA(串行數(shù)據(jù)):串行數(shù)據(jù)線,傳輸通信數(shù)據(jù)
2. 實(shí)現(xiàn)真正的多主總線,任何設(shè)備都可以同時(shí)作為主設(shè)備和從設(shè)備,但同時(shí)只能有一個(gè)主設(shè)備
3. 可以通過(guò)外部連接進(jìn)行檢測(cè),便于系統(tǒng)故障診斷和調(diào)試
4. 連接在同一總線上的IC只受限于總線的最大電容,串行8位雙向數(shù)據(jù)傳輸比特率在標(biāo)準(zhǔn)模式下可達(dá)100Kbit/s,在快速模式下可達(dá)400Kbit/s,在高速模式下可達(dá)3.4Mbit/s。
5. 總線上消耗的電流非常小。因此,在總線上擴(kuò)展的設(shè)備數(shù)量主要由電容性負(fù)載決定,它可以抵抗高噪音干擾。增加一個(gè)總線驅(qū)動(dòng)器可以使總線電容擴(kuò)大10倍,傳輸距離可以達(dá)到15米;兼容不同電壓等級(jí)的設(shè)備,工作溫度范圍廣
6.接口電路是一個(gè)開(kāi)路輸出。它需要通過(guò)一個(gè)上拉電阻連接到電源VCC。當(dāng)總線處于空閑狀態(tài)時(shí),兩條線都是高電平。連接到總線上的外部器件是CMOS器件。輸出端也是一個(gè)開(kāi)路電路。
CORPORATE CULTURE
數(shù)據(jù)傳輸
主設(shè)備和從設(shè)備遵循以下協(xié)議格式進(jìn)行數(shù)據(jù)傳輸。數(shù)據(jù)在主設(shè)備和從設(shè)備之間通過(guò)SDA數(shù)據(jù)線傳輸0和1的串行數(shù)據(jù),一個(gè)串行數(shù)據(jù)序列的結(jié)構(gòu)可以分為:
起始位
地址位(7bit或10bit)。
讀和寫位(1bit)
響應(yīng)位(1bit)
數(shù)據(jù)位+響應(yīng)位(數(shù)據(jù)位8bit;響應(yīng)位1bit;數(shù)據(jù)+響應(yīng)可反復(fù)多次傳輸,直至遇到停止位)
停止位
啟動(dòng)位
當(dāng)主設(shè)備決定開(kāi)始通信時(shí),它需要發(fā)送一個(gè)啟動(dòng)信號(hào),并需要進(jìn)行以下操作
首先,將SDA從VOH切換到VOL
然后將SCL從VOH切換到VOL
在主設(shè)備發(fā)出信號(hào)和啟動(dòng)條件后,所有的從屬設(shè)備即使在睡眠模式下也會(huì)變得活躍,并等待接收一個(gè)地址位。
地址位
地址位支持7位和10位,如果主站需要向從站發(fā)送/接收數(shù)據(jù),必須先發(fā)送地址,然后從站才會(huì)對(duì)應(yīng),再與安裝在總線上的從站地址相匹配。
響應(yīng)位
響應(yīng)位有2種類型:
ACK:從機(jī)正確接收數(shù)據(jù)或地址位+讀寫位
NACK:從機(jī)不回答,工作不正常。
每次主設(shè)備發(fā)送數(shù)據(jù)和讀寫位時(shí),它將等待從屬設(shè)備的響應(yīng)信號(hào)ACK。
如果從屬設(shè)備發(fā)來(lái)響應(yīng)位信號(hào)ACK
如果沒(méi)有響應(yīng)信號(hào)NACK,SDA將輸出一個(gè)VOH,這將導(dǎo)致主設(shè)備重新啟動(dòng)或停止
數(shù)據(jù)位
每次傳輸?shù)臄?shù)據(jù)總共有8位,由發(fā)送方設(shè)置,它需要將數(shù)據(jù)位傳輸給接收方。
傳輸后有一個(gè)ACK/NACK位,如果接收方成功接收了數(shù)據(jù),從屬方就發(fā)送一個(gè)ACK。否則,從機(jī)發(fā)送一個(gè)NACK。
數(shù)據(jù)可以多次發(fā)送,直到收到一個(gè)停止位。
停止位
當(dāng)主設(shè)備決定結(jié)束通信時(shí),它需要發(fā)送結(jié)束信號(hào),并需要執(zhí)行以下操作。
首先將SDA從VOL切換到VOH
然后SCL從VOH切換到VOL
下面是顯示完成的I2C時(shí)序圖:
SCL線的同步化(時(shí)鐘同步化)
SCL的同步是由于總線線 "AND"(開(kāi)漏輸出)的邏輯功能,也就是說(shuō),只要有一個(gè)節(jié)點(diǎn)發(fā)送低電平,總線就會(huì)顯示為低電平。只有當(dāng)所有節(jié)點(diǎn)都發(fā)送高電平時(shí),總線才能出現(xiàn)高電平。正是由于線路 "AND "邏輯功能的原理,當(dāng)多個(gè)節(jié)點(diǎn)同時(shí)發(fā)送時(shí)鐘信號(hào)時(shí),總線上會(huì)顯示一個(gè)統(tǒng)一的時(shí)鐘信號(hào),這就是SCL的同步原理。
CORPORATE CULTURE
SDA仲裁
SDA仲裁
SDA線的仲裁也是基于總線具有線路 "AND "邏輯功能的原則。節(jié)點(diǎn)發(fā)送1位數(shù)據(jù)后,比較總線上呈現(xiàn)的數(shù)據(jù)是否與它發(fā)送的內(nèi)容一致(類似于CAN總線的回讀機(jī)制),一致繼續(xù)發(fā)送否則退出競(jìng)爭(zhēng)。SDA線的仲裁可以確保I2C總線系統(tǒng)正常通信,當(dāng)多個(gè)主節(jié)點(diǎn)試圖同時(shí)控制總線時(shí),數(shù)據(jù)不會(huì)丟失。總線系統(tǒng)通過(guò)仲裁只允許一個(gè)主節(jié)點(diǎn)繼續(xù)占用總線。
仲裁過(guò)程
DATA1和DATA2分別是主節(jié)點(diǎn)發(fā)送給總線的數(shù)據(jù)信號(hào),SDA是總線上呈現(xiàn)的數(shù)據(jù)信號(hào),SCL是總線上呈現(xiàn)的時(shí)鐘信號(hào)。當(dāng)主節(jié)點(diǎn)1和2同時(shí)發(fā)送啟動(dòng)信號(hào)時(shí),兩個(gè)主節(jié)點(diǎn)都發(fā)送高電平信號(hào),這時(shí),總線上的信號(hào)為高電平,兩個(gè)主節(jié)點(diǎn)檢測(cè)到總線上的信號(hào)與自己發(fā)送的信號(hào)相同,繼續(xù)發(fā)送數(shù)據(jù)。在第二個(gè)時(shí)鐘周期,兩個(gè)主節(jié)點(diǎn)都發(fā)送低電平信號(hào),總線上呈現(xiàn)的信號(hào)為低電平,繼續(xù)發(fā)送數(shù)據(jù)。在第3個(gè)時(shí)鐘周期,主節(jié)點(diǎn)1發(fā)送一個(gè)高電平信號(hào),而主節(jié)點(diǎn)2發(fā)送一個(gè)低電平信號(hào),根據(jù)總線的 "AND "線的邏輯功能,總線上的信號(hào)是低電平。這時(shí),主節(jié)點(diǎn)1檢測(cè)到總線上的數(shù)據(jù)與自己發(fā)送的數(shù)據(jù)不同,并斷開(kāi)數(shù)據(jù)的輸出階段,轉(zhuǎn)向從機(jī)接收狀態(tài),這樣主節(jié)點(diǎn)2贏得了總線數(shù)據(jù)沒(méi)有丟失,即總線上的數(shù)據(jù)與主節(jié)點(diǎn)2發(fā)送的數(shù)據(jù)相同,主節(jié)點(diǎn)1轉(zhuǎn)為從節(jié)點(diǎn)后繼續(xù)接收數(shù)據(jù),也沒(méi)有丟失SDA線。因此在仲裁過(guò)程中,數(shù)據(jù)不會(huì)丟失。
小結(jié):SDA仲裁和SCL時(shí)鐘同步處理不是順序進(jìn)行的,而是同時(shí)進(jìn)行的。在實(shí)際使用中,I2C很容易出現(xiàn)死鎖。有兩種常見(jiàn)的情況會(huì)發(fā)生死鎖:
一種情況是,當(dāng)從屬設(shè)備回復(fù)ACK時(shí),主設(shè)備異常復(fù)位。
另一種情況是,當(dāng)從屬設(shè)備回復(fù)的數(shù)據(jù)位為0時(shí),主設(shè)備異常復(fù)位。
這兩種情況的相同點(diǎn)是,當(dāng)主設(shè)備被異常復(fù)位時(shí),SDA處于被從屬設(shè)備拉低的狀態(tài),而SCL在主設(shè)備復(fù)位后處于VOH(空閑狀態(tài))。此時(shí),從設(shè)備將等待主設(shè)備將SCL拉低,以獲取ACK或數(shù)據(jù)位,而主設(shè)備將等待從設(shè)備釋放SDA線。主設(shè)備和從設(shè)備互相等待,在空中互相對(duì)視,進(jìn)入死鎖狀態(tài)。
下面是一些解決死鎖問(wèn)題的常用方法:主設(shè)備檢測(cè)到SDA線后,從設(shè)備就會(huì)釋放SDA線。
主設(shè)備檢測(cè)到SDA被拉低超過(guò)一段時(shí)間后,會(huì)主動(dòng)復(fù)位從設(shè)備釋放SDA。這種方法的前提是,從屬設(shè)備有一個(gè)復(fù)位引腳,MCU可以控制從屬設(shè)備的復(fù)位引腳使其復(fù)位。
在主設(shè)備檢測(cè)到SDA被拉低超過(guò)一段時(shí)間后,它向時(shí)鐘總線推送9個(gè)時(shí)鐘,并占用從屬設(shè)備的ACK位,這樣從屬設(shè)備就會(huì)釋放SDA到一個(gè)VOH。
在主設(shè)備和從設(shè)備之間串聯(lián)一個(gè)I2C緩沖器,它可以自動(dòng)檢測(cè)死鎖情況。當(dāng)檢測(cè)到死鎖時(shí),它將主動(dòng)斷開(kāi)與主設(shè)備的連接,并向從設(shè)備發(fā)送9個(gè)時(shí)鐘。在從屬設(shè)備釋放SDA線后,它將重新與主設(shè)備建立連接。
I2C死鎖問(wèn)題不能從根本上避免,除了由MCU的異常復(fù)位引起的I2C死鎖外,在正常的通信過(guò)程中,從屬設(shè)備也可能異常地拉下SDA而引起死鎖。因此,當(dāng)死鎖發(fā)生時(shí),軟件應(yīng)設(shè)計(jì)成能夠從死鎖中恢復(fù),從而使I2C通信能夠繼續(xù)。
CORPORATE CULTURE 時(shí)鐘拉伸
時(shí)鐘拉伸
什么是I2C時(shí)鐘拉伸?在I2C的主從通信過(guò)程中,總線上的SCL時(shí)鐘總是由主站產(chǎn)生和控制,但如果從站不能跟上主站的速度,I2C協(xié)議規(guī)定從站可以拉低SCL時(shí)鐘線。傳輸會(huì)暫停,直到從機(jī)釋放SCL線,然后繼續(xù)傳輸。
時(shí)鐘拉伸是從屬設(shè)備的一個(gè)可選配置。如果不啟用,從機(jī)不能控制SCL;如果啟用,從機(jī)可以通過(guò)強(qiáng)行將SCL拉低來(lái)降低傳輸速度。在SCL為VOL的期間,主機(jī)只能等待從機(jī)釋放SCL。
CORPORATE CULTURE
重復(fù)啟動(dòng)
有時(shí),主站需要在一次通信中進(jìn)行多次信息交換,如與不同的從站傳輸信息,或切換讀寫操作,而又不想在此期間被其他主站干擾,那么可以使用 "重復(fù)啟動(dòng)條件"--在一次通信中,主站可以產(chǎn)生多個(gè)啟動(dòng)條件來(lái)完成多個(gè)信息交換,最后產(chǎn)生一個(gè)停止條件來(lái)結(jié)束整個(gè)通信過(guò)程。由于在此期間沒(méi)有停止條件,所以主站一直占據(jù)著竊聽(tīng)器,而其他主站無(wú)法切換進(jìn)來(lái)。
CORPORATE CULTURE
下面是UART、I2c和SPI之間的區(qū)別
你可能想知道,這三種通信方式中哪一種是最好的?是UART、I2C,還是SPI?
實(shí)際是沒(méi)有最好的通信外設(shè),每個(gè)通信外設(shè)都有自己的優(yōu)點(diǎn)和缺點(diǎn)。
因此,用戶應(yīng)該選擇最適合他們項(xiàng)目的通信外設(shè)。例如,如果你想要最快的通信外設(shè),SPI將是最理想的。另一方面,如果用戶想連接多個(gè)設(shè)備而又不太復(fù)雜,I2C將是最理想的,因?yàn)樗梢赃B接多達(dá)127個(gè)設(shè)備,而且易于管理。
以下是一些支持I2C通信協(xié)議的產(chǎn)品:
Seeeduino XIAO 系列
所有支持I2C、UART或SPI的XIAO系列單片機(jī),這里有鏈接你可以查看Seeed Studio XIAO系列產(chǎn)品。
以下是XIAO系列的一些特點(diǎn)
拇指大小的外形尺寸,只有20×17.5毫米。專為空間受限的情況而制造。
多達(dá)11個(gè)可用IO支持多種接口,包括模擬、數(shù)字、IIC、UART、SPI等。
強(qiáng)大的內(nèi)核,性能強(qiáng)大,適合多樣化和復(fù)雜的應(yīng)用。
輕松地將XIAO集成到其他板子上,實(shí)現(xiàn)大規(guī)模生產(chǎn)。
Wio Terminal
Wio Terminal是一個(gè)基于ATSAMD51的微控制器,具有藍(lán)牙和Wi-Fi無(wú)線連接功能,由Realtek RTL8720DN提供支持,與Arduino和MicroPython兼容。
以下是Wio終端的一些特點(diǎn)
強(qiáng)大的MCU:Microchip ATSAMD51P19的ARM Cortex-M4F內(nèi)核,運(yùn)行頻率為120MHz。
可靠的無(wú)線連接:配備Realtek RTL8720DN,雙頻2.4Ghz/5Ghz Wi-Fi
完整的系統(tǒng)配備有屏幕+開(kāi)發(fā)板+輸入/輸出接口+外殼
與樹莓派40針兼容的GPIO,可以作為樹莓派的外圍設(shè)備進(jìn)行安裝
支持Arduino、CircuitPython、Micropython、ArduPy(什么是ArduPy)、AT固件、Visual Studio代碼
支持USB OTG
CORPORATE CULTURE
寫在最后
I2C(Inter-Integrated circuit)協(xié)議是電子傳輸信號(hào)中常用的一種協(xié)議。
它是一種兩線式串行雙向總線,用于連接微控制器和外部設(shè)備,也因?yàn)樗璧囊_數(shù)只需要兩條(CLK和DATA),硬件實(shí)現(xiàn)簡(jiǎn)單,可擴(kuò)展性強(qiáng),所以被廣泛應(yīng)用于系統(tǒng)內(nèi)多個(gè)集成電路IC間的通信。
審核編輯:湯梓紅
-
控制器
+關(guān)注
關(guān)注
114文章
17116瀏覽量
184436 -
通信協(xié)議
+關(guān)注
關(guān)注
28文章
1036瀏覽量
41192 -
總線
+關(guān)注
關(guān)注
10文章
2961瀏覽量
89798 -
I2C
+關(guān)注
關(guān)注
28文章
1541瀏覽量
127927 -
SDA
+關(guān)注
關(guān)注
0文章
125瀏覽量
28840
原文標(biāo)題:網(wǎng)絡(luò)通信 | I2C通信協(xié)議及其工作原理
文章出處:【微信號(hào):ChaiHuoMakerSpace,微信公眾號(hào):柴火創(chuàng)客空間】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
I2C總線的工作原理和應(yīng)用


i2c通信協(xié)議
I2C總線通信協(xié)議的相關(guān)資料下載
I2C總線協(xié)議及其應(yīng)用

I2C通信協(xié)議應(yīng)該如何學(xué)習(xí)

I2C通信協(xié)議:了解I2C Primer、 PMBus和SMBus

評(píng)論