驱动 I2C总线

本文详细介绍了I2C总线的工作原理,包括同步、串行、半双工的特性,以及通信时序和信号定义。同时,讨论了Linux内核中的I2C驱动框架,包括i2c_adapter、i2c_algorithm、i2c_driver和i2c_client等关键结构体的作用。此外,还展示了如何使用I2C消息结构体进行数据的读写操作。
摘要由CSDN通过智能技术生成

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, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值