深入理解 I²C 协议
互连集成电路(I²C)协议一直是短距离、板内通信的核心技术。然而,实现稳定可靠的 I²C 通信并非仅仅连接两根线那么简单。本文通过常见问题解析,深入探讨开漏物理层与寄存器级寻址的技术细节,帮助读者更透彻地理解 I²C 通信原理。
I²C 与 SPI 等推挽式接口有何区别?
I²C 最核心的特征是开漏(或开集电极)架构。
与 SPI、UART 采用推挽驱动、主动将信号线拉至高电平或低电平不同,I²C 设备只能主动将总线拉低,无法主动拉高。
图 1 展示了该拓扑结构:多个设备(控制器与目标设备)连接到共享的串行数据线(SDA)和串行时钟线(SCL)。值得注意的是,两条总线均通过外部上拉电阻(Rp)连接至电源电压(VDD)。

图 1. 简化 I²C 系统拓扑,展示控制器与多个目标设备连接至共享 SDA、SCL 总线(图片来源:安世半导体 Nexperia)
I²C 的高低电平逻辑如下:
逻辑 0(低电平):发送 0 时,器件内部 N 沟道 MOSFET 导通,信号线直接接地,电路主动灌电流。
逻辑 1(高电平):发送 1 时,器件关断内部 MOSFET,引脚进入高阻态,总线悬空,由外部上拉电阻将电压拉回 VDD。
多主机系统中为何必须采用开漏架构?
该架构形成了线与(Wired‑AND)逻辑。
由于没有设备主动输出高电平,多个设备可同时挂接在总线上,不会出现一个设备输出高电平、另一个拉低而导致 VDD 到 GND 短路的风险。
只要任意一个设备将总线拉低,整个总线就会呈现低电平。这一物理特性支撑了 I²C 两项关键功能:
时钟同步:低速目标设备可拉低 SCL,暂停控制器传输。
总线仲裁:多控制器系统中,若两个控制器同时发送,发送 0 的一方会 “覆盖” 发送 1 的一方,实现非破坏性仲裁。
有效 I²C 通信的基本规则

图 2 展示了完整的 I²C 帧结构:8 位数据、高位先行、双向传输协议。为便于理解,可将通信分为三部分。
图 2. 完整 I²C 数据传输结构(图片来源:恩智浦半导体 NXP)
传输事务
传输帧由仅在时钟为高电平时才会出现的特定电气状态界定:
起始条件(S):SCL 为高电平时,SDA 从高电平变为低电平。
用于唤醒总线上所有设备并开始监听。
停止条件(P):SCL 为高电平时,SDA 从低电平变为高电平。
标志事务结束,总线回到空闲状态。
注意:数据传输期间,SCL 为高电平时 SDA 必须保持稳定,仅允许在 SCL 低电平时改变状态。
地址处理
起始条件后的第一个字节为地址帧,包含:
目标地址(7 位):从机设备的唯一标识。
读 / 写位(1 位):该字节最低位。
0:写操作(控制器 → 目标设备)
1:读操作(目标设备 → 控制器)
第 9 位:应答位
每传输一个字节(地址或数据)后,都会跟随第 9 个时钟脉冲,即应答位(ACK/NACK)。
ACK(逻辑 0):接收方拉低 SDA,表示已正确接收该字节。
NACK(逻辑 1):接收方保持 SDA 高电平,表示非应答。
通常代表设备不存在、设备忙或读序列结束。
实例分析
以下是 I²C 在硬件层面写入设备内部指定寄存器的实际应用。图 3 展示对德州仪器 DAC80501 数模转换器进行多字节写入的过程。

图 3. I²C 写帧解析,展示配置外设所需的地址、命令与数据字节序列(图片来源:德州仪器 Texas Instruments)
操作可简化为三步:
地址帧:控制器发送地址 + 写位(如 0x49 + 0)。
命令帧:控制器发送寄存器指针(如 0x08),
告知 DAC 后续数据将写入 DAC 数据寄存器。
数据帧:控制器发送 16 位电压值(高位在前,低位在后)。
这是执行器类设备的标准工作流程:地址 → 命令 → 数据。
总结
掌握 I²C 不能只停留在调用库函数层面,还需要理解:
高电平是被动上拉而非主动驱动;
第 9 位(ACK)是有效数据传输的基础握手机制;
复杂的寄存器访问几乎都遵循先写指针,再发起重复起始条件的流程。
关键词: I²C 协议
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码