嵌入式外设调试思路:I2C 设备篇
I2C 设备调试时,建议先确认软件配置和硬件连接,再使用 i2c-tools 验证设备是否能够被正确识别。出现异常后,结合内核日志、总线波形和电气条件逐层排查。
1. I2C 速率基础
常见 I2C 时钟频率范围为 100 kHz~400 kHz ,部分 RK 平台可达到 1000 kHz;全志平台通常将 I2C 称为 TWI。
| 模式 | 典型时钟频率 | 设备树配置 |
|---|---|---|
| 标准模式 | 100 kHz | clock-frequency = <100000>; |
| 快速模式 | 400 kHz | clock-frequency = <400000>; |
遇到读写返回 NACK 或 Timeout 时,可以先将速率降到 100 kHz,再观察问题是否缓解。
2. 调试前的准备
开始调试前,先确认:
- driver(驱动)已准备好;
- device(设备树/DTS)配置正确;
- SDA、SCL、电源和地线连接正常;
- 设备上电时序符合芯片手册要求;
- 已安装并能运行
i2c-tools。
完成上述检查后,启动系统并用工具确认总线和设备地址。
3. 软件层面的排查思路
3.1 使用 i2cdetect 确认地址
先扫描目标 I2C 总线:
bash
i2cdetect -l
i2cdetect -y <bus-number>
重点确认:
- 设备是否能被扫描到;
- 扫描到的地址是否与原理图、芯片手册一致;
- 地址是 7-bit 还是 8-bit 表示。
注意:I2C 设备地址通常按 7-bit 表示,而一些资料会把读写位拼进去写成 8-bit 地址,二者不要混淆。
3.2 检查 DTS、总线与引脚复用
确认设备树中:
- 目标 I2C 控制器节点已经启用;
pinctrl指向正确的 SDA/SCL 引脚组;- 总线编号与实际使用的控制器对应;
- 从设备节点挂载在正确的 I2C 节点下;
clock-frequency处于设备支持范围。
引脚复用错误时,驱动可能看起来已经加载,但总线上不会产生正确波形。
3.3 确认驱动是否加载
分别确认 I2C 控制器驱动和从设备驱动:
bash
ls /sys/bus/i2c/devices/
dmesg | grep -i i2c
如果控制器没有注册,优先检查内核配置、设备树和平台驱动;如果控制器已注册但从设备没有出现,再检查设备节点、地址和从设备驱动匹配情况。
3.4 检查从设备状态
I2C 从设备可能处于异常状态,例如:
- 设备没有上电;
- 上电时序错误;
- 复位脚状态不对;
- 设备自身异常;
- 传感器仍处于复位或启动阶段。
传感器调试中,这类问题尤其常见。
3.5 降低时钟频率
如果读写返回 NACK、Timeout 等错误,可以先降低总线速率:
dts
&i2cX {
clock-frequency = <100000>;
status = "okay";
};
若降速后恢复,说明需要继续检查信号完整性、上拉、电容负载以及设备时序要求。
4. 硬件层面的排查思路
4.1 确认物理连接
检查以下连接是否正确:
- SDA;
- SCL;
- 电源与地;
- 上拉电阻;
- 设备地址配置脚;
- 复位和中断信号。
4.2 测量上拉电压
可以暂时断开 I2C 外设,用万用表确认 SDA 和 SCL 的上拉电压是否接近系统电平,例如 1.8 V 或 3.3 V。
若上拉电压不对,继续检查:
- 上拉电阻是否缺失或阻值不合适;
- 总线电压域是否匹配;
- 是否有器件把总线持续拉低;
- 是否存在短路或焊接问题。
4.3 结合示波器观察波形
执行扫描命令的同时,用示波器测量 SDA/SCL:
bash
i2cdetect -y <bus-number>
观察重点:
- SCL 是否产生时钟;
- SDA 是否随时钟正确变化;
- Start/Stop 条件是否存在;
- ACK 位是否返回;
- 上升沿是否过慢、是否有明显振铃或噪声;
- 是否出现总线被持续拉低的情况。
5. 建议的排查顺序
遇到 I2C 设备无法识别时,可以按下面的顺序缩小范围:
- **先看电源:**确认设备真的上电,电压和时序正确;
- **再看引脚:**确认 pinctrl、SDA、SCL 复用正确;
- **再看控制器:**确认 I2C 控制器已经注册;
- **再看地址:**区分 7-bit 与 8-bit 地址;
- **再看波形:**用示波器确认 Start、ACK 和信号完整性;
- **最后看驱动:**结合日志定位具体读写失败点。
6. 小结
I2C 调试不要只盯着驱动代码。一个完整的排查闭环应该同时覆盖:
- **软件配置:**DTS、pinctrl、控制器和从设备驱动;
- **协议验证:**总线编号、设备地址、时钟频率、ACK/NACK;
- **硬件验证:**电源、上拉、电平、线路和波形。
当 i2cdetect、日志和示波器结果能够相互印证时,定位问题会快很多。