I2C 和 SMBus 簡介¶
I²C (發音:I squared C,在核心文件中寫作 I2C) 是飛利浦公司開發的協議。它是一種雙線協議,具有可變速度(通常高達 400 kHz,高速模式高達 5 MHz)。它提供了一種廉價的匯流排,用於連線許多具有低頻或低頻寬通訊需求的裝置。I2C 廣泛用於嵌入式系統。有些系統使用不符合品牌要求的變體,因此不宣傳為 I2C,而是使用不同的名稱,例如 TWI(雙線介面)、IIC。
最新的官方 I2C 規範是由 NXP Semiconductors 釋出的“I²C 匯流排規範和使用者手冊” (UM10204),截至本文撰寫時為第 7 版。
SMBus(系統管理匯流排)基於 I2C 協議,並且在很大程度上是 I2C 協議和信令的子集。許多 I2C 裝置都可以在 SMBus 上工作,但某些 SMBus 協議添加了超出實現 I2C 品牌所需的語義。現代 PC 主機板依賴於 SMBus。透過 SMBus 連線的最常見的裝置是使用 I2C EEPROM 配置的 RAM 模組和硬體監控晶片。
由於 SMBus 在很大程度上是通用 I2C 匯流排的子集,因此我們可以在許多 I2C 系統上使用其協議。但是,有些系統不符合 SMBus 和 I2C 電氣約束;還有一些系統無法實現所有常見的 SMBus 協議語義或訊息。
術語¶
I2C 匯流排連線一個或多個控制器晶片和一個或多個目標晶片。
簡單的 I2C 匯流排¶
控制器晶片是啟動與目標通訊的節點。在 Linux 核心實現中,它也稱為“介面卡”或“匯流排”。控制器驅動程式通常位於 drivers/i2c/busses/ 子目錄中。
演算法包含可用於實現整個 I2C 控制器類別的通用程式碼。每個特定的控制器驅動程式都依賴於 drivers/i2c/algos/ 子目錄中的演算法驅動程式,或者包含其自身的實現。
目標晶片是一個節點,當被控制器定址時,它會響應通訊。在 Linux 核心實現中,它也稱為“客戶端”。雖然目標通常是單獨的外部晶片,但 Linux 也可以充當目標(需要硬體支援),並響應總線上的另一個控制器。這稱為本地目標。相反,外部晶片稱為遠端目標。
目標驅動程式儲存在特定於它們提供的功能的目錄中,例如 drivers/gpio/ 用於 GPIO 擴充套件器, drivers/media/i2c/ 用於影片相關晶片。
對於上圖中的示例配置,您需要一個 I2C 控制器的驅動程式和 I2C 目標的驅動程式。通常每個目標一個驅動程式。
同義詞¶
如上所述,Linux I2C 實現歷史上使用術語“介面卡”表示控制器,使用“客戶端”表示目標。許多資料結構在其名稱中都包含這些同義詞。因此,在討論實現細節時,您也應該瞭解這些術語。但是,首選官方措辭。
過時的術語¶
在早期的 I2C 規範中,控制器被稱為“主裝置”,目標被稱為“從裝置”。這些術語已在規範的 v7 版本中被廢棄,並且 Linux 核心行為準則也不鼓勵使用它們。您可能仍然會在未更新的文件引用中找到它們。但是,總的趨勢是使用包容性術語:控制器和目標。替換 Linux 核心中舊術語的工作正在進行中。