建筑人才網(wǎng)官網(wǎng)掛證seo 推廣教程
I2C系統(tǒng)的重要結(jié)構(gòu)體
參考資料:
- Linux驅(qū)動程序:
drivers/i2c/i2c-dev.c
- I2CTools:
https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/
1. I2C硬件框架
2. I2C傳輸協(xié)議
3. Linux軟件框架
4. 重要結(jié)構(gòu)體
使用一句話概括I2C傳輸:APP通過I2C Controller與I2C Device傳輸數(shù)據(jù)。
在Linux中:
- 怎么表示I2C Controller
-
一個芯片里可能有多個I2C Controller,比如第0個、第1個、……
-
對于使用者,只要確定是第幾個I2C Controller即可
-
使用i2c_adapter表示一個I2C BUS,或稱為I2C Controller
-
里面有2個重要的成員:
- nr:第幾個I2C BUS(I2C Controller)
- i2c_algorithm,里面有該I2C BUS的傳輸函數(shù),用來收發(fā)I2C數(shù)據(jù)
-
i2c_adapter
-
i2c_algorithm
-
- 怎么表示I2C Device
- 一個I2C Device,一定有設(shè)備地址
- 它連接在哪個I2C Controller上,即對應(yīng)的i2c_adapter是什么
- 使用i2c_client來表示一個I2C Device
- 怎么表示要傳輸?shù)臄?shù)據(jù)
-
在上面的i2c_algorithm結(jié)構(gòu)體中可以看到要傳輸?shù)臄?shù)據(jù)被稱為:i2c_msg
-
i2c_msg
-
i2c_msg中的flags用來表示傳輸方向:bit 0等于I2C_M_RD表示讀,bit 0等于0表示寫
-
一個i2c_msg要么是讀,要么是寫
-
舉例:設(shè)備地址為0x50的EEPROM,要讀取它里面存儲地址為0x10的一個字節(jié),應(yīng)該構(gòu)造幾個i2c_msg?
-
要構(gòu)造2個i2c_msg
-
第一個i2c_msg表示寫操作,把要訪問的存儲地址0x10發(fā)給設(shè)備
-
第二個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;
5. 內(nèi)核里怎么傳輸數(shù)據(jù)
使用一句話概括I2C傳輸:
- APP通過I2C Controller與I2C Device傳輸數(shù)據(jù)
- APP通過i2c_adapter與i2c_client傳輸i2c_msg
- 內(nèi)核函數(shù)i2c_transfer
- i2c_msg里含有addr,所以這個函數(shù)里不需要i2c_client
- i2c_msg里含有addr,所以這個函數(shù)里不需要i2c_client