IIC总线介绍

由于最近在学习IIC的设备驱动,所以在此写一篇关于I2C的总线介绍来分享我对IIC的理解。希望大家能学习到一些知识和指出我的错误。

IIC:又称I2C,即Inter-Integrated Circuit(集成电路总线),由飞利浦公司开发的串行总线,用于控制微控制器及其他设备。

IIC特点
1.只有两条总线线路:一条串行数据线(SDA),一条串行时钟线(SCL)。
2.每个连接到总线的设备的器件都可以使用软件根据它的唯一地址来识别。
3.传输数据的设备间是简单的主/从关系(意即数据传输是从主机发起,从机接受,从机不可能主动引起数据传输)
4.它是一个真正的多主机总线,两个或多个主机同时发起数据传输时可以通过冲突检测和仲裁来防止数据被破坏
5.串行的8位双向数据传输

IIC总线介绍_第1张图片

对于上图,我们可以提出疑问,既然IIC总线上连接多个设备,那么怎么区分他们呢?怎么在传输数据的时候选择指定的设备呢?

IIC总线介绍_第2张图片

对于I2C设备的读写,在读写数据之前都得发出一个从机地址的7位地址,这个地址是I2C设备特有的唯一地址。

I2C协议中的读写时序
比如我们要往I2C设备写入数据
IIC总线介绍_第3张图片
对于上图我们知道操作为
1.发送一个START起始信号
IIC总线介绍_第4张图片
SCL线为高电平时期,SDA线由高电平向低电平变化
2.发送7位从机地址
SDA上传输的数据必须在SCL为高电平期间保持稳定,在低电平期间变化
3.再发送以为读/写位即传输的方向(0表示写操作,1表示读操作)
4.若7位地址存在并且符合,那么被选中的从机就会发出响应信号。
响应信号:即在发送完7位从机地址和1位的读写位后,再第九个clk期间,主机释放SDA,由从机驱动SDA,就是主机发送7位从机地址后,从机被选中,这时被选中的从机把SDA拉低,表示响应信号。
5.传输一系列的字节及其响应位。
6.主机发出P信号结束本次传输(在SCL为高电平期间 SDA拉高)。

对于上述过程,有个地方需要注意,并不是每传输8位数据后都会有ACK信号,有三种情况例外
1.当从机不能响应从机地址时(例如它正忙于其他事而无法响应I2C总线的操作,或者这个地址没有对应的从机),在第9个SCL周期内SDA线没有被拉低,即没有ACK信号,这时发出一个P信号终止传输或者重新发送一个S信号开始传输。
2.如果主机接收器在传输的过程中不能接受更多的数据时,它也不会发送ACK信号。
3.主机接收器在接收到最后一个字节后,也不会发出ACK信号。于是,从机发送器释放SDA线,以允许主机发出P信号结束传输。

I2C总线控制器寄存器
IIC总线介绍_第5张图片
IICCON,IICSTAT,IICDS,IICADD。

对于一些寄存器的了解可以查阅数据手册得知
IIC总线介绍_第6张图片
具体可以根据芯片手册操作寄存器。

I2C大概就是这样,下一次我会拿具体的代码示例来说明怎么实现I2C总线。

———-作者:Edison Gao(小白要学arm)

你可能感兴趣的:(Linux设备驱动分析)