目录
一、I2C系统硬件框架
1. 基本硬件电路
2. I2C传输协议
- 写操作
- 读操作
I2C协议中数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。传输时,先传输最高位(MSB)。
-
开始信号(S):SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。
-
结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
-
响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA
-
SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化
I2C协议信号如下:
注:注意到,传输信号时,时钟线SCL是随时间周期变化的,因此,无论表示开始信号、结束信号、响应信号还是数据,都是观察数据线SDA的电平的变化。所以记忆时,记准数据线SDA怎么变化的。
二、Linux下的软件框架与重要数据结构
1. Linux软件框架
注:一定要牢牢的记住这张图各个程序所在的层次,自己觉得Linux I2C的东西比较凌乱,会涉及到很多的层次,但是如果抓住了每一个所层的位置,以及要完成的事情,一切就会比较清晰了。
- APP通过I2C Controller与I2C Device传输数据
- APP通过I2C Driver(client)与I2C Adapter(controller)传输i2c_msg
2. 重要结构体
2.1 怎么表示I2C Controller呢?
I2C Controller是属于上面图的第四层I2C Controller Driver。
-
一个芯片里可能有多个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:
2.2 怎么表示I2C Device
I2C Device是属于上面图的第二层I2C Device Driver。
-
一个I2C Device,一定有设备地址
-
它连接在哪个I2C Controller上,即对应的i2c_adapter是什么
-
使用i2c_client来表示一个I2C Device
2.3 怎么表示要传输的数据
在上面的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;
ms