10.4 I2C 系統的重要結構體 參考資料: ? Linux 驅動程序:(某版本的 Linux,比如 Linux-4.9.88)/drivers/i2c ? I2CTools: https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/ 284 / 577 10.4.1 重要結構體 使用一句話概括 I2C 傳輸:APP 通過 I2C Controller 與 I2C Device 傳 輸數據。 在 Linux 中要思索下面幾個問題。 ? 怎么表示 I2C Controller ? 一個芯片里可能有多個 I2C Controller,比如第 0 個、第 1 個、…… ? 對于使用者,只要確定是第幾個 I2C Controller 即可 ? 使用 i2c_adapter 表示一個 I2C BUS,或稱為 I2C Controller,里面有 2 個重要的成員: a) nr:第幾個 I2C BUS(I2C Controller) b) i2c_algorithm,里面有該 I2C BUS 的傳輸函數,用來收發 I2C 數據 i2c_adapter 原型: 圖 10.27 i2c_adapter 原型 i2c_algorithm 原型: 圖 10.28 i2c_algorithm 原型 285 / 577 怎么表示 I2C Device ? 一個 I2C Device,一定有設備地址 ? 它連接在哪個 I2C Controller 上,即對應的 i2c_adapter 是什么 使用 i2c_client 來表示一個 I2C Device 圖 10.29 i2c_client 怎么表示要傳輸的數據 在上面的i2c_algorithm結構體中可以看到要傳輸的數據被稱為:i2c_msg i2c_msg 原型: 圖 10.30 i2c_msg ? i2c_msg 中的 flags 用來表示傳輸方向:bit 0 等于 I2C_M_RD 表示 讀,bit 0 等于 0 表示寫 ? 一個 i2c_msg 要么是讀,要么是寫 286 / 577 舉例:設備地址為 0x50 的 EEPROM,要讀取它里面存儲地址為 0x10 的一個字節, 應該構造幾個 i2c_msg?要構造 2 個 i2c_msg c) 第一個 i2c_msg 表示寫操作,把要訪問的存儲地址 0x10 發給設備 d) 第二個 i2c_msg 表示讀操作 代碼如下 u8 data_addr = 0x10; i8 data; struct i2c_msg msgs[2]; msgs[0].addr = 0x50; msgs[0].flags = 0; msgs[0].len = 1; msgs[0].buf = &data_addr; msgs[1].addr = 0x50; msgs[1].flags = I2C_M_RD; msgs[1].len = 1; msgs[1].buf = &data; 10.4.2 內核里怎么傳輸數據