学习I2C框架驱动的一点感想
LINUX嵌入式I2C总线常常用于连接传感器、EEPROM等器件。究其根本,I2C是一种通信协议,它的目的就是为了实现信息在遵守I2C协议的器件间传输。因此在使用时不必想得太复杂,就把它当做通信接口使用。例如正点原子所写的I2C驱动框架例程,实现了对AP3216C这种三合一环境传感器的数据读取。
这个驱动程序中,我认为它是借助I2C驱动框架,实现了一个字符设备驱动。字符设备的file_operation中的操作方法,最终是通过调用i2c_trasfer函数完成操作命令和从机地址的发送。因为用到了I2C框架提供的操作函数,因此需要在内核中注册对应的I2c驱动,并且在用户空间创建设备驱动文件,展现为字符设备驱动,以供用户程序发送操作命令和接收I传感器返回信息。
I2c时序:
i2c总线处于空闲状态时,SDA和SCLK都处于高电平。
1、i2c主机写数据时序
(1)主机控制SDA在SCL处于高电平时,从高电平变化为低电平,发出start信号。
(2)主机发出7位从机地址和1位写标志位,对应的从机接受后会向主机反馈一个ack应答
(3)主机收到ack后,向从机发出8位从机寄存器地址。从机接受后向主机发出应答。
(4)主机接受应答后,向从机发送数据,直至写入完毕,主机在scl高电平时,将SDA由低拉高,发出start信号。
2、i2c读数据
(1)主机控制发出start信号
(2)主机发出7位从机地址和1位写标志位
(3)主机发出8位寄存器地址
(4)主机从新发送7位从设备地址和1位读标志位
(5)主机接收到ack后,将SDA控制权交给从机,接受从机发送过来的数据,数据传输完毕后,主机向从机发出NACK信号,从机将SDA控制权还给主机,主机发出stop信号。