1. I2C协议基础:总线物理层特性、SCL与SDA线、上拉电阻、总线仲裁与时钟同步

I2C(Inter-Integrated Circuit)总线由Philips(现NXP)在1980年代推出,是一种同步、多主从、串行通信总线。它仅需两根信号线即可连接多个设备,是嵌入式系统中传感器、存储器、IO扩展等外设通信的事实标准。理解其物理层特性是后续寄存器配置与HAL驱动开发的基础。

1.1 总线物理层特性

I2C总线采用开漏(Open-Drain)结构,两根线——串行时钟线(SCL)和串行数据线(SDA)——均为双向。总线空闲时,SCL和SDA均处于高电平。任何设备都可以通过拉低总线来发起通信。

特性 说明
信号线数量 2根(SCL + SDA)
传输方式 同步串行,时钟由主设备产生
设备角色 主设备(Master)发起通信并产生时钟;从设备(Slave)响应地址
最大从设备数 受限于总线电容(通常400pF),理论最多128个(7位地址)
标准速率 标准模式(100 kbit/s)、快速模式(400 kbit/s)、高速模式(3.4 Mbit/s)
总线拓扑 多主多从,支持总线仲裁
提示:XMC系列微控制器(如XMC1300、XMC4500)的I2C外设支持标准模式和快速模式,部分型号支持快速模式+(1 Mbit/s)。在硬件设计时,需根据总线长度和从设备数量选择合适的上拉电阻,确保上升沿时间满足时序要求。

1.2 SCL与SDA线

SCL(Serial Clock Line)和SDA(Serial Data Line)在电气上完全对称,均为开漏输出。主设备控制SCL的时钟频率,SDA上的数据在SCL高电平时被采样,在SCL低电平时允许变化(起始/停止条件除外)。

I2C总线物理连接拓扑 主设备 XMC微控制器 从设备1 温度传感器 从设备2 EEPROM SDA SCL Rₚ Rₚ VDD (3.3V/5V) VDD (3.3V/5V) 关键说明: • SDA和SCL均为开漏输出,必须通过上拉电阻Rₚ连接到VDD • 总线空闲时,SDA和SCL均为高电平(由Rₚ拉高) • 任何设备拉低总线时,其他设备检测到低电平后必须释放总线

1.3 上拉电阻

上拉电阻是I2C总线正常工作的关键元件。由于开漏结构无法主动输出高电平,必须依靠外部上拉电阻将总线拉高。电阻值的选择直接影响总线功耗、上升时间和最大通信速率。

参数 标准模式(100 kbit/s) 快速模式(400 kbit/s) 说明
推荐Rₚ范围 4.7 kΩ ~ 10 kΩ 1.5 kΩ ~ 4.7 kΩ 总线电容越大,Rₚ需越小
最大上升时间tᵣ 1000 ns 300 ns RC时间常数决定
总线电容Cb ≤ 400 pF ≤ 400 pF 包括引脚、走线、从设备电容
最小Rₚ限制 由Vₒₗ(max)决定 由Vₒₗ(max)决定 保证低电平输出不超过0.4V
注意:在XMC系列开发板上,I2C上拉电阻通常已集成在板级(如4.7 kΩ)。如果自行设计PCB,务必根据总线电容和通信速率计算Rₚ值。Rₚ过大会导致上升沿过缓,造成通信错误;Rₚ过小会增加功耗并可能损坏开漏输出管脚。

1.4 总线仲裁

I2C总线支持多主设备同时发起通信。总线仲裁机制确保多个主设备竞争总线时,只有一个主设备获胜并继续传输,而失败的主设备自动释放总线并转为从设备模式。

仲裁发生在SDA线上,基于线与(Wired-AND)逻辑:

  • 仲裁过程:多个主设备同时输出时钟(SCL由所有主设备共同驱动),并在SDA上逐位比较数据。如果某个主设备输出高电平但检测到SDA为低电平(被其他主设备拉低),则该主设备仲裁失败。
  • 仲裁规则:输出低电平的主设备获胜。因此,发送数据中“0”更多的设备具有更高优先级。
  • 仲裁丢失处理:失败的主设备必须立即释放SDA和SCL,并停止产生时钟,不产生停止条件。后续可由获胜主设备继续完成传输。
I2C总线仲裁过程示意 主设备A 发送 0x6A 主设备B 发送 0x7F SDA ⚡ 仲裁获胜 主设备A继续 仲裁失败 主设备B释放总线 仲裁原理: • 主设备A发送0x6A(二进制 0110 1010),主设备B发送0x7F(二进制 0111 1111) • 在第5位时钟周期,A输出0(低电平),B输出1(高电平),SDA被A拉低 → B检测到电平不一致 → B仲裁失败 • 失败主设备必须立即释放SDA和SCL,不产生停止条件

1.5 时钟同步

时钟同步是I2C总线多主设备通信的另一个核心机制。它确保多个主设备产生的SCL时钟能够同步,使仲裁过程在统一的时钟节拍下进行。

时钟同步通过线与特性实现:

  • 低电平同步:所有主设备在SCL上输出低电平时,SCL被拉低。每个主设备在内部计数器达到低电平时间后释放SCL。但SCL保持低电平,直到所有主设备都释放为止。低电平时间由最慢的主设备决定。
  • 高电平同步:当所有主设备都释放SCL后,SCL被上拉电阻拉高。但如果有主设备提前检测到SCL变高并开始计数高电平时间,而另一个主设备尚未释放,则SCL会再次被拉低。最终,高电平时间由最快的主设备决定。
  • 结果:时钟同步后,所有主设备在统一的SCL时钟下工作,仲裁过程逐位进行,不会出现时钟错位。
阶段 主设备A(慢) 主设备B(快) SCL实际电平
低电平期 保持低电平(计数中) 保持低电平(计数中) 低
释放点1 仍保持低电平 释放SCL(计数结束) 低(被A拉低)
释放点2 释放SCL(计数结束) 已释放 高(上拉电阻拉高)
高电平期 计数高电平时间 计数高电平时间(更快结束) 高
拉低点 仍保持高电平 拉低SCL(计数结束) 低(被B拉低)
关键理解:时钟同步使得多个主设备在仲裁过程中共享同一个SCL时钟。低电平时间由最慢的主设备决定(最长的低电平计数),高电平时间由最快的主设备决定(最短的高电平计数)。这种机制保证了仲裁的公平性和确定性。

1.6 本章小结