111、I2C和CCI 协议深度调试:总线仲裁、时钟拉伸、ACK和NACK 排查与逻辑分析仪
111、I2C和CCI 协议深度调试:总线仲裁、时钟拉伸、ACK和NACK 排查与逻辑分析仪一、一个让我熬夜三天的I2C问题去年做某款旗舰机的前置摄像头驱动,Sensor上电后死活读不到ID。示波器挂上去,SCL波形干净得像教科书,SDA在发送地址阶段却出现毛刺——不是那种明显的电平冲突,而是ACK位之后SDA被拉低了一小段,然后莫名其妙释放。当时我盯着逻辑分析仪的波形看了两个小时,脑子里反复闪过“这他妈是ACK还是NACK?”后来发现是CCI(Camera Control Interface)的时序配置里,SCL高电平采样窗口刚好卡在Sensor内部状态机翻转的边界上。Sensor在ACK阶段需要把SDA拉低并保持一段时间,但主控这边采样点偏早,读到的SDA是高电平,于是认为NACK,直接终止传输。这种问题在示波器上看不出来,因为示波器显示的是模拟电平,而逻辑分析仪能精确抓到采样点的位置。从那以后,我养成了一个习惯:凡是I2C/CCI调试,第一件事不是看代码,而是用逻辑分析仪抓一段完整的读写序列,数清楚每个字节的ACK/NACK位置,再对照datasheet里的时序参数表。二、总线仲裁:你以为的“冲突”可能只是正常操作很多人一看到SDA被拉低就以为是总线冲突,其实I2C的多主模式里,仲裁是协议层面的正常行为。比如两个主控同时想发START条件,谁的SDA先拉低谁就赢得仲裁。但移动影像系统里,CCI通常是单主模式——主控是AP或ISP,从设备是Sensor、EEPRO