这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 今天来了解一下I2C电气特性,通信协议与实例讲解

共1条 1/1 1 跳转至

今天来了解一下I2C电气特性,通信协议与实例讲解

高工
2025-12-20 22:49:33     打赏

这个资料来自网络,刚好前几天遇到了这个iiC,觉得要补一下,就找了一下资料,分享一下,感觉写的好。

相信绝大多数电子行业从业者都会接触到I2C通信协议。I2C(Inter-Integrated Circuit)总线是飞利浦半导体(现恩智浦)于20世纪80年代研发推出的一种双线式同步串行通信协议,它主要应用于微控制器与各类外围设备(例如传感器、存储器等)的连接。这一协议的核心优势在于,仅需极少的连线就能实现多个设备之间的通信,从而极大地简化了硬件设计工作。接下来,本文将从物理构成、电气特性以及核心通信协议等多个维度,对I2C展开详细介绍。

01—基本概述
I2C总线适用于任何IC生产工艺(包括NMOS、CMOS、双极性等)。该总线通过两条线——串行数据(SDA)线和串行时钟(SCL)线,在接入总线的各个器件之间传输信息。每个接入总线的器件都拥有一个独一无二的地址标识,无论它是微控制器、LCD驱动器、存储器,还是键盘接口等。并且,这些器件根据自身功能,既可以作为发送器,也可以作为接收器。在通信过程中,主机是发起总线数据传输,并生成允许传输时钟信号的器件,而被主机寻址的器件则被视为从机。


image.png


02—主要特性

SDA(串行数据)线和 SCL(串行时钟)线均为双向线路,它们借助一个电流源或者上拉电阻连接到正电源电压。当总线处于空闲状态时,这两条线路均呈现高电平。


接入总线的器件,其输出级必须采用漏极开路或集电极开路结构,如此才能实现线与功能。SCL和SDA这两条线都需要连接上拉电阻(上拉电阻的阻值一般由电源电压和总线电容共同决定),以此确保数据传输的稳定性,有效减少外界干扰。


I2C总线的数据传输速率在不同模式下有所不同:在标准模式下,传输速率最高可达100kbit/s;快速模式下,传输速率可提升至400kbit/s;而在高速模式下,传输速率更是能高达3.4Mbit/s。


接入I2C总线的接口数量,主要受总线最大电容400pF这一限制因素影响。


该总线具有极低的电流消耗,并且具备较强的抗噪声干扰能力。通过增加总线驱动器,能够使总线电容扩大10倍,进而将传输距离延长至15m。


I2C总线还具备兼容不同电压等级器件的特性。它通过简单的上拉电阻来设定参考电平,例如,当上拉电阻连接到5V电源时,总线逻辑高电平即为5V;若上拉电阻连接至3.3V电源,那么总线逻辑高电平则为3.3V。


03—I2C总线挂载方式

I2C总线支持通过外部连线开展在线检测,这一特性极大地方便了系统故障诊断与调试工作。一旦出现故障,能够迅速对故障点进行寻址,而且相关软件也便于实现标准化和模块化,有助于缩短开发周期。


在I2C总线上,每个从机都拥有独一无二的设备地址。因此,只要我们知晓器件的地址,并依据相应的时序要求,就能够实现微控制器与该器件之间的通信。不过,从实际设计经验来看,通常建议接入的器件数量不超过8个。


从理论层面而言,I2C总线上可挂载的从机数量由地址空间决定。7位地址能够提供128种组合,在扣除广播位以及保留地址0x00后,理论上I2C总线最多可挂载127个器件。但需要明确的是,协议本身并未直接对设备数量作出限制,而是规定总线电容不得超过400pF。由于器件引脚存在输入电容,同时PCB板上也存在寄生电容,这些因素都会对总线电容产生影响。所以,在实际设计过程中,为了保证信号的完整性,通常建议挂载的器件数量不超过8个。


I2C总线采用开漏(OD)输出结构,这一特性决定了它必须依靠外部上拉电阻来建立高电平。然而,上拉电阻与总线上的寄生电容会共同构成一个RC电路,该电路的时间常数会直接导致信号边沿变得平缓,进而引发信号完整性问题。当通信速率提高时,每个比特位的时间窗口会相应缩短,这就要求信号的上升沿和下降沿必须更加陡峭。因此,为了在高速传输条件下确保时序的可靠性,必须严格控制RC时间常数,具体可通过选择合适的上拉电阻或者优化PCB布局以减小总线电容来实现。

image.png

04—工作时序


1.起始/停止条件:在 I2C 总线中 唯一出现的是被定义为起始 S 和停止 P 条件。开始信号(START/S): SCL保持高电平,SDA由高电平变为低电平后,等待一小段时间,SCL变为低电平

结束信号(STOP/P)  :SCL保持高电平。SDA由低电平变为高电平

image.png

2.空闲状态:在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态。


image.png

应答信号机制详解

在 I2C 总线的通信流程中,应答信号是保障数据准确传输、确认通信状态的关键环节,其具体工作原理如下:


应答信号产生时机

应答信号的产生紧密关联着应答时钟脉冲。在 I2C 总线完成一个字节(8 位)的数据传输后,主机会生成一个特定的时钟脉冲,也就是应答时钟脉冲。在此期间,SCL 线呈现高电平状态,这是读取应答信号的关键时间窗口。


有效应答信号(ACK)

当处于应答时钟脉冲(SCL 为高电平)时段时,若从机成功接收了主机发送过来的数据,从机会主动将 SDA 线拉低,使其处于低电平状态。此时,主机在 SCL 为高电平时读取 SDA 线,检测到低电平后,就认定从机给出了有效应答信号(ACK)。这一信号表明从机已经正确接收并处理了之前传输的数据,主机可以继续进行后续的数据传输操作,比如发送下一个字节的数据或者执行其他指令。


非应答信号(NACK)

与之相反,如果在应答时钟脉冲(SCL 为高电平)期间,主机读取 SDA 线时发现其处于高电平状态,这就意味着从机没有给出有效应答,即产生了非应答信号(NACK)。非应答信号通常暗示着接收出现问题,可能的原因有多种,例如从机正在忙于处理其他任务,无法及时接收数据;或者从机内部存储空间已满,无法再接收新的数据;也有可能是数据在传输过程中出现错误,导致从机无法正确识别和处理。当主机接收到非应答信号后,会根据具体的通信协议和设计需求,采取相应的措施,比如停止当前的数据传输、重新发送数据或者进行错误处理等。


应答信号的重要性

应答信号在 I2C 总线通信中起着至关重要的作用。它为主机和从机之间提供了一种可靠的反馈机制,使得主机能够实时了解从机的接收状态,从而确保数据传输的准确性和可靠性。通过有效应答信号和非应答信号的区分,主机可以及时调整通信策略,避免因从机未成功接收数据而导致的数据丢失或通信错误,保障了整个 I2C 总线系统的稳定运行。

image.png

4.数据有效性:在I²C总线数据传输时,数据线SDA的电平状态只允许在时钟线SCL为低电平期间进行改变。而一旦SCL变为高电平,SDA必须保持绝对稳定,不能有任何跳变。任何在SCL高电平期间发生的SDA电平变化,都会被总线解读为控制传输的起始(S)或停止(P)信号,而非数据信号

image.png

05

IIC时序图


通过IIC时序图以下六个关键步骤,可以清晰地看出一条完整的I2C数据读写时序。

以下数字图标的对应的步骤:

  1. 起始信号

  2. 停止信号

  3. 应答信号

  4. 数据有效性

  5. 数据传输

  6. 空闲状态

image.png

06—IIC主机写时序实例

IIC写时序:要在I2C总线上写入,主机将在总线上发送:一个启动开始标志、从机地址、最后一位(R/W位)设置为0,这表示写入。从设备发送ACK 响应确认后,主设备将发送其希望写入的寄存器的寄存器地址。从设备将再次确认,让主设备知道它已准备就绪。在此之后,主机将开始向从机发送寄存器数据,直到主机发送了它需要的所有数据(有时这只是一个字节),并且主机将以停止条件终止传输。

image.png

具体步骤如下:1.开始信号。2.发送 I2C设备地址,每个I2C器件都有一个设备地址,通过发送具体的设备地址来决定访问哪个I2C器件。这是一个8位的数据,其中高7位是设备地址,最后1位是读写位(为1的话表示这是一个读操作,为0的话表示这是一个写操作)。3.读写控制位,因为是向I2C从设备发送数据,因此是写信号0。4.从机发送的 ACK应答信号。5.重新发送开始信号。6.发送要写入数据的寄存器地址。7.从机发送的ACK应答信号。8.发送要写入寄存器的数据。9.从机发送的ACK应答信号。10.停止信号。07—IIC主机读时序实例

主机为了读取从设备的数据,主机必须首先指出希望从从设备的哪个寄存器读取数据。这是由主机写入从设备的“写操作"类似的方式开始传输,通过发送R/W位等于0的地址(表示写入),然后是它希望从中读取的寄存器地址来完成的。一旦从设备确认该寄存器地址,主机将再次发送启动条件,然后发送从设备地址,R/W位设置为1(表示读取)。这一次,从设备将确认读取请求,主机释放SDA总线,但将继续向从设备提供时钟。在这部分事务中,主机将成为主“接收器”,将成为从“发射器”。主机将继续发送时钟脉冲SCL,但会释放SDA,以便从设备可以传输数据。在数据的每个字节结束时,主机将向从设备发送ACK,让从设备知道它已准备好接收更多数据。一旦主机接收到预期的字节数,它将发送一个NACK,向从设备发送信号以停止通信并释放总线。之后,主机将设置停止条件。

image.png


I2C单字节读时序比写时序要复杂一点,读时序分为四个步骤,第一步是发送设备地址,第二步是发送要读取的寄存器地址,第三步再发送设备地址,最后一步就是I2C从器件输出要读取的寄存器值,我们具体来看一下这步。1.主机发送起始信号。2.主机发送要读取的I2C从设备地址。3.读写控制位,因为是向I2C从设备发送数据,因此是写信号0。4.从机发送的ACK应答信号。5.重新发送 START 信号。6.主机发送要读取的寄存器地址。7.从机发送的 ACK应答信号。8.重新发送 START 信号。9.重新发送要读取的I2C从设备地址。10.读写控制位,这里是读信号1,表示接下来是从I2C从设备里面读取数据。11.从机发送的ACK应答信号。12.从 I2C器件里面读取到的数据。13.主机发出 NACK信号,表示读取完成,不需要从机再发送ACK 信号了。14.主机发出 STOP 信号,停止I2C通信。


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]