I2C協議:

I2C 通訊協議(Inter-Integrated Circuit)是由 Phiilps 公司開發的,由於它引腳少,硬件實現簡單,可擴展性強,不需要 USART、 CAN 等通訊協議的外部收發設備,所以被廣泛使用。

I2C物理層:

  1. 是一個支持設備的總線。在 一個i2c設備總線中,可以連接多個i2c設備,支持多個i2c主機和多個i2c通訊從機。
  2. 一個I2C總線只是用兩個總線線路,一條串行數據總線(SDA),用於表示數據;一條串行時鐘線(SCL),用於收發數據的同步。
  3. 每個連接總線的設備都有其獨立的從設備地址,主機可以通過這個地址進行選擇連接總線的設備與其通信。
  4. 總線通過上拉電阻接到電源(開漏)。當I2C空閒時,輸出高阻態,當所有I2C設備都輸出高阻態時,上拉電阻將總線置為高電平。
  5. 多個主機同時使用總線的時候,通過 仲裁方式 來避免多個設備發送數據衝突的情況,合理選擇由哪個設備佔用總線。
  6. 具有三種傳輸模式:標準100 Kb/s、快速400 KB/s、高速3.4 Mb/s
  7. 連接到相同總線的IC數量受到總線的電容限制,400μF。

仲裁:SDA線的仲裁也是建立在總線具有線“與”邏輯功能(線與邏輯,即兩個以上的輸出端直接互連就可以實現“AND”的邏輯功能。兩個一出一,一個一出零、沒有一出零)的原理上的。節點在發送1位數據後,比較總線上所呈現的數據與自己發送的是否一致。是,繼續發送;否則,進行比較,輸出低電平進行發送,輸出高電平退出。SDA線的仲裁可以保證I2C總線系統在多個主節點同時企圖控制總線時通信正常進行並且數據不丟失。總線系統通過仲裁只允許一個主節點可以繼續佔據總線

I2C總線協議原理:

SDA串行數據線、SCL串行時鐘線。必須都接上上拉電阻,在空閒時間時保持高電平。

HAL_I2C_Mem_Write 參數_數據

 

I2C協議相關術語:

1.起始位:SCL高電平時,SDA下降沿

HAL_I2C_Mem_Write 參數_上拉電阻_02

 

2.停止位:SCL高電平時,SDA上升沿

HAL_I2C_Mem_Write 參數_數據_03

 

3.數據傳輸:

i2c總線在數據傳輸時要保證SCL高電平期間,SDA的數據傳輸穩定,因此SDA的數據變化只能在SCL低電平時發生。

HAL_I2C_Mem_Write 參數_上拉電阻_04

 

4.應答信號:當 I2C 主機發送完 8 位數據以後會將 SDA 設置為輸入狀態,等待 I2C 從機應答,也就是等到 I2C 從機告訴主機它接收到數據了。應答信號是由從機發出的,主機需要提供應答信號所需的時鐘,主機發送完 8 位數據以後緊跟着的一個時鐘信號就是給應答信號使用的。從機通過將 SDA 拉低來表示發出應答信號,表示通信成功,否則表示通信失敗。

5、I2C寫時序:

HAL_I2C_Mem_Write 參數_數據_05

 

寫時序的具體步驟:三步:1.需要操作的從設備地址 2 .需要寫入的寄存器 3.需要寫入寄存器的數據

(1)Start信號,表示開始

(2)需要操作的設備地址,高7位表示設備地址,末位表示讀寫,因為寫時時序,所以是0;

(3)ACK應答信號,由從機發來的應答信號,0表示成功

(4)start起始位

(5)需要寫入的寄存器地址,8位

(6)從機發來的應答信號ACK

(7)要寫入的數據,8位

(8)從機發來的應答信號

(9)結束位

6、I2C讀時許:

HAL_I2C_Mem_Write 參數_寄存器_06

 

讀時序的步驟:

四步:1.需要操作的從設備地址 2.將需要讀取的寄存器發送給從設備所以是寫 3. 需要讀取的從設備地址

  1. 從設備向主機發送讀取的寄存器中的數據。

(1)start信號,起始位

(2)需要操作的從設備地址,高7位為設備地址,最後一位為讀寫操作,0為寫,1為讀,此處為寫所以為0;

(3)ACK從機發來的應答信號

(4)start信號

(5)指定要讀取的寄存器,8位

(6)ACK從機發來的應答信號

(7)start信號

(8)再次確認需要操作的從設備地址,高7位設備地址,最後一位為讀寫操作,這裏是讀取操作所以是1

(9)ACK應答信號

(10)從I2C器件中讀取的數據

(11)主機發出NO ACK信號,表示讀取完成,不需要從機發出ACK信號了

(12)STOP停止信號

讀數據方向時,主機會釋放對 SDA 信號線的控制,由從機控制 SDA 信號線,主機接收信號,

寫數據方向時, SDA 由主機控制,從機接收信號。切記,不要混淆。

7、I2C 多字節讀寫時序

有時候我們需要讀寫多個字節,多字節讀寫時序和單字節的基本一致,只是在讀寫數據的時候可以連續發送多個自己的數據,其他的控制時序都是和單字節一樣的。