I2C 信号怎么测?从万用表到示波器的完整排查流程

I2C 调试时,软件日志只能告诉你"失败了",SDA、SCL 的电压和波形才能告诉你"失败在哪里"。下面结合万用表与示波器,梳理一套实用的 I2C 信号排查方法。

1. 先回顾 I2C 通信I2C 以字节为基本传输单位,但传输 1 个字节实际需要 9 个时钟周期:前 8 个周期传输数据,第 9 个周期返回 ACK 或 NACK。I2C 采用高位在前(MSB first)。关键时序:- 起始 S: SCL 为高电平期间,SDA 从高电平跳变为低电平;- 停止 P: SCL 为高电平期间,SDA 从低电平跳变为高电平;- ACK: 接收器收到 8 bit 后,在第 9 个时钟周期把 SDA 拉低;- 数据稳定: SCL 为高电平时 SDA 必须保持稳定,只有 SCL 为低电平时 SDA 才允许变化。## 2. i2cdetect 扫不到设备怎么办设备树和控制器都打开了,但执行 i2cdetect -y 2 仍然扫不到设备时,不要立刻只改驱动。可以先把外设拆下,只保留 SoC 侧 SDA、SCL 和上拉电阻,先确认主控能否输出,再判断外设是否应答。## 3. 第一步:用万用表测空闲电压没有通信时,SDA 和 SCL 都应该是高电平。I2C 是开漏/开集输出,需要外部上拉电阻;例如上拉到 3.3V 时,两根线空闲状态都应接近 3.3V。如果电平不对,优先检查:- 上拉电阻是否漏焊、阻值是否合适;- 上拉电源是否正确;- SDA、SCL 是否短路或接反;- 某个外设是否把总线持续拉低;- 管脚复用和控制器供电是否正常。## 4. 第二步:用示波器抓波形确认空闲电压正常后,一边执行:bashi2cdetect -y 2一边用示波器观察 SDA 和 SCL。建议两个通道分别接 SDA、SCL,并使用合适的地线。主机会向不同地址发起访问,正常情况下应看到连续的起始、地址、数据和停止波形。至少确认:1. SCL 有规律的时钟;2. SDA 在 SCL 高电平期间基本稳定;3. 起始和停止条件符合定义;4. 地址发送后进入第 9 个时钟的 ACK 周期。如果连 SCL 都没有波形,检查控制器、管脚复用、总线编号和驱动是否真正发起传输;若 SCL 有波形但 SDA 异常,再检查 SDA 线路、上拉和外设拉低情况。## 5. 重点看第 9 个时钟的 ACK

调试初期不必一上来解出所有 bit,最关键的是看第 9 个时钟周期:SDA 有没有被拉低。

  • SDA 在第 9 个时钟被拉低,说明从设备返回 ACK,至少表明地址访问建立了基本通信;
    • SDA 没有被拉低,说明是 NACK,主机发出请求但没有设备应答。
      拆掉外设后,看到主机发出地址和时钟但没有 ACK,是正常现象。接回外设后,如果供电、复位和地址都正确,对应地址应出现 ACK。还要注意地址格式:芯片手册常写 8 bit 地址,而 Linux 驱动和 i2cdetect 通常使用 7 bit 地址。

6. 正常和异常波形

正常波形的特征是:空闲时 SDA、SCL 都为高;SCL 高电平期间 SDA 稳定;时钟周期稳定、边沿清晰;目标地址访问时第 9 个时钟有 ACK。

常见异常:

  • SDA/SCL 一直低: 总线可能被拉死,检查短路、焊接、上拉、供电和占线设备;
    • 两根线一直高且无波形: 主控可能没发起传输,检查设备树、管脚复用、控制器时钟和总线编号;
    • 有时钟但无 ACK: 检查 7 bit 地址、供电、复位、接线和上拉;
    • 纹波大、边沿差: 检查上拉阻值、总线电容、线长、地回路、探头接地和电源噪声。

7. 排查 Checklist

  1. 确认 I2C 总线编号;
    1. 测 SDA、SCL 空闲电压;
    1. 检查上拉电阻和上拉电源;
    1. 检查管脚复用、时钟和设备树;
    1. i2cdetect 确认是否产生 SCL;
    1. 检查 SDA 在 SCL 高电平期间是否稳定;
    1. 观察第 9 个时钟是否有 ACK;
    1. 核对 7 bit/8 bit 地址;
    1. 检查供电、复位、接线和外设模式;
      10.10. 最后再分析驱动和上层协议。

8. 总结

万用表可以判断上拉和空闲电平,示波器可以定位时钟、数据、边沿和 ACK。I2C 调不通时,先测 SDA/SCL 的电压和波形,看到 ACK 才说明主从通信真正建立起来。

相关推荐
潘潘的嵌入式日记4 天前
I²C 主机读到的 U16 偶尔跳变?先修复多字节快照发布
嵌入式·并发·数据一致性·i2c·快照
WWJA王文举7 天前
从设备地址到寄存器地址:I²C驱动完整流程详解
嵌入式开发·rtos·通信协议·i2c
程序员老舅2 个月前
啃透 I2C 驱动开发,才算入门嵌入式 Linux 内核驱动
数据结构·驱动开发·b树·内核·嵌入式·嵌入式开发·i2c
ItJavawfc2 个月前
Linux驱动-IIC完善FT5X06设备节点和驱动
i2c·驱动-完善i2c 设备树·i2c-完善驱动
阿拉斯攀登2 个月前
I2C 设备驱动开发
linux·驱动开发·嵌入式硬件·嵌入式·linux驱动·i2c·字符设备驱动
ALINX技术博客3 个月前
【黑金云课堂】FPGA技术教程FPGA基础:I2C 总线通信技术
fpga开发·i2c
硬件工程师宝典3 个月前
I2C从入门到精通之一:I2C的历史起源和综合简介
服务器·嵌入式硬件·硬件架构·i2c
fffzd4 个月前
STM32:IIC与温湿度传感器(轮询模式)
stm32·单片机·嵌入式硬件·iic·通信·嵌入式软件·i2c
大阳1234 个月前
ARM.7(UART,I2C)
arm开发·单片机·嵌入式硬件·i2c·at24c02