目录
I2C总线(Inter IC BUS)是由Philips公司开发的一种串行,同步、半双工总线;
通用的I2C总线,可以使各种设备的通信标准统一,对于厂家来说,使用成熟的方案可以缩短芯片设计周期、提高稳定性,对于应用者来说,使用通用的通信协议可以避免学习各种各样的自定义协议,降低了学习和应用的难度;
I2C总线是一种多主机总线,连接IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器;主要用于近距离(抗干扰能力稍弱),低速的芯片之间的通信(传输视频,带宽要求比较高的场合也是不行的);I2C总线有两根双向的信号线,时钟线SCL(Serial Clock)用于通信双方时钟的同步、(I2C可以发送任意多个字节,因为收发双方用的是同一个时间基准)数据线SDA(Serial Data)用于收发数据,IIC总线硬件结构简单,成本较低,因此在各个领域得到了广泛的应用;
所有I2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA均要配置成开漏输出模式
SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
开漏输出和上拉电阻的共同作用实现了“线与”的功能,此设计主要是为了解决多机通信互相干扰的问题
一: 主机发送起始信号启用总线
二:主机发送一个字节数据指明从机地址和后续字节的传送方向;
往总线上发一个字节数据:高7位地址,低一位为0主机向从机发数据;为1从机向主机发数据;
三:被寻址的从机发送应答信号回应主机;
应答:告诉主机“我存在,我听见了”
四:发送器发送一个字节数据
最低位为0发送器为主机,接收器为从机;
最低位为1发送器为从机,接收器为主机;
发送过程中不允许改变通信方向;
五:接收器发送应答信号回应发送器
0为应答1为非应答
. . . 循环步骤4和5
n:通信完成后主机发送停止信号释放总线
I2C总线上传的数据是广义的,既包括地址,又包括真正的数据
主机在发送起始信号后必须先发送一个字节的数据,该数据的高7位为从机地址,最低位表示后续字节的传送方向,‘0’表示主机发送数据,‘1’表示主机接收数据;总线上所有的从机接收到该字节数据后都将这7位地址与自己的地址比较,如果相同,则认为自己被主机寻址,然后再根据最低位将自己定为发送器或者接收器;
起始条件:SCL高电平期间,SDA从高电平切换到低电平
终止条件:SCL高电平期间,SDA从低电平切换到高电平
起始信号和停止信号都是由主机后发出的,起始信号产生总线处于占用状态,停止信号产生后总线处于空闲状态;
I2C总线通信时每个字节为8位长度,数据传送时,先传送最高位,后传送低位(串口先低后高),发送器发送完一个学节数据后接收器必须发送1位应答位来回应发送器即一帧共有9位
发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
注:I2C它的时钟相位和时钟极性是固定的,SCL低电平发送器发数据,SCL高电平时接收器读取数据;空闲时SCL,SDA为高电平;
接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
发送应答:在接收完一个字节之后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答:在发送完一个字节之后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
I2C总线在进行数据传送时,时钟线SCL为低电平期间发送器向数据线上发送一位数据,在此期间数据线上的信号允许发生变化,时钟线SCL为高电平期间接收器从数据线上读取一位数据,在此期间数据线上的信号不允许发生变化,必须保持稳定;
第一步:主机发送起始信号启用总线;第二步:主机向总线发送1个字节的数据,高7位为从机地址,最低为后续字节的传输方向,这里为主机向从机发数据,所以最低位为0;第三步:从机应答;第四步:发送一个字节数据;第五步:从机应答;. . .直到遇到下面两种情况主机发送停止信号,停止通信;
两种情况:
1. 从机应答完,主机不想发了,主机直接发送停止信号,停止本次通信;
2. 从机不应答,主机也不会自找没趣,直接发送停止信号,停止本次通信;
第一步:主机发送起始信号启用总线;第二步:主机向总线发送1个字节的数据,高7位为从机地址,最低为后续字节的传输方向,这里为从机向主机发数据,所以最低位为1;第三步:主机应答;第四步:发送一个字节数据;第五步:主机应答;不断重复直到主机不应答,主机发送停止信号,停止本次通信;(1为非应答,0为应答)
要想改变数据的传输方向,只要再重新开始一次通信就可以改变方向了;
注意: 主机发起第二次通信的时候在它之前没有发送停止信号,如果第一次通信发停止信号,总线有可能会被其它主机占用,抢走使用权;