I2C系统的重要结构体
Posted 韦东山
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了I2C系统的重要结构体相关的知识,希望对你有一定的参考价值。
I2C系统的重要结构体
参考资料:
- Linux驱动程序:
drivers/i2c/i2c-dev.c
- I2CTools:
https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/
1. I2C硬件框架
2. I2C传输协议
- 写操作
- 读操作
3. Linux软件框架
4. 重要结构体
使用一句话概括I2C传输:APP通过I2C Controller与I2C Device传输数据。
在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的传输函数,用来收发I2C数据
-
-
i2c_adapter
-
-
i2c_algorithm
-
怎么表示I2C Device
- 一个I2C Device,一定有设备地址
- 它连接在哪个I2C Controller上,即对应的i2c_adapter是什么
- 使用i2c_client来表示一个I2C Device
-
怎么表示要传输的数据
-
在上面的i2c_algorithm结构体中可以看到要传输的数据被称为:i2c_msg
-
i2c_msg
-
i2c_msg中的flags用来表示传输方向:bit 0等于I2C_M_RD表示读,bit 0等于0表示写
-
一个i2c_msg要么是读,要么是写
-
举例:设备地址为0x50的EEPROM,要读取它里面存储地址为0x10的一个字节,应该构造几个i2c_msg?
-
要构造2个i2c_msg
-
第一个i2c_msg表示写操作,把要访问的存储地址0x10发给设备
-
第二个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. 内核里怎么传输数据
使用一句话概括I2C传输:
-
APP通过I2C Controller与I2C Device传输数据
-
APP通过i2c_adapter与i2c_client传输i2c_msg
-
内核函数i2c_transfer
- i2c_msg里含有addr,所以这个函数里不需要i2c_client
以上是关于I2C系统的重要结构体的主要内容,如果未能解决你的问题,请参考以下文章
Linux——Linux驱动之玩转I2C(下)I2C driver驱动程序框架实现总结(i2c_driver结构体框架实现步骤驱动中读写I2C设备实测)
Linux——Linux驱动之玩转I2C(下)I2C driver驱动程序框架实现总结(i2c_driver结构体框架实现步骤驱动中读写I2C设备实测)