一文搞懂I2C总线通信
目錄
1、簡介
2、物理特性
3、通訊特性
3.1、開始和停止條件
3.2、地址傳送
3.3、數據傳送
3.4、總線應答
3.5、總線仲裁
3.6、時鐘同步/時鐘延展
4、通信時序和協議
4.1、起始條件
4.2、重復起始條件
4.3、地址幀
4.4、讀?寫位
4.5、ACK?NACK位
4.6、數據幀
4.7、停止條件
5、工作過程
5.1、單個主設備連接多個從機
5.2、多個主設備連接多個從機?
1、簡介
I2C(集成電路總線),由Philips公司(2006年遷移到NXP)在1980年代初開發的一種簡單、雙線雙向的同步串行總線,它利用一根時鐘線和一根數據線在連接總線的兩個器件之間進行信息的傳遞,為設備之間數據交換提供了一種簡單高效的方法。每個連接到總線上的器件都有唯一的地址,任何器件既可以作為主機也可以作為從機,但同一時刻只允許有一個主機。
I2C 標準是一個具有沖突檢測機制和仲裁機制的真正意義上的多主機總線,它能在多個主機同時請求控制總線時利用仲裁機制避免數據沖突并保護數據。作為嵌入式開發者,使用I2C總線通信的場景有很多,例如驅動FRAM、E2PROM、傳感器等。
總結來說,I2C總線具有以下特點:
- 只需要SDA、SCL兩條總線;
- 沒有嚴格的波特率要求;
- 所有組件之間都存在簡單的主/從關系,連接到總線的每個設備均可通過唯一地址進行軟件尋址;
- I2C是真正的多主設備總線,可提供仲裁和沖突檢測;
- 傳輸速度分為四種模式:
- 最大主設備數:無限制;
- 最大從機數:理論上,1008個從節點,尋址模式的最大節點數為2的7次方或2的10次方,但有16個地址保留用于特殊用途。
I2C有16個保留I2C地址。這些地址對應于以下兩種模式之一:0000 XXX或1111 XXX。下表顯示了為特殊目的而保留的I2C地址。
| I2C 節點地址 | R/W | 位功能描述 |
| 0000 000 | 0 | 廣播地址 |
| 0000 000 | 1 | 起始字節 |
| 0000 001 | X | CBUS 地址 |
| 0000 010 | X | 保留用于不同總線格式 |
| 0000 011 | X | 保留供未來使用 |
| 0000 1XX | X | 高速模式主代碼 |
| 1111 1XX | X | 保留供未來使用 |
| 1111 0XX | X | 10位節點地址 |
I2C還有兩個變體,分別專注于系統和電源應用,稱為系統管理總線(SMBus)和電源管理總線(PMBus)。
2、物理特性
I2C 總線使用連接設備的"SDA"(串行數據總線)和"SCL"(串行時鐘總線)來傳送信息。 I2C 總線內部使用漏極開路輸出驅動器,因此SDA和SCL可以被拉低為低電平,但是不能被驅動為高電平,所以每條線上都要使用一個上拉電阻,默認情況下將其保持在高電平。I2C 總線上拉電阻阻值取決于系統應用,TI 官方手冊推薦使用以下公式來計算上拉電阻值:
根據上表,這里不難發現需要在做電阻選擇需要滿足幾個條件:
- 灌電流最大值為3mA;
- 低電平輸出電壓設置了最大值為0.4V。
所以根據上述公式可以計算,對于5V的電源,每個上拉電阻阻值至少1.53kΩ,而對于3.3V的電源,每個電阻阻值至少967Ω。
如果覺得計算電阻值比較麻煩,也可以使用典型值 4.7kΩ。若各位想了解更多可直接參見手冊說明。
3、通訊特性
通常情況下,一個完整的I2C通信過程包括以下 4 部分:
- 開始條件
- 地址傳送
- 數據傳送
- 停止條件
主機在 SCL 線上輸出串行時鐘信號,數據在 SDA 線上進行傳輸,每傳輸一個字節(最高位 MSB 開始傳輸)后面跟隨一個應答位,一個 SCL 時鐘脈沖傳輸一個數據位。
標準的I2C時序如下圖所示:
3.1、開始和停止條件
當總線上的主機都不驅動總線,總線進入空閑狀態,SCL 和 SDA 都為高電平。總線空閑狀態下總線上設備都可以通過發送開始條件啟動通信。 當 SCL 線為高時,SDA 線上出現由高到低的信號,表明總線上產生了起始信號。SDA 線上出現由低到高的信號,表明總線上產生了停止信號,如下圖所示: 當兩個起始信號之間沒有停止信號時,即產生了重復起始信號。主機采用這種方法與另一個從機或相同的從機以不同傳輸方向進行通信(例如:從寫入設備到從設備讀出)而不釋放總線。如下圖所示:3.2、地址傳送
開始條件或者重新開始條件后面的幀是地址幀(一個字節),用于指定主機通信的對象地址,在發送停止條件之前,指定的從機一直有效。 I2C通訊支持:7 位尋址和10 位尋址兩種模式。 7 位尋址模式,地址幀(8bit)的高 7 位為從機地址,地址幀第 8 位來決定數據幀傳送的方向:7 位從機地址 + 1位讀/寫位,讀/寫位控制從機的數據傳輸方向(0:寫;1:讀)。幀格式如下所示: 10 位尋址模式,主機發送幀,第一幀發送頭序列(11110XX0,其中 XX 表示 10 位地址的高兩位),然后第二幀發送低八位從機地址。 主機接收幀,第一幀發送頭序列(11110XX0,其中 XX 表示 10 位地址的高兩位),然后第二幀發送低八位從機地址。接下來會發送一個重新開始條件,然后再發送一幀頭序列(11110XX1,其中 XX 表示 10 位地址的高兩位)幀格式如下所示: 解析如下:- S :表示開始條件;
- SLA :表示從機地址;
- R/W#:表示發送和接收的方向。當 R/W# 為“1” 時,將數據從從機發送到主機;當 R/W#為“0” 時,將數據從主機發送到從機;
- Sr :表示重新開始條件;
- DATA :表示發送和接收的數據;
- P :表示停止條件。
3.3、數據傳送
地址匹配一致后,總線上的主機根據 R/W 定義的方向一幀一幀的傳送數據。 所有的地址幀后傳送的數據都視為數據幀。即使是 10 位地址格式的低 8 位地址也視為數據幀。 數據幀的長度是 8 位。SCL 的低電平 SDA 變化,SCL 的高電平 SDA 保持,每個時鐘周期發送一位數據。數據幀后的第 9 個時鐘是應答位,是接收方向發送方傳送的握手信號。如果總線上從機接收數據,在第 9 個時鐘周期不響應主機,從機必須發送 NACK。如果總線上主機接收數據,第 9 個周期發送 NACK,從機接收到 NACK,從機停止發送數據。
無論主機還是從機發送了 NACK,數據傳送終止。主機可以做下列任一動作:
- 發送停止條件釋放總線 ;
- 發送重新開始條件開始一個新的通信。
在主機接收模式中,主機輸出 SCL 時鐘,接收從機數據并返回應答。主機接收數據的運行時序例如下圖所示:
7 位地址格式的主機接收數據的時序圖 在從機發送模式中,接收來自主機的 SCL 時鐘,本產品為從機發送數據,并且接收主機返回應答。從機發送數據的運行時序例如下圖所示: 7 位地址格式的從機發送模式時序圖 在從機接收模式中,接收來自主機的 SCL 時鐘和數據,接收完數據后返回應答。從機接收數據的運行時序例如下圖所示: 7 位地址格式從機接收模式時序圖3.4、總線應答
每傳輸一個字節,后面跟隨一個應答位。通過將 SDA 線拉低,來允許接收端回應發送端。ACK 為一個低電平信號,當時鐘信號為高時,SDA 保持低電平則表明接收端已成功接收到發送端的數據。 當主機作為發送器件時,如果從機上產生無響應信號(NACK),主機可以產生停止信號來退出數據傳輸,或者產生重復起始信號開始新一輪的數據傳輸。當主機作為接收器件時,發生無響應信號(NACK),從機釋放 SDA 線,使主機產生停止信號或重復起始信號。 I2C 總線上應答信號3.5、總線仲裁
I2C 總線上的仲裁分為兩個部分:SCL 線上的同步和 SDA 線上的仲裁。- SCL 線上的同步(時鐘同步)
- SDA 線上的仲裁
解析如下:
(1)另一器件發送串行數據; (2)另一器件通過拉低 SDA 先撤消了該 I2C 主機發送的一個邏輯 1(虛線)。仲裁丟失,I2C 進入從接收模式; (3)此時 I2C 處于從接收模式,但仍產生時鐘脈沖,直至發送完當前字節。I2C 將不為下個字節的傳輸產生時鐘脈沖。一旦贏得仲裁,SDA 上的數據傳輸由新的主機來啟動。3.6、時鐘同步/時鐘延展
I2C規范沒有為時鐘同步規定任何超時條件,也就是說,任何器件都可以根據需要保持SCL。
在I2C通信協議中,時鐘速度和信號始終由主器件產生。I2C主器件產生的信號提供主器件和節點連接之間的同步。
在某些情況下,節點或子節點不是以全狀態工作,在接收主器件生成的時鐘之前,需要減慢速度。這是通過一種稱為"時鐘同步/時鐘延展"的機制來實現的。
在時鐘同步/時鐘延展期間,為了降低總線速度,允許節點壓低時鐘。而在主器件方面,在其變為高電平狀態后,必須回讀時鐘信號。然后,它必須等待,直至線路達到高電平狀態。
通過時鐘同步/時鐘延展,I2C節點器件可以強制主器件進入等待狀態。當節點器件需要更多時間來管理數據時,例如存儲接收到的數據或準備發送另一字節的數據時,它可能會執行時鐘同步/時鐘延展。這通常發生在節點器件接收并確認收到一個字節的數據之后。
是否需要時鐘延展取決于節點器件的功能。這里有兩個例子:
- 處理器件(如微處理器或微控制器)可能需要額外的時間來處理中斷,接收和管理數據,以及執行適當的功能;
- 較簡單的器件(如EEPROM)不在內部處理數據,因此不需要時鐘延展來執行任何功能。
4、通信時序和協議
說起I2C通信協議必然離不開通信時序,主器件和從節點必須遵守I2C時序規格才能正確傳輸數據。
下表顯示了時序規格表上給出的符號和參數。
| 符號 | 參數 | 單位 |
| fSCL | SCL 時鐘頻率 | kHz |
| tHD(STA) | (重復)起始條件的保持時間 | μs |
| tLOW | 引腳的低電平周期 | μs |
| tHIGH | 引腳的高電平周期 | μs |
| tSU(STA) | 重復起始條件的建立時間 | μs |
| tHD(DAT) | 數據保持時間 | μs |
| tSU(DAT) | 數據建立時間 | ns |
| tr | SDA 信號的上升時間 | ns |
| tf | SDA 信號的下降時間 | ns |
| tSU(STO) | 停止條件的建立時間 | μs |
4.1、起始條件
起始條件總是在傳輸開始時出現,并由主器件發起。這樣做是為了喚醒總線上的空閑節點器件。SDA線從高電平切換到低電平,然后SCL線從高電平切換到低電平。時序和協議如下圖所示:
4.2、重復起始條件
在不發出停止條件的情況下,起始條件可以在傳輸期間重復。這是一種特殊情況,稱為重復起始,用于改變數據讀、寫傳輸方向、重復嘗試傳輸、同步多個IC,甚至控制串行存儲器等。如下圖所示:
4.3、地址幀
地址幀包含7位或10位序列,具體取決于可用性(參見數據手冊)。如下圖所示:
不像SPI協議,I2C沒有節點選擇線路,因此它需要另一種方法來讓節點知道數據正向其發送,而不是向另一個節點發送。這是通過尋址來實現的。地址幀始終是新消息中起始位之后的第一幀。
主器件將其想要與之通信的節點地址發送到其所連接的每個節點。然后,每個節點將主器件所發送的地址與其自己的地址進行比較。如果地址匹配,它便向主器件發送一個低電壓ACK位。如果地址不匹配,則節點什么也不做,SDA線保持高電平。
4.4、讀?寫位
地址幀的最后一位告知節點,主器件是想要將數據寫入其中還是從中接收數據。如果主器件希望將數據發送到節點,則讀?寫位處于低電平。如果主器件請求從節點得到數據,則該位處于高電平。如下圖所示:
4.5、ACK?NACK位
消息中的每一幀后面都跟隨一個應答?不應答位。如果成功接收到一個地址幀或數據幀,則從機會向主機返回一個ACK位。如下圖所示:
4.6、數據幀
主器件檢測到來自從節點的ACK位之后,就準備發送第一數據幀。數據幀總是8位長,并以MSB優先方式發送。每個數據幀之后緊接著一個ACK?NACK位,以驗證該幀是否已成功接收。主器件或節點(取決于誰發送數據)必須收到ACK位,然后才能發送下一數據幀。時序和協議如下圖所示:
4.7、停止條件
發送完所有數據幀之后,主器件可以向節點發送停止條件以停止傳輸。停止條件是指SCL線上的電壓從低電平變為高電平,然后在SCL線保持高電平的情況下,SDA線上的電壓從低電平變為高電平。時序和協議如下圖所示:
5、工作過程
最后整體敘述一下I2C通訊過程,本小節內容整理來源于:微信公眾號:小麥大叔,作者菜刀和小麥。
第1步:起始條件
主設備通過將SDA線從高電平切換到低電平,再將SCL線從高電平切換到低電平,來向每個連接的從機發送啟動條件,如下圖所示:
第2步:發送從設備地址
主設備向每個從機發送要與之通信的從機的7位或10位地址,以及相應的讀/寫位,如下圖所示:
第3步:接收應答
每個從設備將主設備發送的地址與其自己的地址進行比較。如果地址匹配,則從設備通過將SDA線拉低一位以表示返回一個ACK位。
如果來自主設備的地址與從機自身的地址不匹配,則從設備將SDA線拉高,表示返回一個NACK位。
?第4步:收發數據
主設備發送或接收數據到從設備,如下圖所示:
第5步:接收應答
在傳輸完每個數據幀后,接收設備將另一個ACK位返回給發送方,以確認已成功接收到該幀,如下圖所示:
第6步:停止通信
為了停止數據傳輸,主設備將SCL切換為高電平,然后再將SDA切換為高電平,從而向從機發送停止條件,如下圖所示:
5.1、單個主設備連接多個從機
I2C單個主設備連接多個從機。使用7位地址可提供128 (2的7次方)個唯一地址。使用10位地址很罕見,但可提供1024 (2的10次方)個唯一地址。要將多個節點連接到單個主器件,請使用4.7 kΩ上拉電阻連接這些節點,并將SDA和SCL線連接到VCC,如下圖所示:
5.2、多個主設備連接多個從機?
多個主設備可以連接到一個或多個從機。
當兩個主設備試圖通過SDA線路同時發送或接收數據時,同一系統中的多個主設備就會出現問題。
為了解決這個問題,每個主設備都需要在發送消息之前檢測SDA線是低電平還是高電平;
- 如果SDA線為低電平,則意味著另一個主設備可以控制總線,并且主設備應等待發送消息;
- 如果SDA線為高電平,則可以安全地發送消息。
拓展學習:
1、I2C Bus
2、https://www.nxp.com.cn/docs/en/application-note/AN10216.pdf
3、https://www.ti.com/lit/an/slva689/slva689.pbeiz、
4、I2C協議文檔,中文,周立功翻譯版本
5、https://www.nxp.com/docs/en/user-guide/UM10204.pdf
6、I2C通信協議:了解I2CPrimer、PMBus和SMBus?
7、I2C-bus specification and user manual??
總結
以上是生活随笔為你收集整理的一文搞懂I2C总线通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 框架和模式
- 下一篇: 评上了7月份的Microsoft MVP