一、什么是I2C協(xié)議
I2C是由Philips開發(fā)的簡單的雙向兩線總線,在深入淺出理解SPI協(xié)議中,我們區(qū)分了單工,半雙工,全雙工協(xié)議數(shù)據(jù)流向的區(qū)別,根據(jù)特征,I2C協(xié)議屬于半雙工協(xié)議(即同一時刻,數(shù)據(jù)單向流動)。此外,I2C也是一種可以多主設(shè)備,多從設(shè)備的總線協(xié)議,通過地址索引,I2C可以使能所需從設(shè)備,I2C的出現(xiàn)主要是用來實現(xiàn)不同集成電路組件之間的控制功能,比如通過I2C協(xié)議,連接MCU與LCD驅(qū)動器,遠(yuǎn)程I/O口,RAM,EEPROM或數(shù)據(jù)轉(zhuǎn)換器。
二、I2C,SPI,UART協(xié)議的區(qū)別
作者按照順序,依次完成了UART,SPI,I2C協(xié)議,因為這三種協(xié)議都屬于低速通用協(xié)議接口,因此作者將這三種協(xié)議放在一塊進(jìn)行比較,誠然,這些協(xié)議經(jīng)過數(shù)十年的發(fā)展,衍生出了很多新版本,擁有了很多新特性,但他們的基本通信方式?jīng)]變,因此我們僅比較他們的基本版本,得到如下表格,當(dāng)然特性太多,也未必絕對準(zhǔn)確,僅供初學(xué)者參考。

重點解釋一下UART,SPI,I2C這三個協(xié)議的選通方式,作者覺得很有意思。
對于UART來說,正常來說是沒有辦法滿足一個主設(shè)備,多個從設(shè)備的通信,它的通信方式最為簡單,最低只需要一根線即可完成通信,協(xié)議本身并不允許外接多個從設(shè)備,但是我們也可以通過比如485轉(zhuǎn)接、增加二極管的方式來進(jìn)行多從設(shè)備選擇(電路層面的設(shè)計內(nèi)容,不是數(shù)字IC需要考慮的內(nèi)容)。
其次是SPI協(xié)議,它有一個專門的NSS端口,默認(rèn)拉低來選擇所需的從設(shè)備。
最后是I2C協(xié)議,每個主設(shè)備和每個從設(shè)備都對應(yīng)一個地址,通信的時候先發(fā)送地址信號,若一致,則被選中。
三、I2C的信號線
I2C僅需要兩根信號線即可完成通信,如下圖所示。除此以外,I2C的信號線需要連接上拉電路,有關(guān)上拉電阻的大小,是電路設(shè)計工程師需要操心的事,不歸Digital IC Design Engineer管,就不在這里贅述了。

SDA(Serial Data) :串行數(shù)據(jù)線,用來傳輸數(shù)據(jù)信號。
SCL(Serial Clock):串行時鐘線,用來傳輸時鐘信號,一般是主設(shè)備向從設(shè)備提供。
四、I2C的連接方式
I2C的連接的連接形式非常靈活,可以是單主設(shè)備,單從設(shè)備,也可以是單主設(shè)備,多從設(shè)備,還可以是多主設(shè)備,多從設(shè)備。
4.1 單主設(shè)備,單從設(shè)備

4.2 單主設(shè)備,多從設(shè)備

4.3 多主設(shè)備,多從設(shè)備

五、I2C的數(shù)據(jù)傳輸格式
5.1 空閑位
空閑時SDA與SCL默認(rèn)都是高電平,對應(yīng)于主設(shè)備狀態(tài)機IDLE(默認(rèn)態(tài))時的輸出為高

5.2 起始位
SCL為高電平的時候 ,主設(shè)備控制SDA從1到0,為起始位,進(jìn)入起始位后,SCL按照始終的要求進(jìn)行翻轉(zhuǎn)
從設(shè)備接收到起始位信息,狀態(tài)機發(fā)生跳變,等待地址信號的輸入

從設(shè)備在這里需要使用到下降沿檢測電路,作為狀態(tài)機跳變的控制信號,詳情可參考作者之前的文章?!緮?shù)字IC手撕代碼】Verilog邊沿檢測電路
5.3 地址位與讀寫控制
主設(shè)備按照從高到低的順序,依次發(fā)送地址位,從設(shè)備進(jìn)行接收,通常情況下,地址位為7bit,讀寫選擇為1bit。每個從設(shè)備有且只有一個唯一的地址編號,依靠著這個編號,確定主設(shè)備具體與哪一個從設(shè)備進(jìn)行通信。

同時,為了確保采樣時信號穩(wěn)定,對于主設(shè)備,我們在下降沿的時候?qū)⑿盘柗旁赟DA上,對于從設(shè)備,我們在上升沿的時候進(jìn)行采樣。
對于讀寫控制位來說如果主設(shè)備需要將數(shù)據(jù)發(fā)送到從設(shè)備,則該位設(shè)置為 0;如果主設(shè)備需要往從設(shè)備接收數(shù)據(jù),則將其設(shè)置為 1 。即寫為0,讀為1。
5.4 應(yīng)答位(ACK/NACK)
發(fā)送了標(biāo)題為5.3的8bit后,主機釋放對SDA的控制權(quán),由于上拉電阻的作用這個時候SDA默認(rèn)為高電平,從機接管SDA的控制權(quán),假如從機正確的接收了數(shù)據(jù),會將SDA拉低,假如沒有正確的接收數(shù)據(jù),在從設(shè)備的控制下,SDA依舊為高電平。
讀者在這里會發(fā)現(xiàn),同一個SDA,怎么主設(shè)備也能控制,從設(shè)備也能控制呢?這里涉及到了inout雙向端口的相關(guān)問題,可以參考作者的這篇文章進(jìn)行解讀和理解通俗易懂的帶你解讀inout雙向端口
5.4.1 正確接收數(shù)據(jù)(ACK)
正確接收,SDA由從設(shè)備拉低

5.4.2 未正確接收數(shù)據(jù)(NACK)
未正確接收,SDA依舊為高電平

5.5 數(shù)據(jù)位
當(dāng)我們成功收到ACK信號后,就可以正式傳輸數(shù)據(jù)位了,每一次默認(rèn)傳輸一個字節(jié)(即8bit),每個字節(jié)的傳輸都需要跟一個應(yīng)答位(ACK/NACK)

5.6 停止位
SCL先拉高,在SCL為高電平的時候,SDA從低到高,即為停止位,此后,I2C協(xié)議重新進(jìn)入到空閑狀態(tài)。這里使用了上升沿檢測電路,原理同起始位的下降沿檢測電路

5.7 總結(jié)

首先為起始位S(start),接著傳輸?shù)刂?位SLAVE ADDRESS和1位讀寫控制信號R/W,再往后8位8位的傳輸數(shù)據(jù)位,每個字節(jié)緊跟ACK信號,最后為停止位
所有的陰影部分,都是主設(shè)備在操作總線,而A對應(yīng)的ACK,則為從設(shè)備在操作總線。
六、I2C可配置變量
6.1 傳輸模式
標(biāo)準(zhǔn)模式(Standard):100kbps
快速模式(Fast):400kbps
快速模式+(Fast-Plus):1Mbps
高速模式(High-speed):3.4Mbps
超快模式(Ultra-Fast):5Mbps(單向傳輸)
提起不同速度的傳輸模式,讀者首先想到的可能是指SCK的頻率,這沒有錯,但是絕不僅限于此,為了獲得更高的傳輸速率,除開芯片設(shè)計工程師外,電路的設(shè)計人員需要認(rèn)真思考諸如“負(fù)載電容,上拉電阻的大小”等更偏向于電路設(shè)計或模擬設(shè)計的內(nèi)容。
6.2 地址位寬
標(biāo)準(zhǔn)I2C:七位尋址
擴(kuò)展I2C:十位尋址
每個主設(shè)備或者從設(shè)備都能對應(yīng)一個唯一的地址,大多數(shù)情況下,7位的地址,已經(jīng)夠用了。但是也可以對其進(jìn)行擴(kuò)展,轉(zhuǎn)變?yōu)?0位地址,多出來的3位地址相當(dāng)于提供了8倍潛在設(shè)備數(shù)量,同時,按照NXP2021版的I2C協(xié)議規(guī)定,10位地址的從設(shè)備,和7位地址的從設(shè)備,都可以掛在一個總線上,彼此相互兼容,不過,客觀來講,10位尋址的I2C不常用,7位尋址的I2C協(xié)議就足夠大家日常使用了。
6.3 設(shè)備地址
每個主設(shè)備與從設(shè)備需要設(shè)置互不相同的七位地址或十位地址。
等等等等
七、I2C的仲裁機制
7.1 SCL同步問題
總線天生帶線與邏輯,即總線的幾個輸入端,任意有一個拉低,總線表現(xiàn)為低電平,全部位高電平時,總線才是高電平,真值表如下所示。

假設(shè)有兩個主設(shè)備都想拉低SCL信號,Master1先拉低 ,Master2后拉低,那么SCL會按照CLK1的時間來拉低自身(線與邏輯的應(yīng)用),而假如Master1先拉高,Master2后拉高,SCL又會按照CLK2的時間來拉高自身。
因此:當(dāng)多個節(jié)點同時發(fā)送時鐘信號時,在總線上表現(xiàn)的是統(tǒng)一的時鐘信號。這就是SCL的同步原理

7.2 SDA仲裁問題
設(shè)想一種多主設(shè)備,多從設(shè)備的情況
假如在空閑狀態(tài)時,兩個主設(shè)備先后想要操控I2C總線(相隔時間很短),I2C豈不是會發(fā)生錯誤(數(shù)據(jù)紊亂等),如何解決這個問題呢?
我們可以采取仲裁機制,同樣應(yīng)用到總線的線與邏輯,在箭頭所指的位置,SCL上升沿到來,對SDA上的數(shù)據(jù)進(jìn)行采樣,結(jié)果為0,與DATA2上的數(shù)據(jù)0相同,與DATA1上的數(shù)據(jù)1不同,通過這種比較 Master1退出了對總線的控制,而Master2所發(fā)送的數(shù)據(jù)都是正確的,完成仲裁。

原文鏈接:
https://blog.csdn.net/weixin_43698385/article/details/125094436
-
接口
+關(guān)注
關(guān)注
33文章
9587瀏覽量
157584 -
總線
+關(guān)注
關(guān)注
10文章
3055瀏覽量
91849 -
uart
+關(guān)注
關(guān)注
22文章
1319瀏覽量
106945 -
I2C協(xié)議
+關(guān)注
關(guān)注
0文章
29瀏覽量
9303
原文標(biāo)題:理解I2C協(xié)議
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
I2C協(xié)議以及I2C讀寫EEPROM
I2C總線協(xié)議及其應(yīng)用
I2C最新協(xié)議標(biāo)準(zhǔn)
STM32學(xué)習(xí)之I2C協(xié)議(讀寫EEPROM)
硬件I2C與模擬I2C
一文看懂I2C協(xié)議
I2C通信協(xié)議:了解I2C Primer、 PMBus和SMBus
使用I2C協(xié)議點亮OLED
I2C串行總線協(xié)議是什么?I2C總線有哪些優(yōu)點?
I2C總線協(xié)議的工作原理和尋址格式
I2C協(xié)議的基礎(chǔ)知識
深入剖析I2C協(xié)議
評論