IIC 是 同步、串行、半双工 通讯总线,支持多主机多从机,同一时刻只能有一个主机和一个从机通讯,挂载的每个设备都有自己的地址(7 位或 10 位),从设备中的寄存器地址为 8 bit,设备数量受最大电容 400pF 限制,只有 2 条线
scl 时钟线:
低电平时,发送器向数据线上写,高电平时,接收器从数据线上读
一个时钟周期收发 1 bit 数据,即写后立即读
一帧共 9 个时钟周期(9 bit),前 8 bit 数据(先传最高位(MSB))(发送端写,接收端读),后 1 bit 应答(接收端写,发送端读)
sda 数据线:传输速率标准 100 Kbps,快速 400 Kbps,高速 3.4 Mbps(大多数不支持)
起始信号:当时钟线处于高电平时,数据线由高电平转向低电平,由主机发出,起始信号后必为从机地址+方向位(0 = W,1 = R)
应答信号:每当第 9 个时钟周期时,低电平 = 应答,高电平 = 非应答
终止信号:当时钟线处于高电平时,数据线由低电平转向高电平,由主机发出
I2C 时序图
主机给从机发数据
主机接收从机数据
I2C 相关的结构体
i2c_adapter 表示SOC中的I2C控制器,其中有芯片厂商编写的真正实现控制I2C硬件设备的驱动
struct i2c_adapter {
struct module *owner; //所属模块
unsigned int id; //algorithm的类型,定义于i2c-id.h,
unsigned int class;
const struct i2c_algorithm *algo; //总线通信方法结构体指针
void *algo_data; //algorithm数据
struct rt_mutex bus_lock; //控制并发访问的自旋锁
int timeout;
int retries; //重试次数
struct device dev; //适配器设备
int nr;
char name[48]; //适配器名称
struct completion dev_released; //用于同步
struct list_head userspace_clients; //client链表头
};
i2c_algorithm是I2C控制器和I2C设备通信的方法结构体
struct i2c_algorithm {
//I2C适配器的传输函数指针,用于产生I2C周期信号(start stop ack)以i2c_msg为单位
int (*master_xfer)(struct i2c_adapter *adap,struct i2c_msg *msgs,