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低电平时允许变化(起始/停止条件除外)。
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,并停止产生时钟,不产生停止条件。后续可由获胜主设备继续完成传输。
1.5 时钟同步
时钟同步是I2C总线多主设备通信的另一个核心机制。它确保多个主设备产生的SCL时钟能够同步,使仲裁过程在统一的时钟节拍下进行。
时钟同步通过线与特性实现:
- 低电平同步:所有主设备在SCL上输出低电平时,SCL被拉低。每个主设备在内部计数器达到低电平时间后释放SCL。但SCL保持低电平,直到所有主设备都释放为止。低电平时间由最慢的主设备决定。
- 高电平同步:当所有主设备都释放SCL后,SCL被上拉电阻拉高。但如果有主设备提前检测到SCL变高并开始计数高电平时间,而另一个主设备尚未释放,则SCL会再次被拉低。最终,高电平时间由最快的主设备决定。
- 结果:时钟同步后,所有主设备在统一的SCL时钟下工作,仲裁过程逐位进行,不会出现时钟错位。
| 阶段 | 主设备A(慢) | 主设备B(快) | SCL实际电平 |
|---|---|---|---|
| 低电平期 | 保持低电平(计数中) | 保持低电平(计数中) | 低 |
| 释放点1 | 仍保持低电平 | 释放SCL(计数结束) | 低(被A拉低) |
| 释放点2 | 释放SCL(计数结束) | 已释放 | 高(上拉电阻拉高) |
| 高电平期 | 计数高电平时间 | 计数高电平时间(更快结束) | 高 |
| 拉低点 | 仍保持高电平 | 拉低SCL(计数结束) | 低(被B拉低) |
关键理解:时钟同步使得多个主设备在仲裁过程中共享同一个SCL时钟。低电平时间由最慢的主设备决定(最长的低电平计数),高电平时间由最快的主设备决定(最短的高电平计数)。这种机制保证了仲裁的公平性和确定性。