嵌入式单片机 · 高频面试题 · 工程实战
I²C设备扫描不到地址或者总线一直Busy,是嵌入式面试中很常见的排查场景。
面试回答先说这段
I²C是开漏/开集电极总线,空闲时SCL与SDA由上拉电阻拉高;SCL为高时SDA由高到低形成START,由低到高形成STOP。每8位数据后,第9个时钟由接收方通过拉低SDA表示ACK。

面试官继续追问时,按这个逻辑展开
01先读清时序,再动代码
除了START和STOP,数据位通常要求在SCL高电平期间保持稳定。地址字节中的读写位与7位设备地址不能混淆;收到NACK不等于一定是硬件损坏,也可能是地址、供电、时序或设备状态错误。
02SDA被拉低时排查顺序
先确认电压和上拉电阻是否合理,断开从设备分段判断由哪侧持续拉低;再排查主机复位时从设备停在传输中间、引脚复用配置错误、SCL时钟被拉低或电平转换器异常。
03总线恢复和异常保护
部分从设备可按器件资料通过最多若干个SCL脉冲推进未完成的传输,再产生STOP;不能把“强行输出高电平”作为开漏总线恢复策略。若不响应,应采用受控复位或断电重上电方式,具体取决于器件手册。
04用逻辑分析仪验证
记录SCL、SDA,逐位检查时钟频率、START、地址、R/W位、ACK时刻及STOP,并观察上升沿是否因上拉过弱和总线电容过大而变慢。
面试里容易踩的两个坑
将8位地址数值直接当7位地址写入外设寄存器而不看HAL接口约定。
总线被拉低时,直接用推挽高电平硬顶,可能导致总线争用。
面试官可能再问一句
I²C出现时好时坏的NACK,你会怎样区别地址错误与上升沿太慢?

扫码关注































