真实面经题目 · 原创解析
I2C 设备返回 NACK 时,驱动层应重试、上报还是复位总线?
这题考驱动错误处理策略,回答要先分类 NACK 来源,再决定有限重试、错误上报或总线恢复,而不是一律重试。
真实面经题目 · 原创解析
这题考驱动错误处理策略,回答要先分类 NACK 来源,再决定有限重试、错误上报或总线恢复,而不是一律重试。
设备返回 NACK 时,驱动层要先判断发生在地址阶段还是数据阶段,以及是偶发还是持续。地址 NACK 可能是设备未上电、复位中、地址错、总线频率太高、上拉波形差,或者像 EEPROM 写周期内暂时忙;数据 NACK 可能是命令非法、寄存器地址不支持、设备状态不允许继续写。处理策略不能固定:对明确可恢复的忙状态可以做有限次数、带延时的重试;对参数错误、地址错误或持续 NACK 要把 -ENXIO、-EIO 等错误上报给上层;如果伴随 SDA/SCL 卡低、仲裁丢失、控制器超时,就要做 bus recovery 或复位从机。结合上拉和频率时,可以说波形上升慢、高速采样不稳会导致 NACK,需要降频、调整上拉或用示波器确认。关键是有限重试、保留错误码、避免无限循环,并用日志区分协议错误和电气问题。
地址阶段 NACK 说明目标设备没有确认这个地址;数据阶段 NACK 说明设备收到了地址但拒绝当前数据或命令。两者指向的根因不同,不能混为一谈。
设备忙、刚复位、写周期未完成或轻微仲裁冲突可以有限重试。重试应有次数、间隔和超时,并记录统计,不能在内核里无限等待。
地址配置错、设备缺失、寄存器非法或硬件未焊接时,重试不会解决问题。驱动应返回明确错误码,让 probe 失败、用户态报错或上层状态机进入降级。
如果控制器报告总线忙、SDA/SCL 被拉低、超时或仲裁异常,问题不只是一次 NACK,应执行总线恢复、控制器复位或从机复位,并重新初始化。
写周期内器件可能暂时不响应地址,主机用有限地址重试判断内部写入完成,这是有明确语义的忙等待。
不一定。单次地址或数据 NACK 可能只是设备忙或命令非法;只有总线状态异常、线被拉低或控制器卡住时才需要恢复总线。
我会先看 dmesg 和返回码,再查 /sys 下设备、驱动和资源状态,必要时加 trace/ftrace 或最小日志,先证明问题出在设备生成、匹配、资源获取、回调路径还是用户态交互。