
I2C通信協(xié)議基礎(chǔ) 3.1通信簡(jiǎn)介 I2C(Inter-Integrated Circuit),中文應(yīng)該叫集成電路總線,它是一種串行通信總線,使用多主從架構(gòu),是由飛利浦公司在1980年代初設(shè)計(jì)的,方便了主板、嵌入式系統(tǒng)或手機(jī)與周邊設(shè)備組件之間的通訊。由于其簡(jiǎn)單性,它被廣泛用于微控制器與傳感器陣列,顯示器,IoT設(shè)備,EEPROM等之間的通信。結(jié)合了SPI和UART的最佳功能。使用,您可以將多個(gè)從機(jī)連接到單個(gè)主機(jī)(類似SPI),另外,您可以讓多個(gè)主機(jī)控制單個(gè)或多個(gè)從機(jī)。當(dāng)您希望多個(gè)微控制器將數(shù)據(jù)記錄到單個(gè)存儲(chǔ)卡或?qū)⑽谋撅@示到單個(gè)LCD時(shí),這個(gè)特性就非常有用了。與UART通信一樣,僅使用兩根電線在設(shè)備之間傳輸數(shù)據(jù):
SDA (Serial Data) –這條線為主機(jī)和從機(jī)提供數(shù)據(jù)發(fā)送和接收功能。SCL (Serial Clock) –這條線為時(shí)鐘信號(hào)線。與SPI一樣,I2C是同步的,因此位的輸出通過(guò)主機(jī)和從機(jī)之間共享的時(shí)鐘信號(hào)同步到位的采樣。時(shí)鐘信號(hào)總是由主機(jī)控制。
(資料圖)
使用線數(shù) | 2 |
最大速度 | 標(biāo)準(zhǔn)模式(Standardmode) =100kbps |
快速模式(Fastmode) =400kbps | |
高速模式(Highspeed mode)=3.4Mbps | |
超快速模式(Ultrafast mode)=5Mbps | |
同步/異步 | 同步 |
串行/并行 | 串行 |
最大主機(jī)數(shù) | 不限制 |
最大從機(jī)數(shù) | 1008 |
3.2 的工作原理(HOW WORKS)
使用 ,數(shù)據(jù)在消息中傳輸。消息被分解成數(shù)據(jù)幀。每條消息都有一個(gè)地址幀,其中包含從機(jī)的二進(jìn)制地址,以及一個(gè)或多個(gè)包含正在傳輸數(shù)據(jù)的數(shù)據(jù)幀。該消息還包括每個(gè)數(shù)據(jù)幀之間的啟動(dòng)和停止條件、讀/寫(xiě)位以及ACK/NACK位:
啟動(dòng)條件(StartCondition):SDA 線在SCL線從高到低切換之前從高電位切換到低電位。
停止條件(StopCondition):SDA 線在SCL線從低到高切換之后從低電位切換到高電位。
地址幀(AddressFrame):每個(gè)從機(jī)都有唯一的7位或10位數(shù)列,主機(jī)可以通過(guò)該序列識(shí)別從機(jī),主機(jī)如果需要向從機(jī)發(fā)送/接收數(shù)據(jù),首先要發(fā)送對(duì)應(yīng)從機(jī)的地址,然后會(huì)匹配總線上掛載的從機(jī)的地址。
讀/寫(xiě)位(Read/Write Bit):指定主機(jī)是向從機(jī)發(fā)送數(shù)據(jù)(低電位)還是請(qǐng)求從機(jī)發(fā)送數(shù)據(jù)(高電位)的1個(gè)位。
ACK/NACK位(ACK/NACK Bit):在一條消息中,每一幀后都跟隨1個(gè)確認(rèn)應(yīng)答(ACK)/非確認(rèn)應(yīng)答(NACK)位。如果一個(gè)地址幀或數(shù)據(jù)幀是被成功接收,一個(gè)確認(rèn)應(yīng)答位(ACK bit)將從接收設(shè)備返回給發(fā)送設(shè)備。
3.3 尋址(ADDRESSING)
沒(méi)有像SPI這樣的從機(jī)片選接口線,所以它需要另一種方式讓從機(jī)知道數(shù)據(jù)被發(fā)送到它,而不是另一個(gè)從機(jī)。它需要通過(guò)尋址來(lái)實(shí)現(xiàn)。地址幀始終是新消息中開(kāi)始位后的第一幀。
主機(jī)將它想要與之溝通的從機(jī)的地址發(fā)送給與之相連的每一個(gè)從機(jī)。然后,每個(gè)從機(jī)將從主機(jī)發(fā)送的地址與自己的地址進(jìn)行比較。如果地址匹配,它會(huì)向主發(fā)送低電壓ACK位。如果地址不匹配,從機(jī)什么都不做,SDA線仍然很高。
3.4 讀/寫(xiě)位(READ/WRITE BIT)
在地址幀的末尾包含一個(gè)單獨(dú)的位,用于通知從機(jī),主機(jī)是否想向它寫(xiě)數(shù)據(jù)還是想從它接收數(shù)據(jù)。如果主機(jī)要將數(shù)據(jù)發(fā)送給從機(jī),讀/寫(xiě)位是低電位;如果主機(jī)請(qǐng)求來(lái)自從機(jī)的數(shù)據(jù),則該位為高電位1。
3.5 數(shù)據(jù)幀(THE DATA FRAME)
在主機(jī)檢測(cè)到從機(jī)發(fā)出的ACK位后,第一個(gè)數(shù)據(jù)幀已準(zhǔn)備好發(fā)送。
數(shù)據(jù)幀始終為8位長(zhǎng),并且首先發(fā)送最重要的位。每個(gè)數(shù)據(jù)幀后面都立即有ACK/NACK 位,以驗(yàn)證幀是否已成功接收。在發(fā)送下一個(gè)數(shù)據(jù)幀之前,主機(jī)或從機(jī)(取決于誰(shuí)發(fā)送數(shù)據(jù))必須接收ACK位。
在發(fā)送完所有數(shù)據(jù)幀后,主機(jī)可以向從機(jī)發(fā)送停止條件以停止傳輸。停止條件是在SCL線路上從低到高過(guò)渡后,SDA線的電壓從低到高過(guò)渡,SCL線保持高位。
3.6 數(shù)據(jù)傳輸?shù)牟襟E(STEPS OF I2C DATATRANSMISSION)
1. 主機(jī)發(fā)送啟動(dòng)條件給每一個(gè)連接的從機(jī),在SCL線從高到低切換之前,主機(jī)將SDA線從高切換到低電平即可觸發(fā)啟動(dòng)條件,即在SCL高電平時(shí)候給SDA一個(gè)下降沿,如下圖所示,注意箭頭的時(shí)序方向:
2. 主機(jī)發(fā)送它想與之溝通的7位或10位從機(jī)地址,以及讀/寫(xiě)位:
3. 每個(gè)從機(jī)將從主機(jī)發(fā)送的地址與自己的地址進(jìn)行比較。如果地址匹配,則從機(jī)通過(guò)將SDA 線拉低1個(gè)位來(lái)返回ACK位。如果主機(jī)的地址與從機(jī)自己的地址不匹配,則從機(jī)會(huì)將SDA線留在高電位(通過(guò)上拉電阻)。地址匹配的從機(jī)返回ACK位如下圖所示:
4.主機(jī)發(fā)送或接收數(shù)據(jù)幀:
5. 傳輸每個(gè)數(shù)據(jù)幀后,接收設(shè)備會(huì)將另一個(gè)ACK 位返回給發(fā)件人,以確認(rèn)成功接收幀:
6. 為了停止數(shù)據(jù)傳輸,主機(jī)發(fā)送一個(gè)停止條件給從機(jī),通過(guò)在SDA拉高之前先拉高SCL,即在SCL高電平時(shí)候給SDA一個(gè)上升沿,如下圖所示,注意箭頭表示的傳輸順序:
3.7 單主機(jī)與多從機(jī)(SINGLE MASTER WITH MULTIPLE SLAVES)
由于 使用尋址,因此可以實(shí)現(xiàn)單個(gè)主機(jī)控多個(gè)從機(jī)。使用7位地址理論上可提供 128(2^7)個(gè)唯一地址。使用10位地址并不常見(jiàn),但理論上可提供1024(2^10)個(gè)唯一地址。要將多個(gè)從機(jī)連接到單個(gè)主機(jī),請(qǐng)像下面這樣將它們連接起來(lái),并用4.7K Ohm上拉式電阻器將SDA和SCL線連接到Vcc:
3.8 多主機(jī)與多從機(jī)(MULTIPLE MASTERSWITH MULTIPLE SLAVES)
多個(gè)主機(jī)可以連接到一個(gè)單一的從機(jī)或多個(gè)從機(jī)。在多主機(jī)系統(tǒng)總,當(dāng)兩個(gè)主機(jī)嘗試同時(shí)通過(guò)SDA線發(fā)送或接收數(shù)據(jù)時(shí),問(wèn)題就出現(xiàn)了。為了解決這個(gè)問(wèn)題,每個(gè)主機(jī)在傳輸消息之前需要檢測(cè)SDA線是低電平還是高電平。如果SDA線為低電平,則意味著另一個(gè)主機(jī)正控制著總線,該主機(jī)應(yīng)等待發(fā)送消息。如果SDA線被拉高,則傳輸消息是安全的。
要將多個(gè)主機(jī)連接到多個(gè)從機(jī),請(qǐng)按下圖連接,并使用4.7K Ohm上拉式電阻器將SDA和 SCL線連接到Vcc:
3.9 的優(yōu)缺點(diǎn)(ADVANTAGES AND DISADVANTAGES OF )
優(yōu)勢(shì)
僅使用兩根電線
支持多個(gè)主和多個(gè)奴隸
ACK/NACK 位確認(rèn)每個(gè)幀都成功傳輸
硬件不如UART復(fù)雜
眾所周知和廣泛使用的協(xié)議
缺點(diǎn)
數(shù)據(jù)傳輸速率低于SPI
數(shù)據(jù)框架的大小限制為8位
實(shí)現(xiàn)所需的硬件比SPI更復(fù)雜
3.10 總結(jié)
總線由9bit的塊構(gòu)成。開(kāi)始條件:當(dāng)SCL是高電平時(shí)候SDA從高到底跳變的下降沿,作為開(kāi)始條件。在總線上的所有從機(jī)都要開(kāi)始注意了:
地址位為緊跟開(kāi)始條件的7bit數(shù)據(jù),主機(jī)想要與該地址從機(jī)溝通:
讀寫(xiě)位為緊跟7bit地址后的第8位作為讀寫(xiě)選擇位:該位用于表示主機(jī)是想讀從機(jī)的數(shù)據(jù)還是想往從機(jī)里寫(xiě)數(shù)據(jù):為1表示讀;為0表示寫(xiě)。
主機(jī)和從機(jī)之間的同步位:0表示ACK;1表示NACK。0:我在或數(shù)據(jù)已接收。1:沒(méi)有我或數(shù)據(jù)未接收。
數(shù)據(jù)字節(jié):在地址字節(jié)后的8位是來(lái)自主機(jī)或從機(jī)的數(shù)據(jù)字節(jié)。至于來(lái)自誰(shuí),要看讀寫(xiě)位。當(dāng)寫(xiě)周期,主機(jī)發(fā)送數(shù)據(jù);當(dāng)讀周期,從機(jī)發(fā)送數(shù)據(jù):
停止條件:當(dāng)SCL是高電平時(shí),數(shù)據(jù)線SDA從低電平跳變到高電平產(chǎn)生的上升沿作為停止條件。主機(jī)通知從機(jī)本次溝通結(jié)束。
完整的 總線協(xié)議時(shí)序如下圖所示:
3.11 備注本筆記圖中帶箭頭的表示時(shí)序傳遞的優(yōu)先順序,箭頭表示數(shù)據(jù)傳輸?shù)姆较蚧蛳劝l(fā)生的時(shí)序。1.10小結(jié)沒(méi)有標(biāo)注箭頭,以左側(cè)作為先發(fā)生的時(shí)序,請(qǐng)勿與前面的圖弄混。審核編輯:湯梓紅
標(biāo)簽: