I2C 用开漏 SDA/SCL 和上拉电阻实现多设备共享。总线上的任何节点都只能主动拉低,释放后由上拉电阻恢复高电平。主机通过 SCL 为高时 SDA 的变化产生 START 和 STOP,再以地址、读写位、数据字节和 ACK 组织一笔事务。
先看波形,再怀疑驱动代码
枚举不到设备时,逻辑分析仪或示波器比继续改地址更快。先确认总线空闲时 SDA/SCL 都能到高电平,再看 START 后地址字节是否正确、ACK 是否在第九个时钟出现、上升沿是否过慢。常见错误包括把 7 位地址又左移一次、读写方向颠倒,以及没有处理设备要求的重复起始。
总线速率不是只改一个寄存器。线路长度、器件数量、电容和上拉值都会改变上升时间;若波形在高电平前还没有稳定,就算控制器寄存器配置成更高频率也无法可靠通信。
卡死恢复要有退出条件
设备在传输中复位时可能把 SDA 拉低。若硬件允许由主机控制 SCL,可以在确认没有其他主机活动后输出若干个时钟脉冲,让从机推进到可释放 SDA 的位置,再生成一个 STOP。9 个脉冲是常见做法,但不是万能修复;恢复失败时应复位 I2C 控制器,必要时复位从设备或上报故障,避免无限循环占满 CPU。
参考:嵌入式资源汇总