深入理解 I2C 协议 1. 引言I2CInter-Integrated Circuit集成电路总线是一种由飞利浦公司现恩智浦半导体在 1980 年代开发的同步、多主从、串行、半双工通信总线协议。它以其简洁的硬件接口仅需两根线、支持多设备连接以及灵活的通信速率等优点在嵌入式系统、传感器网络、EEPROM、实时时钟RTC等场景中得到了广泛应用。本文将深入剖析 I2C 协议的工作原理、通信时序、寻址方式并通过实战代码示例帮助读者全面掌握这一经典总线协议。2. I2C 总线物理层与信号I2C 总线仅由两根双向开漏Open-Drain线构成SDASerial Data Line串行数据线用于传输数据。SCLSerial Clock Line串行时钟线由主设备产生用于同步数据位传输。由于采用开漏输出总线需要外接上拉电阻通常为 4.7 kΩ 或 10 kΩ至电源电压VCC。这种设计允许多个设备“线与”Wire-AND任何设备都可以将总线拉低输出 0而释放总线输出 1则依靠上拉电阻将电平拉高。总线电平逻辑低电平0电压接近 GND。逻辑高电平1电压接近 VCC由外部上拉电阻决定。3. I2C 协议通信时序详解一次完整的 I2C 数据传输遵循严格的时序由主设备Master发起和控制。3.1 起始START与停止STOP条件起始条件S在 SCL 为高电平期间SDA 线上产生一个由高到低的下降沿。这标志着一次传输的开始并唤醒总线上所有从设备。停止条件P在 SCL 为高电平期间SDA 线上产生一个由低到高的上升沿。这标志着一次传输的结束总线进入空闲状态。3.2 数据传输与应答数据传输以字节8 位为单位高位MSB先发。每个字节传输后接收方必须发送一个应答ACK或非应答NACK位。数据位传输主设备在 SCL 低电平时改变 SDA 数据在 SCL 高电平时SDA 数据必须保持稳定供接收方采样。应答位ACK/NACK在第 9 个时钟脉冲即字节传输后的第一个时钟期间发送方释放 SDA 线输出高。接收方若成功接收该字节则在此周期内将 SDA 拉低作为应答ACK若接收失败或希望终止传输则保持 SDA 为高作为非应答NACK。主设备在发送数据后需要检测从设备的 ACK从设备在接收主设备发送的数据后也需要发送 ACK。4. I2C 设备寻址I2C 采用 7 位或 10 位地址寻址。7 位地址是最常用的模式可寻址 112 个设备地址 0x00 到 0x07 和 0x78 到 0x7F 为保留地址。7 位地址帧格式主设备在起始条件后立即发送一个字节。这个字节的高 7 位是从设备地址最低位LSB是读写位R/W#。0表示主设备将要向从设备写入数据Write。1表示主设备将要从从设备读取数据Read。例如向地址为 0x50二进制 1010000的设备写入数据主设备发送的地址字节为0xA01010000 0 10100000。从地址为 0x50 的设备读取数据主设备发送的地址字节为0xA11010000 1 10100001。5. 典型通信流程示例5.1 主设备向从设备写入数据主设备发送起始条件S。主设备发送从设备地址 写位0。从设备返回应答ACK。主设备发送数据字节 1。从设备返回应答ACK。…重复步骤 4-5发送更多数据主设备发送停止条件P。5.2 主设备从从设备读取数据主设备发送起始条件S。主设备发送从设备地址 读位1。从设备返回应答ACK。从设备发送数据字节 1。主设备返回应答ACK若还需读或非应答NACK若读取结束。…重复步骤 4-5读取更多数据主设备发送停止条件P。5.3 复合格式写入后读取常用于先发送寄存器地址再读取该地址数据的传感器。主设备发送起始条件S。主设备发送从设备地址 写位0。从设备 ACK。主设备发送寄存器地址字节。从设备 ACK。主设备发送重复起始条件Sr即不发送停止条件直接发起新的起始条件。主设备发送从设备地址 读位1。从设备 ACK。从设备发送数据主设备 ACK/NACK。主设备发送停止条件P。5.4 I2C 通信时序图为了更直观地理解 I2C 协议的时序下面用时序图展示一个主设备向从设备写入一个字节数据地址数据的完整过程时序图说明IDLE空闲状态从 Stop 到 Start 的状态此时 SCL 和 SDA 均为高电平。BUSY忙状态从 Start 到 Stop 的状态表示总线正在进行数据传输。Start起始条件SCL 为高电平时SDA 由高电平变成低电平标志传输开始。Stop停止条件SCL 为高电平时SDA 由低电平变成高电平标志传输结束。ACK应答接收信息的设备驱动 SDA 为低电平告知发送设备接收数据正常。S-TSlave-Transmitter从设备发送信息主设备接收信息。M-TMaster-Transmitter主设备发送信息从设备接收信息。该图清晰地展示了 I2C 协议中起始、停止、数据位传输和应答位的严格时序关系是理解和调试 I2C 通信的重要参考。时序图详细讲解上图展示了一个典型的 I2C 主设备向从设备写入一个字节数据的完整时序过程。我们可以从左到右结合时间轴和信号线变化来理解空闲状态 (IDLE)在传输开始前SCL时钟线和 SDA数据线均被上拉电阻拉至高电平逻辑1总线处于空闲、可用的状态。起始条件 (Start Condition, S)主设备在 SCL 为高电平期间将 SDA 线从高电平拉低产生一个下降沿。这个独特的信号组合SCL高SDA由高变低被总线上所有从设备识别为一次传输的开始并唤醒它们准备接收地址。地址帧传输 (Address Frame)起始条件后主设备开始发送第一个字节。这个字节包含7位从设备地址图中以 A6, A5, …, A0 表示和1位读写控制位R/W#。对于写操作该位为0。数据有效性在 SCL 为低电平期间主设备可以改变 SDA 线上的数据位置高或拉低。当 SCL 变为高电平时SDA 上的数据必须保持稳定此时从设备会采样 SDA 线上的值。每个数据位都遵循这个“低变高稳”的规则。位顺序数据传输是高位MSB先发即先发送地址的最高位 A6。应答位 (Acknowledge Bit, ACK)在发送完8位7位地址1位读写位后主设备会在第9个时钟周期释放 SDA 线即输出高电平由上拉电阻拉高并将总线控制权暂时交给目标从设备。如果总线上存在地址匹配的从设备它会在第9个时钟周期内将 SDA 线主动拉低作为应答信号ACK告知主设备“地址已识别准备就绪”。如果地址不匹配或从设备故障SDA 线将保持高电平即非应答NACK主设备应终止传输。数据帧传输 (Data Frame)收到从设备的 ACK 后主设备继续发送数据字节。图中示例发送了一个8位数据D7, D6, …, D0。数据位的传输和应答机制与地址帧完全相同。再次应答 (ACK for Data)从设备成功接收数据字节后同样在第9个时钟周期将 SDA 拉低发出 ACK 信号。停止条件 (Stop Condition, P)数据传输结束后主设备需要释放总线。停止条件的定义为在 SCL 为高电平期间SDA 线产生一个由低到高的上升沿。此后SCL 和 SDA 均恢复高电平总线再次进入空闲状态等待下一次起始条件。关键点总结主从角色在整个写操作中SCL 时钟始终由主设备产生和控制。SDA 数据线主要由主设备驱动但在两个应答位第9个时钟期间由接收方从设备驱动。同步与采样数据的变化发生在 SCL 为低时数据的采样发生在 SCL 为高时这保证了信号的同步和稳定。握手机制每个字节后的 ACK/NACK 位是重要的握手机制确保了通信的可靠性。没有收到 ACK 通常意味着通信失败。总线状态Start和Stop条件严格定义了总线“忙”BUSY周期的开始与结束。在Start之后、Stop之前总线处于占用状态。通过这张时序图可以清晰地看到 I2C 协议如何通过简单的两根线实现包括寻址、数据传输和确认在内的完整通信流程这也是其成为嵌入式系统经典总线协议的原因之一。若想观看更详细的视频讲解可前往 B 站视频I2C 通信协议详解。7. I2C 协议高级特性与注意事项7.1 时钟拉伸Clock Stretching从设备可以通过在应答位或数据位期间将 SCL 线拉低并保持来暂停主设备的时钟从而为自己争取更多的处理时间。主设备必须检测并等待 SCL 被从设备释放后才能继续。这是 I2C 支持不同速度设备共存的关键机制。7.2 总线仲裁Arbitration当多个主设备同时尝试启动传输时会进行仲裁。仲裁机制基于“线与”特性只要有一个设备输出 0总线就是 0。主设备在发送地址或数据时会同时监听 SDA 线。如果发现自己发送的是 1但检测到总线为 0则说明有其他主设备赢得了总线该设备应立即退出竞争转为从设备监听模式。7.3 通信速率标准模式Standard-mode100 kbit/s快速模式Fast-mode400 kbit/s快速模式Fast-mode Plus1 Mbit/s高速模式High-speed mode3.4 Mbit/s通信速率由主设备的 SCL 频率决定所有设备必须支持主设备设定的速率或更低速率。7.4 注意事项上拉电阻阻值需根据总线电容和电源电压计算选择通常在 4.7 kΩ 到 10 kΩ 之间。阻值过大会导致上升沿过慢通信不可靠阻值过小会导致功耗增加。总线电容总线总电容线缆电容设备引脚电容不能超过 400 pF标准模式否则信号完整性会变差。地址冲突设计系统时需注意从设备地址不能冲突许多设备可通过外部引脚配置部分地址位。8. 总结I2C 协议以其极简的硬件连接和灵活的软件控制成为嵌入式系统内部芯片间通信Inter-IC Communication的事实标准。掌握其起始/停止条件、数据/应答时序、7/10 位寻址以及复合传输格式是进行嵌入式开发和硬件调试的基础。在实际应用中还需结合具体器件的时序要求和电气特性并善用逻辑分析仪等工具进行调试才能构建稳定可靠的 I2C 通信系统。