通信协议——I2C

时间:2024-04-02 09:40:44

概述

I2C总线(Inter Integrated-Circuit)是由PHILIPS公司在上世纪80年代发明的一种电路板级串行总线标准,通过两根信号线——时钟线SCL和数据线SDA——即可完成主从机的单工通信。总线硬件连接极其简单,不同I2C设备挂接在总线上,只需在信号线安装上拉电阻即可完成硬件线路的搭建。另外,I2C总线采用器件地址的硬件设置方法,通过软件寻址方式完全避免了片选寻址的弊端,从而使硬件系统扩展更为灵活。

工作原理

SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出.需通过上拉电阻接电源VCC.当总线空闲时.两根线都是高电平,连接总线的外同器件都是CMOS器件,输出级也是开漏电路.在总线上消耗的电流很小,因此,总线上扩展的器件数量主要由电容负载来决定,因为每个器件的总线接口都有一定的等效电容.而线路中电容会影响总线传输速度.当电容过大时,有可能造成传输错误.所以,其负载能力为400pF,因此可以估算出总线允许长度和所接器件数量。
主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。
因为只有两条线,在处理地址和应答时,I2C存在一定的开销,效率不如设备直接相连的SPI总线。

应用

由于简单有效,I2C在业界得到广泛应用。基于I2C衍生出来的标准有SMBus、PMBus、IPMI、DDC和ATCA等。常见集成I2C硬件接口的设备有微控制器、温度传感器、LED控制器、EEPROM、ADC/DAC、RTC、时钟振荡器和I/O控制器等。

特点

  • I2C只有两根信号线:串行数据线SDA和串行时钟线SCL;
  • I2C总线上所有器件的SDA、SCL引脚输出驱动都为漏极开路结构,通过外接上拉电阻实现总线上所有节点SDA、SCL信号的“线与”逻辑关系;
  • 总线上的所有设备通过软件寻址且具有唯一的地址。7位“从机专用地址码”,其高4位为设备类型地址(由生产厂家制定),低3位为器件引脚定义地址(由使用者定义);
  • 任何时刻都只存在简单的主/从关系,按数据传输的方向,主机可以是主发送器或主接收器;
  • 支持多主机。在总线上存在多个主机时,通过冲突检测和仲裁机制防止多个主机同时发起数据传输时存在的冲突;
  • I2C总线上所有器件都具有“自动应答”功能,保证数据传输的正确性;
    主机和从机的区别在于对SCL的发送权,只有主机才能发送SCL;
  • I2C总线不仅广泛应用于电路板级的内部通信,还可以通过I2C总线驱动器进行不同系统间的通信;
  • 支持传输速率包括标准模式(Standard Mode)100kb/s、快速模式(Fast Mode)400kb/s、增强快速模式(Fast Mode Plus)1Mb/s和高速模式(High Speed Mode)3.4Mb/s;极速模式(Ultra-Fast Mode),单向数据传输速率可达5Mb/s;
  • I2C总线允许挂载最多的设备数量取决于总线上最大电容值,一般为400pf(Hs模式100pf)

硬件连接

通信协议——I2C
拉低
下图代表了总线电平拉低过程,当总线要传输低电平’0’时,Logic会控制FET使其导通VBUS总线连接到地,将总线拉低,注意在快速模式下最大的灌电流不超过3mA,这限制了上拉电阻的最小值。
通信协议——I2C
拉高
下图代表了总线电平高电平过程,当总线要传输高电平’1’时,Logic会控制FET使其关断VBUS总线上拉到电源,将总线拉高。
通信协议——I2C

通信协议

通信协议——I2C
起始位和停止位
起始和终止条件都是由主机(master)发起产生。总线在起始条件之后处于忙碌状态,在停止条件之后又处于空闲状态。

  • 起始条件:SCL线是高电平时,SDA线从高电平向低电平切换。
  • 停止条件:SCL线是高电平时,SDA线从低电平向高电平切换。
    通信协议——I2C读写位
    SDA数据线上的每个字节必须是8位,每次传输的字节数量没有限制。每个字节后必须跟一个响应位(ACK)。首先传输的数据是最高位(MSB),SDA上的数据必须在SCL高电平周期时保持稳定,数据的高低电平翻转变化发生在SCL低电平时期。
    通信协议——I2C以传输Byte:1010 1010 (0xAAh)为例,SDA SCL传输时序如下所示:
    通信协议——I2C应答位ACK和NACK
    每个字节传输必须带响应位,相关的响应时钟也由主机产生, 在响应的时钟脉冲期间(第9个时钟周期),发送端释放SDA线,接收端把SDA拉低。 以上图传输101010101为例,SCL第9位时钟高电平信号期间,SDA拉低其代表了有ACK响应位。
    当在SCL第9位时钟高电平信号期间,SDA仍然保持高电平,这种情况定义为NACK非响应位。这种情况下,主机可以直接产生STOP条件终止以后的传输或者继续重新START开始一个新的传输。以下情况会导致出现NACK位:
  • 接收机没有发送机响应的地址,接收端没有任何ACK发送给发射机
  • 由于接收机正在忙碌处理实时程序导致接无法接收或者发送
  • 传输过程中,接收机识别不了发送机的数据或命令
  • 接收机无法接收
  • 主机接收完成读取数据后,要发送NACK结束告知从机
    以下图例代表NACK时序:
    通信协议——I2C7bit地址格式和读写位
    发送一个7bit的器件地址面紧跟1-bit(R/W)的操作符(1:读,0:写),发送完后等待从机应答,从机应该在第9个时钟脉冲之前回复一个ACK表示接收正常,否则说明从机可能没有收到数据(如寻址的设备不存在或设备忙)或无法解析收到的消息,如果是这样,则由master来决定如何处理(stop或repeated start condition)。
    通信协议——I2C仲裁
    (1)I2C 仲裁:在多节点的 I2C 通信中,为解决两个或两个以上节点同时向一条总线发送数据形成的冲突,需要进行 I2C 总线仲裁。
    (2)仲裁机制:根据总线线“与”逻辑原理,当有一个节点发送低电平时,总线上表现为低电平,而发送高电平的节点将会失去仲裁。
    (3)DATA1 和 DATA2 分别是节点向总线所发送的数据信号,SDA 为总线上所呈现的数据信号,SCL 是总线上所呈现的时钟信号
    起始:DATA 1 和 DATA 2 发送起始信号,DATA 1 和 DATA 2 为高电平,根据总线线“与”功能,总线为高电平,DATA 1、DATA 2 与 总线电平相同,继续发送数据。
    第一个时钟周期:DATA1 和 DATA 2 为高电平,总线为高电平,DATA 1、DATA 2 继续发送数据。
    第二个时钟周期:DATA1 和 DATA 2 为低电平,总线为低电平,DATA 1、DATA 2 继续发送数据。
    第三个时钟周期:DATA1 为高电平,DATA2 为低电平,SDA 总线为低电平,DATA1 继续发送数据,DATA 2 与 SDA 总线电平不同失去仲裁。
    通信协议——I2C