接口协议学习(二):I2C(IIC)总线(时序,仲裁)

时间:2024-03-21 12:13:21

一、I2C

I2C(Inter-Integrated Circuit,集成线路总线) 总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

二、I2C总线物理拓补结构(主从模式)

I2C分为主从和多主的模式,常用主从模式。

在主从工作方式中,系统中只有一个主机,其它器件都是具有I2C总线的外围从机。在主从工作方式中,主机启动数据的发送(发出启动信号)并产生时钟信号,数据发送完成后,发出停止信号。

接口协议学习(二):I2C(IIC)总线(时序,仲裁)
数据的传输速率在标准模式下可达100kbit/s,在快速模式下可达400kbit/s,在高速模式(Hs模式)下可达3.4Mbit/s,各种被控器件均并联在总线上,通过器件地址(每个器件的地址在器件手册有些)识别。

一般我们使用的I2C总线速度小于400Kbit/s。

由于I2C器件一般采用开漏结构与总线连接,所以SCL和SDA线均接上拉电阻
SCL:串行时钟总线,所有的I2C期间的操作均基于该时钟;
SDA:主机发送的数据和从机发送的均在SDA线上传输。

三、I2C时序

1、I2C整体时序

接口协议学习(二):I2C(IIC)总线(时序,仲裁)
1、总线空闲状态:SDA为高电平,SCL为高电平;

2、I2C起始位:当SCL为高电平时,SDA出现下降沿,产生一个起始位;

3、I2C结束位:当SCL为高电平时,SDA出现上升沿,产生一个结束位;

4、数据有效性:SDA 线上的数据必须在时钟的高电平时期保持稳定,这时候数据接收方才可以接收数据;数据线的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变,这个时候数据发送方才向SDA线上发送数据。
接口协议学习(二):I2C(IIC)总线(时序,仲裁)
5、响应位:SDA上的数据均以字节(8bit)为单位传输,每传输完一个字节数据,接收方要发送回来一个响应位,来告诉发送方是否接收到数据。在响应应答位期间,数据发送方将SDA设置为三台输入,因为SDA线默认为高电平,所以若接收方正确接收数据,则将SDA拉低,产生一个响应位。

6、器件地址:器件地址在器件手册中可以查到,并且每个器件有唯一的地址。有的器件地址在出厂时地址就设置好了,用户不可以更改;也有的设置有片选信号。器件地址为7位,所以I2C总线最多可以接128个I2C器件
主机不是直接向从机发送地址,而是主机往总线上发送地址,所有的从机都能接收到主机发出的地址,然后每个从机都将主机发出的地址与自己的地址比较,如果匹配上了,这个从机就会向主机发出一个响应信号。主机收到响应信号后,开始向总线上发送数据,与这个从机的通讯就建立起来了。如果主机没有收到响应信号,则表示寻址失败。

7、位传输:I2C传输时,按照从高位到低位的顺序进行传输。

2、I2C具体时序

单字节存储地址写时序
接口协议学习(二):I2C(IIC)总线(时序,仲裁)
接口协议学习(二):I2C(IIC)总线(时序,仲裁)
双字节存储地址写时序
接口协议学习(二):I2C(IIC)总线(时序,仲裁)
接口协议学习(二):I2C(IIC)总线(时序,仲裁)
读时序
接口协议学习(二):I2C(IIC)总线(时序,仲裁)
接口协议学习(二):I2C(IIC)总线(时序,仲裁)

四、仲裁(多主模式)

1、同步(SCL)

所有主机在SCL线上产生它们自己的时钟来传输I2C总线上的报文。数据只在时钟的高电平周期有效。
因此,需要一个确定的时钟进行逐位仲裁。时钟同步通过线与连接I2C接口到SCL线来执行。这就是说:SCL线的高到低切换会使器件开始数它们的低电平周期,而且一旦器件的时钟变低电平,它会使SCL线保持这种状态直到到达时钟的高电平(如下图)。但是,如果另一个时钟仍处于低电平周期,这个时钟的低到高切换不会改变SCL线的状态。因此,SCL线被有最长低电平周期的器件保持低电平。此时,低电平周期短的器件会进入高电平的等待状态
接口协议学习(二):I2C(IIC)总线(时序,仲裁)
当所有有关的器件数完了它们的低电平周期后,时钟线被释放并变成高电平。之后,器件时钟和SCL
线的状态没有差别。而且所有器件会开始数它们的高电平周期。首先完成高电平周期的器件会再次将SCL线拉低。这样,产生的同步SCL时钟的低电平周期由低电平时钟周期最长的器件决定,而高电平周期由高电平时钟周期最短的器件决定。

2、仲裁(SDA)

主机只能在总线空闲的时侯启动传输。两个或多个主机可能在起始条件的最小持续时间内产生一个起始条件,结果在总线上产生一个规定的起始条件。当SCL线是高电平时,仲裁在SDA线发生;这样,在其他主机发送低电平时,发送高电平的主机将断开它的数据输出级,因为总线上的电平与它自己的电平不相同。
仲裁可以持续多位。它的第一个阶段是比较地址位。如果每个主机都尝试寻址相同的器件,仲裁会继续比较数据位(如果是主机一发送器),或者比较响应位(如果是主机一接收器)。因为I2C总线的地址和数据信息由赢得仲裁的主机决定,在仲裁过程中不会丢失信息。
丢失仲裁的主机可以产生时钟脉冲直到丢失仲裁的该字节末尾。
由于Hs(high speed,高速模式)模式的主机有一个唯一的8位主机码,因此一般在第一个字节就可以结束仲裁。
如果主机也结合了从机功能,而且在寻址阶段丢失仲裁,它很可能就是嬴得仲裁的主机在寻址的器件。因此,丢失仲裁的主机必须立即切换到它的从机模式
下图显示了两个主机的仲裁过程。当然,可能包含更多的内容(由连接到总线的主机数量决定)。此时,
产生DATA1的主机的内部数据电平与SDA线的实际电平有一些差别,如果关断数据输出,这就意味着总线连接了一个高输出电平。这不会影响由赢得仲裁的主机初始化的数据传输。

综上,仲裁原则可以总结为:总线冲突时,按“低电平优先”的原则,把总线判给在数据线上先发送低电平的器件,并且仲裁只发生在SCL的高电平期间
接口协议学习(二):I2C(IIC)总线(时序,仲裁)
仲裁在不能下面情况之间进行:
1、重复起始条件(起始位)和数据位
2、停止条件(停止位)和数据位
3、重复起始条件和停止条件
从机不被卷入仲裁过程。