前言
本文将介绍I2C通信协议。
说明:学习嵌入式五大通信协议之一的I2C通信协议。
简介
I2C总线也称IIC总线是Philips公司在八十年代初推出的一种串行、半双工总线主要用于近距离、低速的芯片之间的通信;I2C总线有两根双向的信号线一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步;I2C总线硬件结构简单,成本较低,因此在各个领域得到了广泛的应用。
I2C总线是一种多主机总线,连接在I2C总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到I2C总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器。
I2C总线通信过程
1、主机发送起始信号启用总线
2、主机发送一个字节数据指明从机地址和后续字节的传送方向(也就是说明数据是主机给从机发还是从机给主机发),0表示主机给从机发,1表示从机给主机发
3、被寻址的从机发送应答信号回应主机
4、发送器发送一个字节数据
5、接收器发送应答信号回应发送器
6、循环步骤4、步骤5
n、通信完成后主机发送停止信号释放总线
I2C总线寻址方式
I2C总线上传送的数据是广义的,既包括地址,又包括真正的数据。
主机在发送起始信号后必须先发送一个字节的数据,该数据的高7位为从机地址,最低位表示后续字节的传送方向,‘0’表示主机发送数据,‘1’表示主机接收数据;总线上所有的从机接收到该字节数据后都将这7位地址与自己的地址进行比较,如果相同,则认为自己被主机寻址,然后再根据第8位将自己定为发送器或接收器
I2C总线信号实现
I2C总线信号包括:起始信号、一字节信号、应答信号和停止信号
起始信号和停止信号
SCL为高电平时,SDA由高变低表示起始信号
SCL为高电平时,SDA由低变高表示停止信号
起始信号和停止信号都是由主机发出,起始信号产生后总线处于占用状态,停止信号产生后总线处于空闲状态。
字节传送与应答
I2C总线通信时每个字节为8位长度,数据传送时,先传送最高位,后传送低位,发送器发送完一个字节数据后接收器必须发送1位应答位来回应发送器即一帧共有9位。
同步信号
I2C如何区分发送数据是一个1还是两个1?
I2C总线在进行数据传送时,时钟线SCL为低电平期间发送器向数据线SDA上发送一位数据,在此期间数据线SDA上的信号允许发生变化,时钟线SCL为高电平期间接收器从数据线SDA上读取一位数据,在此期间数据线SDA上的信号不允许发生变化,必须保持稳定。
SCL这根线实际上是用来告诉发送器什么时候发数据,告诉接收器什么时候接收数据。低电平发数据,高电平接收数据。
字节传送与应答
I2C总线通信时每个字节为8位长度,数据传送时,先传送最高位,后传送低位,发送器发送完一个字节数据后接收器必须发送1位应答位来回应发送器即一帧共9位。
典型I2C时序
主机向从机发送数据
主机发送一个起始信号——主机发送一个字节的从机地址数据——主机发送一个0表示数据由主机发给从机——被寻址的从机要发送一个应答信号——主机发送数据,从机接收数据——从机发送应答信号——……——当主机接收到应答信号后主机主动发送停止信号或者当主机没有接收到应答信号,就会发送停止信号
从机向主机发送数据
主机发送一个起始信号——主机发送一个字节的从机地址数据——主机发送一个1表示数据由从机发给主机——被寻址的从机要发送一个应答信号——从机发送数据,主机接收数据——主机发送应答信号——……——主机不发送应答信号——主机发送停止信号
主机先向从机发送数据,然后从机再向主机发送数据(这种情况不可能在一次I2C通信中实现)
主机发送一个起始信号——主机发送一个字节的从机地址数据——主机发送一个0表示数据由主机发给从机——被寻址的从机要发送一个应答信号——主机发送数据,从机接收数据——从机发送应答信号——……——从机不发送应答信号 / —— / 主机发送一个起始信号——主机发送一个字节的从机地址数据——主机发送一个1表示数据由从机发给主机——被寻址的从机要发送一个应答信号——从机发送数据,主机接收数据——主机发送应答信号——……——主机不发送应答信号——主机发送停止信号
注:中间不需要发送停止信号,就可以避免中间切换的过程中总线的使用权被其他从机占用。