I2C总线

I2C总线

一、概述

1、判断题

i2c总线只要求两条总线线路:一条串行数据线SDA ,一条串行时钟线SCL。(√)

i2c总线空闲时,SDA和SCL都保持高电平。(√)

i2c主机是初始化发送、产生时钟信号和终止发送的器件。(√)

i2c总线是一主多从的总线。(×)

串行的8位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。(√)

同一i2c总线上,可以有不同速率的i2c主机。(√)

连接到相同总线的IC数量只受到总线的最大电容400pF限制。(√)

i2c总线位传输时,SDA的电平只能在SCL为高电平时改变。(×)

i2c总线时钟延展指的是:i2c从机来不及响应数据,故从机将SCL强行拉低,让主机只能等待从机准备好后释放总线。(√)

标准i2c总线,在7位寻址时,实际可使用的地址为112个。(√)

i2c总线上有多个主机时,会执行仲裁和时钟同步,因为各个主控器没有对总线实施控制的优先级别,所以他们遵循“低电平优先”的原则,即谁先发送低电平谁就会掌握对总线的控制权。(√)

i2c总线,在Hs模式时,也可以有8个主机,所以在Hs模式传输也会执行仲裁和时钟同步。(×)

SMBus使用i2c硬件和i2c硬件寻址,其时钟频率可支持0~100kHz。(×)

2、基本概念

​ I2C(Inter-Integrated Circuit)总线是由Philips公司开发的一种简单、双向二线制同步串行总线。

​ 两线――串行数据 SDA 和串行时钟SCL 线在连接到总线的器件间传递信息。SDA 和 SCL 都是双向线路,都通过一个电流源或上拉电阻连接到正的电源电压。当总线空闲时,这两条线路都是高电平连接到总线的器件输出级必须是漏极开路或集电极开路才能执行“线与”的功能。

​ I2C 总线是一个多主机的总线。每个器件都有一个唯一的地址识别 (无论是微控制器 、LCD驱动器、存储器或键盘接口),而且都可以作为一个发送器或接收器 (由器件的功能决定)。

​ 主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。

​ 在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送

​ I2C 总线上数据的传输速率在标准模式下可达 100kbit/s,在快速模式下可达 400kbit/s,在高速模式下可达 3.4Mbit/s。连接到总线的接口数量只由总线电容是 400pF 的限制决定。如果总线线路的电容负载升高,位速率将逐渐下降。总线的电容负载是 400pF 时允许最大位速率是 1.7Mbit/s。

​ 由于I2C 总线支持任何 IC 生产过程 (NMOS、CMOS、双极性 )。逻辑 0 (低)和1(高)的电平不是固定的,它由 VDD 的相关电平决定。每传输一个数据位就产生一个时钟脉冲。

在这里插入图片描述

二、地址格式

​ I2C 总线的寻址过程是通常在起始条件后的第一个字节决定了主机选择哪一个从机。例外的情况是可以寻址所有器件的 “广播呼叫” 地址 。使用这个地址时,理论上所有器件都会发出一个响应 。但是,也可以使器件忽略这个地址。广播呼叫地址的第二个字节定义了要采取的行动。

1、7位地址

​ 第一个字节的头 7 位组成了从机地址(如下图)。最低位 LSB 是第 8 位, 它决定了报文的方向。第一个字节的最低位是 0, 表示主机会写信息到被选中的从机;1 表示主机会向从机读信息。

在这里插入图片描述

​ 当发送了一个地址后,系统中的每个器件都在起始条件后将头 7 位与它自己的地址比较。如果一样,器件会任务它被主机寻址,至于是从机–接收器,还是从机–发送器都由 R/ W 位决定。

​ 一般情况下,从机的地址都是可变的,例如,器件有 4 个固定的和 3 个可编程的地址位,那么相同的总线上共可以连接 8 个相同的器件。标准中,保留了两组8位地址(0000XXX 和 1111XXX)的用途,所以7位地址,可随意定义的数量为112个。

在这里插入图片描述

2、广播地址

​ 广播呼叫地址是用来寻址连接到 I2C 总线上的每个器件。但是,如果器件在广播呼叫结构中不需要任何数据,它可以通过不发出响应来忽略这个地址。如果器件要求从广播呼叫地址得到数据,它会响应这个地址并作为从机–接收器运转。第二个和接下来的字节会被能处理这些数据的每个从机–接收器响应。广播呼叫地址的含意通常在第二个字节说明。

在这里插入图片描述

这里要考虑两种情况:

• 当最低位 B 是 0:

​ • 00000110 (06H) 。通过硬件写入和复位从机地址的可编程部分。接收到这个两字节序列时,所有打算响应这个广播呼叫地址的器件将复位并接受它们地址的可编程部分。要采取预防措施确保器件不会在加上电源电压后将 SDA 或 SCL 线拉低,因为这些低电平会阻塞总线。

​ • 00000100 (04H)。通过硬件写从机地址的可编程部分。所有通过硬件定义地址可编程部分(和响应广播呼叫地址)的器件会在接收这两个字节序列时锁存可编程的部分。器件不会复位。

​ • 00000000 (00H)。这个代码不允许在第二个字节使用。

​ • 剩下的代码没有被确定,器件必须忽略它们。

• 当最低位 B 是 1:

​ 这个两字节序列是一个”硬件广播呼叫“。即序列由一个硬件主机器件发送,例如,键盘扫描器,它们不能编程来发送一个期望的从机地址。由于硬件主机预先不知道报文要传输给哪个器件,它只能产生这个硬件广播呼叫和它自己的地址,让系统识别它,如下图。

​ 第二个字节中剩下的 7 位是硬件主机的地址。这个地址被一个连接到总线的智能器件识别(例如,微控制器)并指引硬件主机的信息。如果硬件主机也可以作为从机,它的从机地址和主机地址一样。

在这里插入图片描述

​ 在一些系统中,可以选择在系统复位后在从机–接收器模式中设置硬件主机发送器。这样,系统的配置主机可以告诉硬件主机发送器(现在处于从机接收器模式 )数据必须发送到哪个地址。这个编程过程后,硬件主机仍处于主机–发送器模式。

3、10位地址

​ 10 位寻址和 7 位寻址兼容,而且可以结合使用。10 位寻址采用了保留的 1111XXX 作为起始条件 S 或重复起始条件 Sr 的后第一个字节的头 7 位。10 位寻址不会影响已有的 7 位寻址。有 7 位和 10 位地址的器件可以连接到相同的 I2C 总线,它们都能用于 F/S 模式和 Hs 模式系统。

​ 尽管保留地址位 1111XXX 有 8 个可能的组合,但是只有 4 个组合 11110XX 用于 10 位寻址。剩下的 4 个组合 11111XX 保留给以后增强的 I2C 总线。

在这里插入图片描述

在这里插入图片描述

4、起始字节

​ 微控制器可以用两种方法连接到 I2C 总线。有片上硬件 I2C 总线接口的微控制器可被编程为只由总线的请求中断。当器件没有这种接口时,它必须经常通过软件监控总线。很显然,微控制器监控或查询总线的次数越多,用于执行自己功能的时间越少。

​ 因此,快速硬件器件和相关的依靠查询的慢速微控制器有速度差别。此时,数据传输前应有一个比正常时间长的起始过程。

​ 起始过程包括:

​ • 起始条件 S

​ • 起始字节 00000001

​ • 响应时钟脉冲 ACK

​ • 重复起始条件 Sr

在这里插入图片描述

​ 在要求总线访问的主机发送起始条件 S 后,发送起始字节 00000001。因此,另一个微控制器可以采样以低采样速率采样 SDA 线,直到在启动字节检测到 7 个 0 。在 SDA 线检测到这个低电平后,微控制器切换到一个更高的采样速率寻找用于同步的重复起始条件 Sr。

​ 接收到重复起始条件 Sr 后硬件接收器会复位,从而忽略了起始字节。在起始字节后产生一个相关的响应时钟脉冲。这只在遵守总线的字节处理格式时出现。没有器件允许响应起始字节。

5、CBUS的兼容性

​ CBUS 接收器可以连接到标准模式的 I2C 总线。但是,必须连接第三条叫 DLEN 的线,而且要省略响应位。通常,I2C 的传输是 8 位的字节序列;兼容 CBUS 的器件有不同的格式。

​ 在混合的总线结构中,I2C 总线器件必须不能响应 CBUS 的报文。因此,保留了一个兼容 I2C 总线器件不会相应的特殊 CBUS 地址 0000001X 。发送 CBUS 地址后,DLEN 线被激活,发送 CBUS 格式的报文,见下图。在停止条件后 所有器件再次准备好接收数据。主机–发送器可以在发送 CBUS 地址后发送 CBUS 格式。传输由能被所有器件识别的停止条件结束。

​ 注意:如果已知 CBUS 配置而且不能预见 CBUS 兼容器件的扩展,设计者允许根据所用器件的特殊要求调整保持时间。

在这里插入图片描述

三、通信时序

​ 重要的时序可以分为:起始条件、停止条件、字节格式、响应位。

1、起始和停止条件

​ 当 SCL 是高电平时,SDA 线从高电平向低电平切换,这个情况表示起始条件。

void Soft_IIC_Start(void){
  Soft_SDA_HIGH();
  Soft_SCL_HIGH();
  Soft_IIC_Delay();
  Soft_SDA_LOW();
  Soft_IIC_Delay();
  Soft_SCL_LOW();
}

​ 当 SCL 是高电平时,SDA 线由低电平向高电平切换,表示停止条件。

void Soft_IIC_Stop(void)
{
  SOFT_SDA_OUT();
  Soft_SCL_LOW();
  Soft_SDA_LOW();
  Soft_IIC_Delay();
  Soft_SCL_HIGH();
  Soft_IIC_Delay();
  Soft_SDA_HIGH();
}

​ 起始和停止条件一般由主机产生。总线在起始条件后被认为处于忙的状态。在停止条件的某段时间后,总线被认为再次处于空闲状态。

​ 如果产生重复起始 Sr 条件而不产生停止条件,总线会一直处于忙的状态。此时的起始条件 S 和重复起始 Sr 条件在功能上是一样的。

​ 如果连接到总线的器件合并了必要的接口硬件,那么用它们检测起始和停止条件十分简便。但是,没有这种接口的微控制器在每个时钟周期至少要采样 SDA 线两次来判别有没有发生电平切换。

在这里插入图片描述

2、字节格式

​ 发送到 SDA 线上的每个字节必须为 8 位。每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位。首先传输的是数据的最高位 MSB。如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线 SCL 保持低电平迫使主机进入等待状态。当从机准备好接收下一个数据字节并释放时钟线 SCL 后,数据传输继续。

​ 在一些情况下,可以用与 I2C 总线格式不一样的格式(例如兼容 CBUS 的器件)。甚至在传输一个字节时,用这样的地址起始的报文可以通过产生停止条件来终止,此时不会产生响应。

在这里插入图片描述


void Soft_IIC_WriteByte(uint8_t txd)
{
  uint8_t t;
  SOFT_SDA_OUT();
  for(t = 0; t < 8; t++){
    if((txd & 0x80) >> 7){
      Soft_SDA_HIGH();
    }else{
      Soft_SDA_LOW();
    }
    txd <<= 1;
    Soft_IIC_Delay();
    Soft_SCL_HIGH();
    Soft_IIC_Delay();
    Soft_SCL_LOW();
  }
}

uint8_t Soft_IIC_ReadByte(uint8_t ack)
{
  uint8_t ret = 0;
  SOFT_SDA_IN();
  Soft_SDA_HIGH();
  for(uint8_t i = 0; i < 8; i++){
    Soft_SCL_LOW();
    Soft_IIC_Delay();
    Soft_SCL_HIGH();
    ret <<= 1;
    if(Soft_Read_SDA()){
      ret++;
    }
    Soft_IIC_Delay();
  }
  if(!ack){
    Soft_IIC_NAck();
  }else{
    Soft_IIC_Ack();
  }
  return ret;
}

3、响应位

​ 数据传输必须带响应。相关的响应时钟脉冲由主机产生。在响应的时钟脉冲期间,发送器释放 SDA 线(高)。

​ 在响应的时钟脉冲期间,接收器必须将 SDA 线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。当然,必须考虑建立和保持时间。

在这里插入图片描述

​ 通常,被寻址的接收器在接收到的每个字节后,除了用 CBUS 地址开头的报文,必须产生一个响应信号。

​ 当从机不能响应从机地址时(例如它正在执行一些实时函数不能接收或发送),从机必须使数据线保持高电平 。主机然后产生一个停止条件终止传输或者产生重复起始条件开始新的传输。

​ 如果从机–接收器响应了从机地址但是在传输了一段时间后不能接收更多数据字节,主机必须再一次终止传输。这个情况用从机在第一个字节后没有产生响应来表示从机使数据线保持高电平,主机产生一个停止或重复起始条件。

​ 如果传输中有主机接收器,它必须通过在从机不产生时钟的最后一个字节不产生一个响应,向从机–发送器通知数据结束。从机–发送器必须释放数据线,允许主机产生一个停止或重复起始条件。


void Soft_IIC_Ack(void)
{
  Soft_SCL_LOW();
  SOFT_SDA_OUT();   // 避免SDA切换输出模式时拉高1us,产生NACK,所以先拉低SCL
  Soft_SDA_LOW();
  Soft_IIC_Delay();
  Soft_SCL_HIGH();
  Soft_IIC_Delay();
  Soft_SCL_LOW();
}

void Soft_IIC_NAck(void)
{
  Soft_SCL_LOW();
  SOFT_SDA_OUT();   // 避免SDA切换输出模式时拉高1us,产生错误NACK,所以先拉低SCL
  Soft_SDA_HIGH();
  Soft_IIC_Delay();
  Soft_SCL_HIGH();
  Soft_IIC_Delay();
  Soft_SCL_LOW();
}

uint8_t Soft_IIC_Wait_Ack(void)
{
  uint16_t ErrTime = 0;
  SOFT_SDA_IN();
  Soft_IIC_Delay();
  Soft_SDA_HIGH();
  Soft_SCL_HIGH();
  while(Soft_Read_SDA()){
    ErrTime++;
    if(ErrTime > 100){   // 之前为 250
      Soft_IIC_Stop();
      return 1;
    }
  }
  Soft_IIC_Delay();
  Soft_SCL_LOW();
  Soft_IIC_Delay();
  return 0;
}

4、7位地址完整通信

​ 数据的传输遵循下图所示的格式。在起始条件 S 后,发送了一个从机地址。这个地址共有 7 位,紧接着的第 8 位是数据方向位 R/ W ----0 表示发送 写,1 表示请求数据 读。数据传输一般由主机产生的停止位 P 终止。但是,如果主机仍希望在总线上通讯,它可以产生重复起始条件 Sr和寻址另一个从机,而不是首先产生一个停止条件。在这种传输中,可能有不同的读/写格式结合。

在这里插入图片描述


void writeReg(uint8_t addr, uint8_t reg, uint8_t * buf, uint8_t len)
{
  Soft_IIC_Start();
  Soft_IIC_WriteByte(addr);
  Soft_IIC_Wait_Ack();
  Soft_IIC_WriteByte(reg);
  Soft_IIC_Wait_Ack();
  for(int i=0;i<len;i++){
    Soft_IIC_WriteByte(buf[i]);
    Soft_IIC_Wait_Ack();
  }
  Soft_IIC_Stop();
}

void readReg(uint8_t addr, uint8_t reg, uint8_t * buf, uint8_t len)
{
  Soft_IIC_Start();
  Soft_IIC_WriteByte(addr);
  Soft_IIC_Wait_Ack();
  Soft_IIC_WriteByte(reg);
  Soft_IIC_Wait_Ack();
  Soft_IIC_Stop();
  
  Soft_IIC_Start();
  Soft_IIC_WriteByte(addr|0x01);
  Soft_IIC_Wait_Ack();
  for(int i=0;i<len;i++){
    buf[i]=Soft_IIC_ReadByte(i == (len -1) ? 0 : 1);
  }
  Soft_IIC_Stop();
}

四、I2C速率

​ 标准模式 I2C 总线规范在 80 年代的初期已经存在 它规定数据传输速率可高达 100kbit/s 而且 7 位寻址。这个概念在普及中迅速成长,今天它已经作为一个标准被全世界接受,而且 Philips Semiconductors和其他供应商提供了几百种不同的兼容 IC。为了符合更高速度的要求以及制造更多可使用的从机地址给数量不断增长的新器件,标准模式 I2C 总线规范不断升级,到今天它提供了以下的扩展:展

​ • 快速模式,位速率高达 400kbit/s

​ • 高速模式 (Hs 模式 ),位速率高达 3.4Mbit/s

​ • 10 位寻址,允许使用高达 1024 个额外的从机地址

1、标准模式

​ 就是上述的规则,加上速率范围为0~100kbit/s。

2、快速模式

​ 已经在标准模式 I2C 总线规范提出的协议、格式、逻辑电平和 SDA 以及 SCL 线的最大电容负载在快速模式 I2C 总线规范都没有修改。带 I2C 总线接口的新器件必须至少符合快速模式或 Hs 模式规范的最小要求。

​ 快速模式器件可以在 400kbit/s 下接收和发送。最小要求是:它们可以和 400kbit/s 传输同步;可以延长 SCL 信号的低电平周期来减慢传输。快速模式器件都向下兼容,可以和标准模式器件在 0~100kbit/s 的 I2C 总线系统通讯。但是,由于标准模式器件不向上兼容,所以不能在快速模式 I2C 总线系统中工作,因为它们不能跟上这么快的传输速率因而会产生不可预料的状态。

​ 快速模式 I2C 总线规范与标准模式相比有以下额外的特征:

​ • 最大位速率增加到 400kbit/s

​ • 调整了串行数据 SDA 和串行时钟 SCL 信号的时序。没有必要与其他总线系统例如 CBUS兼容,它们不能在增加的位速率下工作

​ • 快速模式器件的输入有抑制毛刺的功能,SDA 和 SCL 输入有 Schmitt 触发器

​ • 快速模式器件的输出缓冲器对 SDA 和 SCL 信号的下降沿有斜率控制功能

​ • 如果快速模式器件的电源电压被关断,SDA 和 SCL 的 I/O 管脚必须悬空,不能阻塞总线

​ • 连接到总线的外部上拉器件必须调整以适应快速模式 I2C 总线更短的最大允许上升时间。对于负载最大是 200pF 的总线,每条总线的上拉器件可以是一个电阻;对于负载在 200pF~400pF 之间的总线,上拉器件可以是一个电流源 (最大值 3mA)或者是一个开关电阻电路。

3、高速模式(Hs模式)

​ 高速模式 Hs 模式 器件对 I2C 总线的传输速度有具大的突破。Hs 模式器件可以在高达 3.4Mbit/s 的位速率下传输信息,而且保持完全向下兼容快速模式或标准模式(F/S 模式)器件,也就是说它们可以在一个速度混合的总线系统中双向通讯。Hs 模式传输除了不执行仲裁和时钟同步外,与 F/S 模式系统有相同的串行总线协议和数据格式。虽然 Hs 模式器件是首选的器件(它们可以在大量的应用中使用),但是新器件有没有快速或 Hs 模式 I2C 总线接口由应用决定。

​ 要获得位速率高达 3.4Mbit/s 的传输,对正常的 I2C 总线规范要作出以下的改进:

​ • Hs 模式主机器件有一个 SDAH 信号的开漏输出缓冲器和一个在 SCLH 输出的开漏极下拉和电流源上拉电路。这个电流源电路缩短了 SCLH 信号的上升时间。任何时侯在 Hs 模式,只有一个主机的电流源有效。

​ • 在多主机系统的 Hs 模式中,不执行仲裁和时钟同步,以加速位处理能力。仲裁过程一般在前面用 F/S 模式传输主机码后结束。

​ • Hs 模式主机器件以高电平和低电平是 1:2 的比率产生一个串行时钟信号。解除了建立和保持时间的时序要求。

​ • 还可以选择 Hs 模式器件有内建的电桥。在 Hs 模式传输中,Hs 模式器件的高速数据 SDAH 和高速串行时钟 SCLH 线通过这个电桥与 F/S 模式器件的 SDA 和 SCL 线分隔开来。减轻了 SDAH 和 SCLH 线的电容负载,使上升和下降时间更快。

​ • Hs 模式从机器件与 F/S 从机器件的唯一差别是它们工作的速度。Hs 模式从机在 SCLH 和 SDAH输出有开漏输出的缓冲器。SCLH 管脚可选的下拉晶体管可以用于拉长 SCLH 信号的低电平,但只允许在 Hs 模式传输的响应位后进行。

​ • Hs 模式器件的输出可以抑制毛刺,而且 SDAH 和 SCLH 输出有一个 Schmitt 触发器。

​ • Hs 模式器件的输出缓冲器对 SDAH 和 SCLH 信号的下降沿有斜率控制功能。

在这里插入图片描述

在这里插入图片描述

五、多主机同步和仲裁

​ I2C是一个多主机总线。

1、时钟发生

​ 所有主机在 SCL 线上产生它们自己的时钟来传输 I2C 总线上的报文。数据只在时钟的高电平周期有效。因此,需要一个确定的时钟进行逐位仲裁。

​ 时钟同步通过线与连接 I2C 接口到 SCL 线来执行。这就是说,SCL 线的高到低切换会使器件开始数它们的低电平周期,而且一旦器件的时钟变低电平,它会使 SCL 线保持这种状态直到到达时钟的高电平。但是,如果另一个时钟仍处于低电平周期,这个时钟的低到高切换不会改变 SCL 线的状态。因此,SCL 线被有最长低电平周期的器件保持低电平。此时,低电平周期短的器件会进入高电平的等待状态。

​ 当所有有关的器件数完了它们的低电平周期后,时钟线被释放并变成高电平。之后,器件时钟和 SCL线的状态没有差别。而且所有器件会开始数它们的高电平周期。首先完成高电平周期的器件会再次将 SCL线拉低。

​ 这样,产生的同步 SCL 时钟的低电平周期由低电平时钟周期最长的器件决定,而高电平周期由高电平时钟周期最短的器件决定。

在这里插入图片描述

2、仲裁

​ 主机只能在总线空闲的时侯启动传输。两个或多个主机可能在起始条件的最小持续时间(tHD;STA)内产生一个起始条件,结果在总线上产生一个规定的起始条件。

​ 当 SCL 线是高电平时,仲裁在 SDA 线发生;这样,在其他主机发送低电平时,发送高电平的主机将断开它的数据输出级,因为总线上的电平与它自己的电平不相同。

​ 仲裁可以持续多位。它的第一个阶段是比较地址位。如果每个主机都尝试寻址相同的器件,仲裁会继续比较数据位(如果是主机–发送器),或者比较响应位( 如果是主机–接收器)。因为 I2C 总线的地址和数据信息由赢得仲裁的主机决定,在仲裁过程中不会丢失信息。

​ 丢失仲裁的主机可以产生时钟脉冲直到丢失仲裁的该字节末尾。

​ 由于 Hs 模式的主机有一个唯一的 8 位主机码,因此一般在第一个字节就可以结束仲裁。

​ 如果主机也结合了从机功能,而且在寻址阶段丢失仲裁,它很可能就是赢得仲裁的主机在寻址的器件。因此,丢失仲裁的主机必须立即切换到它的从机模式。

​ 下图显示了两个主机的仲裁过程。当然,可能包含更多的内容(由连接到总线的主机数量决定)。此时,产生 DATA1 的主机的内部数据电平与 SDA 线的实际电平有一些差别,如果关断数据输出,这就意味着总线连接了一个高输出电平。这不会影响由赢得仲裁的主机初始化的数据传输。

在这里插入图片描述

​ 由于 I2C 总线的控制只由地址或主机码以及竞争主机发送的数据决定,没有中央主机,总线也没有任何定制的优先权。

​ 必须特别注意的是:在串行传输时,当重复起始条件或停止条件发送到 I2C 总线的时侯,仲裁过程仍在进行。如果可能产生这样的情况,有关的主机必须在帧格式相同位置发送这个重复起始条件或停止条件。也就是说,仲裁在不能下面情况之间进行:

​ • 重复起始条件和数据位

​ • 停止条件和数据位

​ • 重复起始条件和停止条件

​ 从机不被卷入仲裁过程。

3、两个主机同一总线抓波测试(这一小结主要是实验现象,结论仅供参考)

​ 两个uno,寻址同一个从机,仅是写入的RGB888值不同(green:0x00,0xff,0x00;red:0xff,0x00,0x00),现象:

​ uno_100k_RGB_green优先; uno_100k_RGB_green优先.kvdat

​ green50k_red100k_green优先; green50k_red100k_green优先.kvdat

​ green100k_red50k_red优先; green100k_red50k_red优先.kvdat

​ green200k_red100k_red优先; green200k_red100k_red优先.kvdat

​ 得出来的结论就是,低电平优先(这个和前面理论基本一致);低速优先(这个可能是存在许多外在因素)。

​ 接下来演示一下

​ 剩下leo和uno抓波也试过,但是发现和理论有所出入,可能是观测原因,可能是主控自身原因,,,抓波仅供参考。 uno_leo_100k_轮询_基本不分先后.kvdat

六、I2C总线通信协议的其他用途

​ I2C总线被用作多种系统结构的通信协议。除了基本的I2C规范之外,这些体系结构还增加了命令集和特定于应用程序的扩展。

1 CBUS兼容性

​ CBUS接收器可以连接到标准模式(Sm)的I2C总线(SCL、SDA)上,但是,还必须连接附加的第三根DLEN总线,并忽略应答位。通常,I2C传输是8位字节序列;但CBUS兼容设备有它自己不同的格式。

​ 在混合总线(I2C+CBUS)结构中,有一个特殊的保留的CBUS地址(0000 001X),专用于寻址CBUS设备,所以I2C设备不会响应CBUS设备的信息。传送完CBUS地址后,就可以激活DLEN线路,发送CBUS格式的传输。在停止条件之后,所有设备再次准备好接受数据。

​ 主机可以在发送CBUS地址后发送CBUS格式数据。所有设备均可识别停止条件,从而结束传输。

​ 如果CBUS配置是已知的,并且CBUS兼容设备的扩展是不可预见的,允许设计者根据所用设备的具体要求调整保持时间。

2 系统管理总线(SMBus)

​ SMBus使用I2C硬件和I2C硬件寻址,但添加了用于构建特殊系统的二级软件规范。特别是,它的规范包括一个可以进行动态地址分配的地址解析协议。

​ 硬件和软件的动态重新配置允许总线设备“热插拔”并立即使用,无需重启系统。设备会被自动识别并分配唯一的地址。这个优点使得用户可以即插即用。

​ SMBus目前在大多数电脑中被用作系统管理总线(如图1-53)。由英特尔及其他公司一起于1995年开发,它修改了I2C的一些电气和软件特性,以便更好地与便携式设备快速下降的电源预算兼容。

img

​ 图1-53 Inter处理器的笔记本设备管理器中的SMBUS总线

​ SMBus也有一个“高功率”的2.0版本,其中包括一个4 mA吸收电流,不能由I2C芯片驱动,除非上拉电阻的大小符合I2C总线的电平。

2.1 I2C/SMBus合规性

​ SMBus和I2C协议基本相同:SMBus主机能够控制I2C从机,反之亦然。SMBus时钟的定义范围为10 kHz至100 kHz,而I2C可以是0 Hz至100 kHz、0 Hz至400 kHz、0 Hz至1 MHz和0 Hz至3.4 MHz,具体取决于模式。这意味着运行频率低于10 kHz的I2C总线不符合SMBus标准,因为SMBus设备可能会超时。

​ 逻辑电平也略有不同:SMBus的TTL低电平≤ 0.8 V,TTL高电平≥ 2.1 V;而I2C则为CMOS电平,CMOS低电平≤30 %VDD,CMOS高电平≥70 % VDD。如果VDD > 3.0 V,这不是问题。如果I2C器件低于3.0 V,那么如果逻辑高/低电平不能被正确识别,就可能有问题。

2.2 超时功能(Time out feature)

​ SMBus具有超时功能,如果通信时间过长,它会重置器件。这解释了为什么最小时钟频率为10 kHz,以防止锁定总线。

​ I2C可以是“DC”总线,这意味着当主机访问从机设备时,从机设备在执行某些事务时会延长主机时钟(从机通知主机,我从机正忙,但不想失去通信)。从机设备将允许在其任务完成后继续。在I2C总线协议中,这种延迟时间没有限制,而对于SMBus系统,这种延迟时间限制在35毫秒。

​ SMBus协议规定,如果某件事情花费的时间太长,则意味着总线上有问题,所有器件必须复位才能清除该模式。然后,并且不允许从机设备将时钟保持在低电平太长时间。

2.3 SMBus 1.0和SMBus 2.0的区别

​ SMBus规范定义了两类电气特性:低功率和高功率。第一类最初在SMBus 1.0和1.1规范中定义,主要是为智能电池设计的,但也可以用于其他低功耗设备。

​ 2.0版本引入了另一组更高功率的电气特性。此类适用于需要更高驱动能力的情况,例如PCI附加卡上的SMBus设备,以及通过PCI连接器将这些卡相互连接并连接到系统板上的SMBus设备。

​ 设备可以由总线VDD或另一个电源Vbus(例如智能电池)供电,并且只要它们遵守本类的SMBus电气规范,就可以互操作。

​ 恩智浦器件的电气特性比SMBus 1.0更强大。主要区别在于VOL = 0.4 V时的吸电流能力:①SMBus低功耗= 350 μA;②SMBus高功率= 4 mA;③I2C总线= 3毫安。

​ 如果上拉电阻的限流大小为3 mA,SMBus“高功率”器件和I2C总线器件将协同工作。有关更多信息,请参考:http://www.smbus.org/。

3 电源管理总线(PMBus)

​ PMBus是通过SMBus在电源转换器和系统主机之间进行通信的标准方式,可为电源转换器提供更智能的控制。PMBus规范定义了一组标准的器件命令,因此来自多个源的器件功能相同。PMBus设备使用SMBus版本1.1 plus扩展进行传输。

​ 有关更多信息,请参考:https://pmbus.org/。

4 智能平台管理接口(IPMI)

​ 智能平台管理接口(IPMI)为智能平台管理硬件定义了标准化的、抽象的、基于消息的接口。IPMI还定义了描述平台管理设备及其特征的标准化记录。IPMI通过监控温度、电压、风扇和机箱入侵(非法打开机箱)等参数来提高系统的可靠性。

​ IPMI提供常规系统管理功能,如自动报警、自动系统关闭和重启、远程重启和电源控制。智能平台管理硬件的标准化接口有助于硬件故障的预测和早期监控以及硬件问题的诊断。

​ 这种标准化的总线和协议用于扩展机箱内的管理控制、监控和事件交付。IPMI的特点是:兼容I2C总线;多控制器;简单请求/响应协议;使用IPMI命令集;支持非IPMI设备;不需要热插拔;使基板管理控制器(BMC)能够接受来自系统中其他管理控制器的IPMI请求消息;允许总线上的非智能设备和管理控制器;BMC充当控制器为系统软件提供对IPMB的访问;硬件实现与软件实现相隔离,因此无需任何软件更改即可添加新的传感器和事件。

​ 有关更多信息,请参考https://www.intel.com/content/www/us/en/products/docs/servers/ipmi/ipmi-home.html。

5 高级电信计算架构(ATCA)

​ 高级电信计算架构(ATCA)是紧凑型PCI (cPCI)的后续产品,提供标准化的外形,具有更大的卡面积、更大的间距和更大的电源,可用于高级机架式电信硬件。它包括一个热管理的容错方案,在板之间使用I2C总线通信。

​ 高级电信计算架构(ATCA)得到了100多家公司的支持,其中包括许多大型公司,如英特尔、朗讯和摩托罗拉。

​ 有两种通用的符合ATCA标准的风扇控制方法:第一种是智能FRU(现场可更换单元),这意味着风扇控制将直接连接到IPMB(智能平台管理总线);第二种是管理型或非智能型FRU。

​ ATCA要求管理双I2C总线的硬件和软件。这需要一个片上隔离电源为电路供电,一个带上升时间加速器的缓冲双I2C总线,以及三态功能。I2C控制器必须能够支持多控制器I2C双总线,并处理协议中概述的标准风扇命令集。此外,还需要板载温度报告、托盘功能报告、风扇关闭功能和非易失性存储。

​ 有关更多信息,请参考:https://www.picmg.org/openstandards/advancedtca/。

6 显示数据通道(DDC)

​ 显示数据通道(DDC)允许监视器或显示器通知主机其身份和功能。DDC版本2的规范要求符合I2C总线标准模式规范。它允许显示器和主机之间的双向通信,实现对监视器功能的控制,例如图像如何显示以及与连接到I2C总线的其他设备的通信。

​ 有关更多信息,请参考https://vesa.org/。

间使用I2C总线通信。

​ 高级电信计算架构(ATCA)得到了100多家公司的支持,其中包括许多大型公司,如英特尔、朗讯和摩托罗拉。

​ 有两种通用的符合ATCA标准的风扇控制方法:第一种是智能FRU(现场可更换单元),这意味着风扇控制将直接连接到IPMB(智能平台管理总线);第二种是管理型或非智能型FRU。

​ ATCA要求管理双I2C总线的硬件和软件。这需要一个片上隔离电源为电路供电,一个带上升时间加速器的缓冲双I2C总线,以及三态功能。I2C控制器必须能够支持多控制器I2C双总线,并处理协议中概述的标准风扇命令集。此外,还需要板载温度报告、托盘功能报告、风扇关闭功能和非易失性存储。

​ 有关更多信息,请参考:https://www.picmg.org/openstandards/advancedtca/。

6 显示数据通道(DDC)

​ 显示数据通道(DDC)允许监视器或显示器通知主机其身份和功能。DDC版本2的规范要求符合I2C总线标准模式规范。它允许显示器和主机之间的双向通信,实现对监视器功能的控制,例如图像如何显示以及与连接到I2C总线的其他设备的通信。

​ 有关更多信息,请参考https://vesa.org/。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值