总线抓波 / 排障
主机发完设备地址后,程序显示NACK。有人马上换上拉电阻,也有人立刻怀疑芯片损坏。更专业的排查应先回到线上:第9个时钟周期的SDA究竟是谁在驱动?
从原始波形定位时序
图为公开I²C示波波形示例。I²C采用开漏/开集电极配合上拉的总线方式:释放信号线不等于主动拉高;ACK周期应由接收方拉低SDA,NACK则保持高电平。地址帧还需把7位地址与读写位分开理解,不要把8位地址字节直接当设备的7位地址。

先看哪个节点,后动哪里
START是否成立:SCL高电平期间SDA由高变低;如果没有正确起始条件,后续地址无意义。
地址与R/W位:按MSB先发逐位解码,确认文档是7位地址还是包含方向位的8位表示。
第9位ACK:观察SDA是否真的被拉低;同时量测SCL上升沿是否过慢、是否存在时钟拉伸。
供电与复位:检查目标器件供电、使能、复位释放时序,以及是否在设备初始化完成前访问。
为什么只靠软件日志不够
日志中的NACK只是控制器看到的结果,不能直接判定是地址错、器件未上电、上升时间过慢、总线被占用,或目标不支持当前阶段的命令。必要时降速复现并比对电平。
“我会先用逻辑分析仪确认START、7位地址和读写位,再定位第9拍ACK及SCL/SDA电平;随后检查目标供电、复位、上拉和时序参数,而不是先改驱动。软件报NACK需要用总线波形核实。”
追问:SDA一直低怎么办?先检查是否有从设备挂住、上一个事务未完成,按器件和控制器手册采取可恢复的总线复位步骤。
凡亿教育 · 电子工程师面试平台

扫码关注






























