文章目录
- 1 IIC理解
- 1.1 IIC简述
- 1.2 IIC协议优缺点
- 1.3 传输速度
- 2 IIC数据格式
- 3 数据时序
- 3.1 写时序
- 3.2 读时序
- 参考链接
1 IIC理解
1.1 IIC简述
IIC全称Inter Integrated Circuit,即集成电路总线。是由Philips半导体公司于八十年代初设计出的一种两线式串行总线协议,主要应用于传输数据量不大且通信距离短的主从机通信,主设备起控制作用,从设备只能被动进行读写操作。
其通信过程需要两根总线,一根SCL(串行时钟总线),用作数据同步,一根SDA(串行数据总线),顾名思义进行数据的传输,与UART不同的是,IIC上支持挂载多个从设备,主设备通过每个从设备唯一的地址来进行通信,并且IIC的数据接口是双向IO,即可做输出亦可做输入。
通信时的数据传输以大端传输方式进行,即传输时高比特位先传输,低比特位后传输。
1.2 IIC协议优缺点
1、优点:
- 硬件接口简单。只需要SCL和SDA两个接口,简化硬件设计的同时也简化了时序设计、易于调试。
- 支持多设备工作。可多个从设备连接到同一总线上,每个从设备有唯一的地址,以此进行通信。
- 功耗低。空闲状态时,总线上的设备进入低功耗模式以降低功耗。
- 有应答机制来确认接收方是否收到数据。
2、缺点:
- 传输速度慢。IIC的数据传输速度较低,通常用于低速设备。
- 受限制。其传输受到总线长度和从设备数量影响,过多的从设备和过长的总线均可能导致其数据出错。
- 和SPI相比,IIC为半双工通信,不能同时进行收发数据。
1.3 传输速度
IIC协议有三种传输速度,即标准模式、快速模式以及高速模式。标准模式速度可达100kb/s,快速模式可达400kb/s,而高速模式可达到3.4Mb/s。
2 IIC数据格式
IIC在进行通信时,会先发送一个起始信号,然后发送7比特的地址位和1比特的读写控制位,这8比特组成1个字节,主机发送完这一个字节后会释放总线来接收接收方的应答位,为1比特,接收到应答位后开始发送1个字节的寄存器地址(有的IIC设备是不需要寄存器地址的,这种就可以不用发送寄存器地址,发完设备地址和读写控制位后可直接发送数据),当发完寄存器地址收到应答后,就可以接着发送数据了,数据同样以字节为单位发送。
- 空闲状态:在空闲状态下,SCL和SDA均为高电平。
- 起始信号:在SCL为高电平时,SDA由高到低的跳变即为起始信号。
- 地址位:任何IIC设备都有7比特的地址位,即理论上有127个设备地址,但实际应用中有的总线上挂的设备不止127个,于是就有拓展地址,即使用7比特地址+引脚地址的双重地址来增加总线上的设备数量。
- 读写控制位:一般是高读低写,即SDA高电平为读操作,低电平为写操作。
- 应答位:在发送完读写控制位后释放总线,在下一个SCL的高电平器件检测到SDA的低电平即为应答位,表示接收方已收到数据,否则为非应答位(NACK),一般表示未成功收到数据,每发送完1字节的数据后均会产生一个应答位。
- 停止信号:在SCL的高电平时,SDA由低到高的跳变即为停止信号,之后终止一次数据的传输,要再进行数据的传输则需要重新发起始位,地址以及读写控制位。
如下图:
3 数据时序
3.1 写时序
主设备从从从设备写入数据的过程即为写操作,读写操作均以主设备为参考。
第一步:主设备先向产生一个起始信号,表示要进行数据传输了,然后发送第一个字节的数据(由7bit的从设备地址+1bit的读写控制位组成,写操作时,读写控制位置0表示写),然后释放SDA总线,等待从设备的ACK确认。
第二步:发送寄存器地址,寄存器地址为1byte,等待从设备的ACK确认,不需要寄存器地址的从设备直接跳过这一步。
第三步:发送需要写入从设备的数据,数据同样以字节为单位发送,每发送完一个字节,从设备都会回一个ACK表示是否正常收到数据。
第四步:所有数据均发送完成后,主设备发送停止位,以此暂停该次写操作,至此,一次写操作完成。
其大致时序如下图:
3.2 读时序
主设备从从从设备读取数据的过程即为读操作,读流程大致和写流程差不多,但要复杂一点,要从从设备读取数据,首先得知道是从那个从设备得那个寄存器读取数据,因此读之前会先有一个写操作,写入从设备地址和寄存器地址,以此明确操作的对象,读操作大致分为以下几步:
第一步:发送起始位,然后发送第一个字节(同样由7bit从设备地址+1bit读写控制位组成,此时读写控制位为0,表示写操作),然后等待Ack。
第二步:发送第二个字节,即写寄存器地址,然后等待Ack。注意:此时由IIC的读操作没有字节指定读寄存器地址的操作,而其寄存器地址指针在每一次读写后均会加1,因此此时的写的寄存器地址应为需要读的寄存器地址减1,这样后面读操作才能读到想要的寄存器的数据。
第三步:重新发送起始位,开始第二次的数据交互。
第四步:发送从设备地址字节(同样7bit+1bit,但此时的读写控制位置1,表示读),然后等待应答位。
第五步:接收读取的数据,从设备地址应答位后跟着的就是读到的数据了,此时主设备作为接收方,收完1byte的数据会会发送Ack到从设备,若发送的是ACK,则继续读取设备,若是NACK,则接着会发送停止位,表示本次读取数据完成,终止数据交互。
大致时序如下图:
读操作时,若要读取的寄存器为该设备的第一个寄存器或者该设备只有一个寄存器,则可直接跳过第一步和第二步的写操作,从而简化时序。
参考链接
详解IIC原理