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

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

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

4.2 單主設備,多從設備

4.3 多主設備,多從設備

五、I2C的數據傳輸格式
5.1 空閑位
空閑時SDA與SCL默認都是高電平,對應于主設備狀態機IDLE(默認態)時的輸出為高

5.2 起始位
SCL為高電平的時候 ,主設備控制SDA從1到0,為起始位,進入起始位后,SCL按照始終的要求進行翻轉
從設備接收到起始位信息,狀態機發生跳變,等待地址信號的輸入

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

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

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

5.5 數據位
當我們成功收到ACK信號后,就可以正式傳輸數據位了,每一次默認傳輸一個字節(即8bit),每個字節的傳輸都需要跟一個應答位(ACK/NACK)

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

5.7 總結

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

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

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

原文鏈接:
https://blog.csdn.net/weixin_43698385/article/details/125094436
-
接口
+關注
關注
33文章
9519瀏覽量
157015 -
總線
+關注
關注
10文章
3040瀏覽量
91657 -
uart
+關注
關注
22文章
1314瀏覽量
106634 -
I2C協議
+關注
關注
0文章
29瀏覽量
9218
原文標題:理解I2C協議
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
I2C總線協議及其應用
STM32學習之I2C協議(讀寫EEPROM)
硬件I2C與模擬I2C
一文看懂I2C協議
深度剖析I2C總線協議
使用I2C協議點亮OLED
深入剖析I2C協議
評論