I2C協議¶
本文件概述了基本的I2C事務以及執行這些事務的核心API。
符號說明¶
S |
起始條件 |
P |
停止條件 |
Rd/Wr (1 位) |
讀/寫位。Rd 等於 1,Wr 等於 0。 |
A, NA (1 位) |
確認(ACK)和非確認(NACK)位 |
Addr (7 位) |
I2C 7 位地址。請注意,可以擴充套件此地址以獲得 10 位 I2C 地址。 |
Data (8 位) |
一個普通的資料位元組。 |
[..] |
由 I2C 裝置傳送的資料,而不是由主機介面卡傳送的資料。 |
簡單傳送事務¶
由 i2c_master_send() 實現
S Addr Wr [A] Data [A] Data [A] ... [A] Data [A] P
簡單接收事務¶
由 i2c_master_recv() 實現
S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P
組合事務¶
由 i2c_transfer() 實現。
它們與上述事務類似,但是傳送起始條件 S 而不是停止條件 P,並且事務繼續。 例如,讀取一個位元組,然後寫入一個位元組
S Addr Rd [A] [Data] NA S Addr Wr [A] Data [A] P
修改後的事務¶
還可以透過為 I2C 訊息設定以下標誌來生成對 I2C 協議的以下修改。 除了 I2C_M_NOSTART 之外,通常只需要解決裝置問題
- I2C_M_IGNORE_NAK
通常,如果客戶端有 [NA],則訊息會立即中斷。 設定此標誌會將任何 [NA] 視為 [A],併發送所有訊息。 這些訊息仍然可能無法實現 SCL lo-> hi 超時。
- I2C_M_NO_RD_ACK
在讀取訊息中,跳過主機的 A/NA 位。
- I2C_M_NOSTART
在組合事務中,在某些時候不會生成“S Addr Wr/Rd [A]”。 例如,在第二個部分訊息上設定 I2C_M_NOSTART 會生成類似以下內容
S Addr Rd [A] [Data] NA Data [A] P
如果為第一個部分訊息設定 I2C_M_NOSTART 變數,則我們不會生成 Addr,但是會生成起始條件 S。這可能會使總線上的所有其他客戶端感到困惑,因此請勿嘗試。
通常,這用於將系統記憶體中多個數據緩衝區的傳輸收集到看起來像是對 I2C 裝置的單個傳輸的內容中,但也可能被一些罕見裝置用於方向更改之間。
- I2C_M_REV_DIR_ADDR
這將切換 Rd/Wr 標誌。 也就是說,如果您想進行寫入,但需要發出 Rd 而不是 Wr,反之亦然,則設定此標誌。 例如
S Addr Rd [A] Data [A] Data [A] ... [A] Data [A] P
- I2C_M_STOP
強制在訊息後停止條件 (P)。 一些與 I2C 相關的協議(例如 SCCB)需要這樣做。 通常,您真的不希望在一個傳輸的訊息之間被打斷。