目录
[1. 曝光参数写入失败(参数不生效)](#1. 曝光参数写入失败(参数不生效))
[2. 曝光参数写入错误(数据被篡改)](#2. 曝光参数写入错误(数据被篡改))
[3. 寄存器地址写入偏移(写错地方)](#3. 寄存器地址写入偏移(写错地方))
[4. 帧率下降或卡死(阻塞式等待)](#4. 帧率下降或卡死(阻塞式等待))
[5. 曝光与增益联动异常(AE 算法混乱)](#5. 曝光与增益联动异常(AE 算法混乱))
[6. 长曝光模式下的特殊问题](#6. 长曝光模式下的特殊问题)
问题:
双目设备,同样的镜头同样的CIS对着同样的场景,两个CIS的模拟增益相差16倍左右,但是图像的平均亮度基本相差不大。
cpp
Sensor0:
0260109_202145[ VPSS][1970-01-01 00:00:34 441] [ak_vpss_wait_exp_stable:1295] 0 current_exp_time:2022, exp_time_max:2250, exp_step:337, cur gain:8192, 256, 434!
20260109_202146[ VPSS][1970-01-01 00:00:34 441] [ak_vpss_wait_exp_stable:1344] 1 current_exp_time:2022, exp_time_max:2250, exp_step:337, cur gain:8192, 256, 434!
20260109_202146[ VPSS][1970-01-01 00:00:34 480] [ak_vpss_wait_exp_stable:1344] 1 current_exp_time:2022, exp_time_max:2250, exp_step:337, cur gain:8192, 256, 434!
20260109_202146[ VPSS][1970-01-01 00:00:34 520] [ak_vpss_wait_exp_stable:1380] 1 exp is not stable!
20260109_202146[ VPSS][1970-01-01 00:00:34 560] [ak_vpss_wait_exp_stable:1275] is_stable!
20260109_202146[ VPSS][1970-01-01 00:00:34 561] [ak_vpss_get_soft_ps_level:2046] wait_exp_stable is over!
20260109_202146[ VPSS][1970-01-01 00:00:34 561] [ak_vpss_get_ev:2215] EV : 28081536, avg_lumi : 35, target_lumi : 38!
20260109_202146[ VPSS][1970-01-01 00:00:34 561] [day_mode_check:1433] EV : 28081536!
20260109_202146[ VPSS][1970-01-01 00:00:34 601] [ak_vpss_get_ev:2215] EV : 28081536, avg_lumi : 35, target_lumi : 38!
20260109_202146[ VPSS][1970-01-01 00:00:34 601] [day_mode_check:1433] EV : 28081536!
Sensor1;
20260109_202906[ VPSS][1970-01-01 00:00:29 768] [ak_vpss_wait_exp_stable:1344] 1 current_exp_time:2022, exp_time_max:2250, exp_step:337, cur gain:516, 256, 256!
20260109_202906[ VPSS][1970-01-01 00:00:29 839] [ak_vpss_wait_exp_stable:1380] 1 exp is not stable!
20260109_202906[ VPSS][1970-01-01 00:00:29 911] [ak_vpss_wait_exp_stable:1295] 0 current_exp_time:2022, exp_time_max:2250, exp_step:337, cur gain:532, 256, 256!
20260109_202906[ VPSS][1970-01-01 00:00:29 911] [ak_vpss_wait_exp_stable:1344] 1 current_exp_time:2022, exp_time_max:2250, exp_step:337, cur gain:532, 256, 256!
20260109_202906[ VPSS][1970-01-01 00:00:29 978] [ak_vpss_wait_exp_stable:1344] 1 current_exp_time:2022, exp_time_max:2250, exp_step:337, cur gain:540, 256, 256!
20260109_202906[ VPSS][1970-01-01 00:00:30 051] [ak_vpss_wait_exp_stable:1380] 1 exp is not stable!
20260109_202906[ VPSS][1970-01-01 00:00:30 121] [ak_vpss_wait_exp_stable:1275] is_stable!
20260109_202906[ VPSS][1970-01-01 00:00:30 121] [ak_vpss_get_soft_ps_level:2046] wait_exp_stable is over!
20260109_202906[ VPSS][1970-01-01 00:00:30 122] [ak_vpss_get_ev:2215] EV : 1108056, avg_lumi : 39, target_lumi : 42!
20260109_202906[ VPSS][1970-01-01 00:00:30 122] [day_mode_check:1433] EV : 1108056!
20260109_202906[ VPSS][1970-01-01 00:00:30 189] [ak_vpss_get_ev:2215] EV : 1108056, avg_lumi : 40, target_lumi : 42!
20260109_202906[ VPSS][1970-01-01 00:00:30 189] [day_mode_check:1433] EV : 1108056!
分析:
ISP端两个CIS读取的增益相差16倍。通过IIC回读CIS相关的曝光和增益寄存器数值。发现回读出来的数据都是0xffffff91。且在串口dmesg命令后出现大量NACK的打印。显然IIC出现了异常了。
解决方法:
参考如下描述分析解决IIC异常问题。
在 ISP(图像信号处理器)调试或摄像头驱动开发中,Sensor I2C 通信错误导致写入曝光参数(Exposure)异常是非常常见的问题。由于曝光时间直接决定画面亮度,这类错误通常表现为画面过亮、过暗、闪烁或卡死。
以下是 I2C 有误时,写入曝光参数异常的常见问题及其具体表现和原因分析:
1. 曝光参数写入失败(参数不生效)
这是最直接的表现。CPU 认为数据已经发出去了,但 Sensor 并没有收到,或者收到了但因为通信错误丢弃了。
现象:
- 画面亮度固定不变,无论怎么调节曝光时间。
- 画面保持在 Sensor 上电默认的曝光值(通常是最大或固定值)。
I2C 层面原因:
- NACK(非应答):Sensor 没有响应 I2C 写请求(硬件连接松动、Sensor 未上电、地址错误)。
- Busy Timeout:I2C 总线被锁死(Arbitration Lost),驱动层一直等待 ACK 超时,导致后续的曝光写入请求被阻塞或丢弃。
2. 曝光参数写入错误(数据被篡改)
I2C 是串行通信,如果 SDA 线上有干扰,可能导致传输的比特位翻转,Sensor 收到了错误的数值。
现象:
- 画面忽明忽暗:曝光时间被错误地写成了极小值(画面全黑)或极大值(画面全白),下一次正常写入时又恢复。
- 条纹或滚动快门异常:如果曝光时间被写成了一个非预期的奇怪数值,可能导致行曝光时间与帧周期不匹配,出现滚动条纹。
I2C 层面原因:
- SDA/SCL 电平干扰:信号线上有毛刺,导致数据位(Data Bit)传输错误。
- Slave Address 冲突:总线上有其他设备响应了地址,导致数据发错对象(虽然这种情况较少见导致随机错误,更多是固定错误)。
3. 寄存器地址写入偏移(写错地方)
曝光参数通常分布在多个寄存器(如高 8 位、低 8 位)。如果 I2C 写入的字节数不对,或者起始地址偏移,会导致数据写入到错误的寄存器中。
现象:
- 曝光调节完全失控,或者调节曝光时,画面出现奇怪的颜色失真(因为数据覆盖了相邻的增益或颜色校正寄存器)。
- 系统报寄存器读写校验错误(Checksum Error)。
I2C 层面原因:
- Restart 条件丢失:在连续写入多字节数据时,没有正确发送 Repeated Start 信号,导致 Sensor 指针没有正确递增。
- 字节序(Endianness)错误:虽然这通常是软件逻辑问题,但在 I2C 传输层如果没有正确拼接高低字节,会导致 Sensor 解析的曝光时间错误(例如把 0x1000 写成了 0x0010)。
4. 帧率下降或卡死(阻塞式等待)
当 I2C 出现错误时,驱动程序通常会进行重试(Retry Mechanism)。频繁的 I2C 错误会导致 CPU 在等待 Sensor 响应上花费大量时间。
-
现象:
-
摄像头预览帧率大幅下降(例如从 30fps 掉到 5fps)。
-
系统日志中充斥着 i2c transfer failed 或 timeout 报错。
-
I2C 层面原因:
-
重试机制:每次曝光写入失败后,软件尝试重发 3 次或更多,这占用了大量的 CPU 时间片,导致来不及处理下一个帧的曝光更新。
-
中断丢失:I2C 控制器中断未触发,导致软件一直 Polling 等待。
5. 曝光与增益联动异常(AE 算法混乱)
自动曝光(AE)算法通常是一个闭环:读取画面亮度 -> 计算曝光 / 增益 -> 写入 Sensor。如果写入 Sensor 时 I2C 报错,AE 算法可能会误判。
- 现象:
- 画面闪烁(Flicker):AE 算法发现写入曝光后画面没变化,于是在下一帧加倍曝光值,当 I2C 突然恢复正常时,画面瞬间过曝,AE 又迅速拉低,形成震荡。
- 曝光锁定失败:AE 算法试图锁定曝光,但底层写入失败,导致画面继续变化。
6. 长曝光模式下的特殊问题
在某些高分辨率或低光场景下,曝光时间很长,Sensor 可能处于 "Busy" 状态,此时 I2C 写入可能会被忽略。
现象:
- 切换到长曝光模式时,偶尔无法切换成功。
I2C 层面原因:
- Timing Violation:在 Sensor 正在进行曝光积分时,SCL 时钟频率过快,Sensor 无法在积分间隙响应 I2C 命令。
排查与定位建议
-
查看 Kernel Log:
-
搜索关键词 i2c、timeout、nack、error。
-
例如:i2c transfer error: 0x10 (Address NACK)。
-
Scope / 逻辑分析仪抓波形:
-
这是最直接的方法。观察 SDA 和 SCL 线上是否有毛刺。
-
检查在写入曝光寄存器的时间段内,是否有 Stretching(时钟拉伸) 现象,即 Sensor 拉低 SCL 不让 CPU 发送数据。
-
检查硬件连接:
-
确认 I2C 上拉电阻(Pull-up Resistor)是否合适(通常 2.2k-4.7k)。
-
检查 Sensor 供电(AVDD, DVDD, IOVDD)是否稳定,电压跌落会导致 Sensor 无法响应 I2C。
-
软件层面增加校验:
-
在写入曝光参数后,立即进行一次 Read Back(回读)。如果读出的值与写入的值不一致,说明 I2C 通信有问题或 Sensor 工作异常。