I²C 通信协议常见面试问题解析
说明:本文整理 I²C 协议相关技术要点,涵盖工作原理、时序、地址机制及典型问题,适用于嵌入式系统开发参考。
1. 为什么 I²C 总线需要上拉电阻?
I²C 总线采用开漏(Open-Drain)输出结构,设备只能将总线拉低,无法主动驱动高电平。因此需通过外部上拉电阻实现以下功能:
- 维持总线空闲状态为高电平(I²C 协议定义);
- 支持多设备共享总线的“线与”逻辑;
- 避免推挽输出导致的电源-地直连短路风险;
- 兼容不同电压域设备(通过统一上拉电压)。
典型上拉电阻值为 4.7kΩ(标准模式),高速模式下可适当减小,但需考虑总线电容、驱动能力与功耗平衡。
常见追问:
- 若未接上拉电阻,总线可能悬空或持续低电平,导致通信失败。
- 上拉电阻过小会增加静态功耗,并可能超出 IO 灌电流能力。
2. 为什么 I²C 要求使用开漏输出?
I²C 规范要求使用开漏输出,主要原因包括:
- 支持多主机仲裁:当多个主机同时发送数据时,可通过检测 SDA 电平实现无损仲裁(低电平优先);
- 实现时钟拉伸(Clock Stretching):从设备可拉低 SCL 以延长处理时间;
- 允许不同供电电压的设备共用同一总线(配合合适上拉电压)。
若使用推挽输出,当两个设备输出电平相反时,可能形成大电流回路,损坏器件。
3. I²C 的地址格式有哪些?
I²C 支持两种地址格式:
- 7 位地址:地址范围 0x00–0x7F(共 128 个),实际可用约 112 个(部分地址保留)。传输时占用 1 字节,包含 7 位地址 + 1 位读写标志(R/W)。
- 10 位地址:地址范围 0x000–0x3FF(1024 个),使用两字节传输,首字节格式为
1111 0XX R/W。
注意:在寄存器配置中,7 位地址通常左移 1 位后与 R/W 位组合(例如 0x50 → 写地址 0xA0,读地址 0xA1)。
4. I²C 的通信速率有哪些?
I²C 协议定义了多种速率模式:
| 模式 | 速率 | 说明 |
|---|---|---|
| 标准模式 | 100 kbps | 适用于低速外设 |
| 快速模式 | 400 kbps | 广泛用于嵌入式系统 |
| 快速模式 Plus | 1 Mbps | 需更强驱动能力 |
| 高速模式 | 3.4 Mbps | 需专用硬件支持 |
| 超快速模式 | 5 Mbps | 仅支持单向通信 |
实际速率选择需综合考虑总线电容、布线长度、设备兼容性等因素。
5. I²C 的基本通信时序
I²C 通信包含以下关键时序特征:
- 起始条件(START):SCL 为高电平时,SDA 由高变低;
- 停止条件(STOP):SCL 为高电平时,SDA 由低变高;
- 数据传输:SCL 低电平时 SDA 可变化,SCL 高电平时 SDA 必须保持稳定;
- 应答机制(ACK/NACK):每 8 位数据后,接收方在第 9 个时钟周期输出 ACK(低电平)或 NACK(高电平)。
建议使用逻辑分析仪或示波器验证实际波形是否符合时序要求。
6. I²C 如何支持多主机通信?
I²C 通过以下机制实现多主机协调:
- 总线仲裁:各主机在发送过程中持续监测 SDA 电平。若发送高电平但检测到低电平,则退出当前传输;
- 时钟同步:SCL 信号为所有设备开漏输出的“与”结果,最慢设备可拉低 SCL 控制整体时钟节奏。
该机制确保任意时刻仅有一个主机控制总线,且已发送数据不会出错。
7. 什么是时钟拉伸(Clock Stretching)?
时钟拉伸是指从设备在需要更多处理时间时,主动将 SCL 拉低,迫使主机等待。主机必须检测到 SCL 实际恢复高电平后才能继续发送时钟。
此机制允许低速从设备与高速主机协同工作。部分 MCU 的硬件 I²C 控制器对时钟拉伸支持有限,需查阅芯片手册确认。
8. I²C 通信异常的常见原因及处理方法
| 问题 | 表现 | 处理建议 |
|---|---|---|
| 总线死锁 | SDA/SCL 持续低电平 | 主机发送 9 个时钟脉冲尝试复位 |
| 地址冲突 | 多设备响应同一地址 | 使用带地址选择引脚的器件 |
| 速率不匹配 | 数据错误或超时 | 降低通信速率,检查上拉电阻 |
| 电磁干扰 | 通信不稳定 | 缩短走线、加屏蔽、优化布局 |
2103

被折叠的 条评论
为什么被折叠?



