I2C 总线死锁、波形毛刺、地址冲突、时钟拉伸……两根线能玩出多少种不工作的花样你做的 AI 门禁系统已经能识别出人脸通过 UART 把结果发给了显示屏又通过 SPI 读到了温湿度。现在你想挂一个 I2C 接口的传感器——比如一个 EEPROM 保存配置或者一个环境光传感器。接上两根线SDA、SCL加上上拉电阻写代码运行——读不到数据。用示波器一看波形上全是毛刺ACK 信号时有时无。问题出在哪大概率是你对 I2C 只知其然不知其所以然。本期是 Comake 硬件科普第三期带你彻底搞懂 I2C 总线。读完你会知道1️⃣ I2C 与串口、SPI 相比有什么优缺点2️⃣ I2C 协议的核心时序起始、地址、数据、应答、停止3️⃣ 常见的波形毛刺是怎么产生的怎么解决4️⃣ 时钟拉伸、多主仲裁是什么5️⃣ I2C 不通时按照什么顺序排查一、I2C 是什么为什么需要它I2CInter-integrated Circuit 是飞利浦 1982 年推出的总线用 两根信号线 实现多个设备之间的短距离通信。SDA数据线SCL时钟线它解决了两个问题串口太慢、不能挂多个设备SPI 引脚太多、越多从机时 CS 引脚越多一句话I2C 用最少的两根线挂最多的一堆设备。二、I2C vs 串口 vs SPI怎么选选型建议单设备、高速、全双工 → SPI调试、简单通信、不在意速率 → UART多设备、引脚紧张、速率适中 → I2C三、I2C 协议核心I2C 总线空闲时SDA 和 SCL 都是高电平。一次完整的 I2C 传输包含以下帧1. 起始条件Start Conditionmaster 将 SCL 置高然后将 SDA 拉低。所有 slave 知道传输要开始了。 多个 master 同时抢总线时谁先拉低 SDA谁赢得总线。2. 地址帧7-bit 地址master 发送 7 位地址 1 位读/写位0写1读。例如地址 0x6D二进制 01101101最后一位若为 0 表示写1 表示读。第 9 个时钟ACK 位。被寻址的 slave 必须拉低 SDA 表示“我收到了”。⚠️ 如果 slave 没有拉低 SDA即 NACK可能原因地址错误、设备未上电、设备忙。3. 数据帧8 位数据 1 位 ACK每发送一个字节接收方必须回复一个 ACK拉低 SDA。数据帧数量任意直到 master 产生停止条件。4. 停止条件Stop Conditionmaster 将 SDA 拉低然后将 SCL 拉高再将 SDA 拉高。总线恢复空闲。5. 重复开始条件Repeated Start如果 master 想在同一总线上连续与不同 slave 通信可以不发送 stop而是发送一个 重复开始条件这样总线不会被其他 master 抢走。四、波形毛刺真实 I2C 调试案例工程师在调试 I2C 时发现波形上有“半高”的毛刺“半波高的地方其实都是在每一笔数据 ACK 信号被 slave 拉下来后间隔的地方。这时候 Host/Slave 瞬间都没人在拉因为外部还有一个 pull high 电阻在所以会被拉起来一些但之后 host 又开始传 0101 的讯号就又恢复正常。”这是正常现象不是故障。原因解释2C 是 开漏 上拉电阻 结构注意Sigma芯片的I2C默认是推挽的可以软件改为OD。当主机或从机释放 SDA都不驱动时上拉电阻会把 SDA 拉回高电平。在 ACK 之后的那个短暂“释放窗口”电压从低往高爬升如果爬升速度不够快上拉电阻太大或总线电容太大就会看到一个 缓慢上升沿看起来像“半高”。一旦主机重新驱动下一笔数据的第一个 bit通常是高电平波形立刻恢复。什么时候算真正的问题毛刺导致 SCL 上出现额外脉冲 → 检查 SCL 是否被干扰毛刺被误识别为起始/停止条件 → 检查上拉电阻是否太小上升太快或太大上升太慢毛刺幅度超过 Vih/Vil 阈值 → 需要示波器测量可能信号完整性问题解决方法五、进阶特性时钟拉伸与多主仲裁时钟拉伸Clock Stretching有些低速 slave 处理数据慢在 master 发完一个字节后slave 需要时间处理。这时 slave 可以把 SCL 拉低并保持迫使 master 等待直到 slave 释放 SCL。⚠️ 如果系统中存在会拉伸时钟的设备master 必须支持检测 SCL 被拉低并等待。大部分简单 slave 不支持时钟拉伸。多主仲裁ArbitrationI2C 允许多个 master 挂在同一总线上。当两个 master 同时想发送数据时谁先把 SDA 拉低谁赢得总线输掉的 master 自动退出等待下一次机会仲裁过程通过 线与逻辑 实现只要有一个 master 输出 0总线就是 0。 如果你的系统只有一个 master不需要关心仲裁。六、I2C 不通按这个顺序排查调试工具推荐逻辑分析仪抓取 start/address/ACK示波器看上升沿、毛刺七、Comake Pi 开发板的 I2C 优势✅ 上拉电阻已集成D1/D2 板子的 I2C 引脚默认配好 2.2k 上拉400kHz 直接跑✅ 电平兼容部分 I2C 引脚支持 1.8V/3.3V 可选✅ 总线电容优化PCB 走线已控制可挂 4~6 个标准 I2C 设备✅ 文档清晰提供 I2C 引脚地址预留表、电平配置说明✅ 软件支持Linux 标准 i2c-dev 接口i2cdetect 一键扫描设备 你不需要自己算上拉电阻不需要操心 PCB 走线直接接上传感器i2cdetect -y 0 就能看到设备地址。I2C 只有两根线但隐藏的细节足够你调一整天。上拉电阻、总线电容、地址冲突、时钟拉伸、波形毛刺——每一个点都可能让你怀疑人生。学会 I2C你就掌握了最通用的传感器交互方式。十、了解 Comake 开发板Comake Pi D1| Comake Pi D2 [点击以上链接购买 D1/D2 开发板开启实操]加入 Comake 开发者社区 [点击阅读原文] 注册社区获取完整技术资料和项目支持Tips本期I2C使用参考均在Comake社区-文档中心有任何问题均可通过 Comake 论坛提问。