浅谈 IIC I2C 总线协议

简介

IIC(也称I2C或I2C)总线是Philips公司开发的一种简单、双向二线制同步串行总线,是Inter-Integrated Circuit的缩写。

IIC只用两条双向线,一条SDA(Serial Data Line)和一条SCL(Serial Clock Line),两条都是开漏输出,需要通过上拉电阻接VCC。IIC是一个多主机的总线,任何连接到总线的节点都可以作为主机和从机,但同一时刻只能有一个主机

IIC的理论理想传输距离为15M,但是由于干扰和传输速率的提高,实际上会远小于15M,一般只适合用于板极器件的通信,不适合中长距离通信。在高速模式下,IIC传输速度在标准模式下可达100Kbps,快速模式下可达400Kbps,高速模式下可达3.4Mbps,但是速度越快可靠性越低。


硬件连接

这里写图片描述

主机和从机通过上图的方式接入总线,前面说到,IIC总线的SDA和SCL均需要通过上拉电阻接VCC。IIC使用7位寻址,除去0000000的广播地址,理论上一条IIC总线可以挂载27 – 1 = 127个节点,每个节点有一个地址。


通讯过程

1)位传输

IIC怎么通过SDA和SCL两条线来传输0和1比特位呢?首先SCL线必须是由主机时钟控制的,否则就乱套了,SDA主机从机都可以控制。如果主机或从机想要发送比特位“1”,则只要在SCL为高电平时,把SDA拉到高电平(“1”)。同理,想要发送比特位“0”,则只要在SCL为高电平时,把SDA拉到低电平(“0”)。

这里写图片描述

在正常的数据传输中,当SCL为高时,要求SDA的电平稳定,否则就会认为是其他动作,如下图:

这里写图片描述

当SCL为,但是SDA由高变为低时,定义为起始动作,表示主机要开始传输数据了;当SCL为,但是SDA由低变为高时,定义为停止动作,表示结束数据的传输。

2)数据帧

前面说到,我们已经可以发送“0”和“1”了,那具体怎么传数据呢?

这里写图片描述

主机与从机的通信数据帧如上图,流程如下:

  1. 首先主机发送起始动作(S),总线上的从设备收到后就知道主机要读/写数据了。
  2. 然后主机发送要与其通信的从机的地址(SLAVE ADDRESS)和读写位(R/W)表示时要读还是写,从机在收到地址时与自己的地址比对,发现与自己地址相符时拉低SDA线表示ACK,其他与地址不符的从机自动退出此次通讯。
  3. 这时主机还需要发送要访问的寄存器地址,上图没有体现出来,但是流程跟发送从机地址是一样的,后面也要从机ACK。
  4. 这时候主机就开始传输数据,每传输完一个Byte从机就回复一个ACK。
  5. 最后传输完毕主机发送停止动作(P),然后主从机释放总线。

这里的ACK是从机对主机的响应,主机每次发完数据后会释放SDA并监听SDA的电平。如果从机正常接收到数据,则把SDA的电平拉低,主机检测到SDA电平变低了,说明数据被成功接收。如果SDA在主机监听时间范围内还是处于高电平,则说明数据接收失败

这里写图片描述

下图是主机从从机读数据时总线上电平变化,这里需要注意的是主机需要读取数据时,需要先告诉从机和要读的寄存器地址(DUMMY WRITE),然后再一次发送起始动作和从机地址,随后开始释放SDA并监听。此时由从机控制SDA的电平,图中DATA n段就是从机控制SDA电平来向主机发数据,同样,主机每接收完一个Byte后发ACK。

这里写图片描述

下图是主机往从机写数据时总线上电平变化。

这里写图片描述

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注