深入理解IIC总线

接口/总线/驱动

1142人已加入

描述

1.IIC总线结构

总线

2.IIC时序

总线

3.IIC概念

1、开始条件(start condition):

为了标识传输正式启动, master 设备会将 SCL 置为高电平(当总线空闲时, SDA 和 SCL 都处于高电平状态),然后将 SDA 拉低,这样,所有 slave 设备就会知道传输即将开始。如果两个 master 设备在同一时刻都希望获得总线的所有权,那么谁先将 SDA 拉低,谁就赢得了总线的控制权。在整个通信期间,可以存在多个 start 来开启每一次新的通信序列( communication sequence ),而无需先放弃总线的控制权,后面会讲到这种机制。

注意,在正常传输数据过程中,当 SCL 处于高电平时,SDA 上的值不应该变化。

2、地址帧(address frame):

地址帧总是在一次通信的最开始出现。一个 7-bit 的地址是从最高位( MSB )开始发送的,这个地址后面会紧跟 1-bit的操作符, 1 表示读操作, 0 表示写操作。

3、应答 AC K/NACK接下来的一个 bit 是 NACK/ACK ,当这个帧中前面 8bits 发送完后,接收端的设备获得 SDA 控制权,此时接收设备应该在第 9 个时钟脉冲之前回复一个 ACK (将 SDA 拉低)以表示接收正常,如果接收设备没有将 SDA 拉低,则说明接收设备可能没有收到数据(如寻址的设备不存在或设备忙)或无法解析收到的消息,如果是这样,则由 master来决定如何处理( stop 或 repeated start condition )。

4、数据帧(data frames):

在地址帧发送之后,就可以开始传输数据了。Master 继续产生时钟脉冲,而数据则由 master (写操作)或 slave (读操作)放到 SDA 上。每个数据帧 8bits ,数据帧的数量可以是任意的,直到产生停止条件。每一帧数据传输(即每8-bit )之后,接收方就需要回复一个 ACK 或 NACK (写数据时由 slave 发送 ACK ,读数据时由 master 发送 ACK 。当 master 知道自己读完最后一个 byte 数据时,可发送 NACK 然后接 stop condition )。

5、停止条件(stop condition):

当所有数据都发送完成时, master 将产生一个停止条件。停止条件定义为:在 SDA 置于低电平时,将 SCL 拉高并保持高电平,然后将 SDA 拉高。注意,在正常传输数据过程中,当 SCL 处于高电平时,SDA 上的值不应该变化,防止意外产生一个停止条件。

6、重复开始条件(repeated start condition):

有时 master 需要在一次通信中进行多次消息交换(例如与不同的 slave 传输消息,或切换读写操作),并且期间不希望被其他 master 干扰,这时可以使用“重复开始条件” —— 在一次通信中, master 可以产生多次 start condition ,来完成多次消息交换,最后再产生一个 stop condition 结束整个通信过程。由于期间没有 stop condition ,因此 master一直占用总线,其他 master 无法切入。为了产生一个重复的开始条件, SDA 在 SCL 低电平时拉高,然后 SCL 拉高。接着 master 就可以产生一个开始条件继续新的消息传输(按照正常的 7-bit/10-bit 地址传输时序)。重复开始条件的传输时序如下图所示:

总线

7、时钟拉伸(clock stretching)(了解即可):

有时候,低速 slave 可能由于上一个请求还没处理完,尚无法继续接收 master 的后续请求,即 master 的数据传输速率超过了 slave 的处理能力。这种情况下, slave 可以进行时钟拉伸来要求 master 暂停传输数据 —— 通常时钟都是由 master 提供的, slave 只是在 SDA 上放数据或读数据。而时钟拉伸则是 slave 在 master 释放 SCL 后,将 SCL 主动拉低并保持,此时要求 master 停止在 SCL 上产生脉冲以及在 SDA 上发送数据,直到 slave 释放 SCL ( SCL 为高电平)。之后, master 便可以继续正常的数据传输了。可见时钟拉伸实际上是利用了时钟同步的机制(见下文),只是时钟由 slave 产生。

如果系统中存在这种低速 slave 并且 slave 实现了 clock stretching ,则 master 必须实现为能够处理这种情况,实际上大部分 slave 设备中不包含 SCL 驱动器的,因此无法拉伸时钟。

所以更完整的 I2C 数据传输时序图为:

总线

8、10-bit 地址空间(了解即可)

在 10-bit 地址的 I2C 系统中,需要两个帧来传输 slave 的地址。第一个帧的前 5 个 bit 固定为 b11110 ,后接 slave 地址的高 2 位,第 8 位仍然是 R/W 位,接着是一个 ACK 位,由于系统中可能有多个 10-bit slave 设备地址的高 2bit相同,因此这个 ACK 可能由多有 slave 设备设置。第二个帧紧接着第一帧发送,包含 slave 地址的低 8 位( 7:0 ),接着该地址的 slave 回复一个 ACK (或 NACK )。

注意, 10-bit 地址的设备和 7-bit 地址的设备在一个系统中是可以并存的,因为 7-bit 地址的高 5 位不可能是 b11110 。实际上对于 7-bit 的从设备地址,合法范围为 b0001XXX-b1110XXX ,’ X ’表示任意值,因此该类型地址最多有 112个(其他为保留地址 [1] )。

两个地址帧传输完成后,就开始数据帧的传输了,这和 7-bit 地址中的数据帧传输过程相同。

总线

9、时钟同步和仲裁(了解即可):

如果两个 master 都想在同一条空闲总线上传输,此时必须能够使用某种机制来选择将总线控制权交给哪个 master ,这是通过时钟同步和仲裁来完成的,而被迫让出控制权的 master 则需要等待总线空闲后再继续传输。在单一 master的系统上无需实现时钟同步和仲裁。

10、时钟同步(了解即可):

时钟同步是通过 I2C 接口和 SCL 之间的线“与”( wired-AND )来完成的,即如果有多个 master 同时产生时钟,那么只有所有 master 都发送高电平时, SCL 上才表现为高电平,否则 SCL 都表现为低电平。

11、总线仲裁(了解即可):

总线仲裁和时钟同步类似,当所有 master 在 SDA 上都写 1 时, SDA 的数据才是 1 ,只要有一个 master 写 0 ,那此时 SDA 上的数据就是 0 。一个 master 每发送一个 bit 数据,在 SCL 处于高电平时,就检查看 SDA 的电平是否和发送的数据一致,如果不一致,这个 master 便知道自己输掉仲裁,然后停止向 SDA 写数据。也就是说,如果 master一直检查到总线上数据和自己发送的数据一致,则继续传输,这样在仲裁过程中就保证了赢得仲裁的 master 不会丢失数据。

输掉仲裁的 master 在检测到自己输了之后也不再产生时钟脉冲,并且要在总线空闲时才能重新传输。仲裁的过程可能要经过多个 bit 的发送和检查,实际上两个 master 如果发送的时序和数据完全一样,则两个 master都能正常完成整个的数据传输。

12.IIC注意项

在正常传输数据过程中,当 SCL 处于高电平时,SDA 上的值不应该变化,因此利用 SCL处于高电平时,数据变化来区分起始和停止信号,和数据传输得以区分。

SCL处于高电平时:SDA拉低为起始信号,SDA拉高为停止信号。

  审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分