嵌入式分享#19:《嵌入式外设调试思路》--I2C设备篇

嵌入式外设调试思路: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. 调试前的准备

开始调试前,先确认:

  1. driver(驱动)已准备好;
  2. device(设备树/DTS)配置正确;
  3. SDA、SCL、电源和地线连接正常;
  4. 设备上电时序符合芯片手册要求;
  5. 已安装并能运行 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 设备无法识别时,可以按下面的顺序缩小范围:

  1. **先看电源:**确认设备真的上电,电压和时序正确;
  2. **再看引脚:**确认 pinctrl、SDA、SCL 复用正确;
  3. **再看控制器:**确认 I2C 控制器已经注册;
  4. **再看地址:**区分 7-bit 与 8-bit 地址;
  5. **再看波形:**用示波器确认 Start、ACK 和信号完整性;
  6. **最后看驱动:**结合日志定位具体读写失败点。

6. 小结

I2C 调试不要只盯着驱动代码。一个完整的排查闭环应该同时覆盖:

  • **软件配置:**DTS、pinctrl、控制器和从设备驱动;
  • **协议验证:**总线编号、设备地址、时钟频率、ACK/NACK;
  • **硬件验证:**电源、上拉、电平、线路和波形。

当 i2cdetect、日志和示波器结果能够相互印证时,定位问题会快很多。

相关推荐
pirateeee32 分钟前
Yocto 构建基于官方 imx6ull-14x14-evk 的 ubuntu 镜像
linux·嵌入式硬件
恒锐丰科技林技术员34 分钟前
EG2132 半桥栅极驱动芯片解析:高压半桥应用的性价比之选
经验分享·嵌入式硬件·硬件工程
尼喃1 小时前
3.7V升压5V芯片——平芯微PW5100/PW5300/PW5300A/PW6276/PW5303/PW5012
嵌入式硬件
意法半导体STM321 小时前
【官方原创】LAT6041 STM32MP1x USB OTG FIFO设置
stm32·单片机·嵌入式硬件·mcu·fifo·stm32mp1x
笨笨饿1 小时前
#145 _Codex 三层故障详细排查与修复步骤
开发语言·人工智能·stm32·单片机·嵌入式硬件
深圳老胡1 小时前
STM32C5A3ZG开发板网络接口配置流程详解
笔记·stm32·单片机·代码规范
传感器与混合集成电路1 小时前
多通道伺服数据采集模块国产ADC 16位同步采样与运放调理设计
嵌入式硬件
深圳老胡1 小时前
STM32C5A3ZG 开发板调试笔记:USB 复用 ST-Link 与工程生成警告说明
笔记·stm32·单片机·代码规范
QMCY_jason9 小时前
RK3588 usb摄像头 mipi摄像头 hdmi in 调试记录
单片机·嵌入式硬件
国科安芯9 小时前
四重证据,一条逻辑链:商业航天级微控制器MCU抗辐射验证方法学综述——以国科安芯AS32S601为例
人工智能·单片机·嵌入式硬件·mcu·安全·抗辐射