海思ISP Sensor初始化与AF对焦联调实战 - 第4节
4.1 硬件上电序列
Sensor 上电序列是芯片正常工作的第一道门槛。不同厂商(Sony、Samsung、OmniVision)的时序要求略有差异,但核心原则一致:先供电、再拉高复位、最后配置 I²C。错误的顺序可能导致 sensor 无法识别、输出花屏甚至损坏。
4.1.1 典型三路电源
| 电源域 | 典型电压 | 用途 | 上电顺序 |
|---|---|---|---|
| VDD_IO (DVDD) | 1.8V / 2.8V | I²C、MIPI、GPIO 接口电源 | 第 1 位 |
| VDD_CORE (AVDD) | 1.2V / 1.8V | 内部核心逻辑、PLL、ADC | 第 2 位 |
| VDD_PIX (VAA) | 2.8V / 3.3V | 像素阵列、模拟读出 | 第 3 位 |
实战提示:多数 sensor 要求 VDD_IO 先稳定,再上 VDD_CORE,最后 VDD_PIX。部分 Sony IMX 系列允许 VDD_IO 与 VDD_CORE 同时上升,但 VDD_PIX 必须最后。查阅 datasheet 中的 "Power-Up Sequence Timing Diagram" 确认。
4.1.2 上电时序关键参数
- T1 – 电源上升时间:通常要求 < 1ms(从 10% 到 90%),过慢可能导致 sensor 内部 POR(Power-On Reset)误触发。
- T2 – 电源稳定到复位释放:所有电源达到标称值后,需等待至少 1ms 再拉高 XCLR(复位引脚)。
- T3 – 复位释放到 I²C 通信:复位释放后,sensor 内部 PLL 和寄存器需要初始化,通常等待 5ms~20ms 才能进行 I²C 读写。
4.2 Reset 与 Standby 模式
Reset 和 Standby 是 sensor 两种低功耗/复位状态,驱动工程师必须清楚它们的区别和切换条件。
4.2.1 硬件复位 vs 软件复位
| 复位类型 | 触发方式 | 寄存器状态 | 恢复时间 | 典型场景 |
|---|---|---|---|---|
| 硬件复位 (XCLR) | 拉低 XCLR 引脚 ≥ 1ms | 全部恢复默认值 | 5~20ms | 上电初始化、异常恢复 |
| 软件复位 (Register 0x0103) | I²C 写入复位命令 | 全部恢复默认值 | 2~10ms | 模式切换、参数重载 |
| Group Hold | 寄存器 0x0104 控制 | 部分寄存器锁定 | 立即生效 | 多寄存器同步写入 |
4.2.2 Standby 模式
Standby 模式下 sensor 停止输出图像,但保留寄存器配置,唤醒速度比完全复位快得多。
- 硬件 Standby:通过 XCLR 引脚拉低进入,功耗 < 100μA,唤醒需重新初始化 PLL。
- 软件 Standby:通过寄存器 0x0100[0] = 0 进入,功耗 < 500μA,唤醒仅需恢复 MIPI 时钟。
- Streaming On/Off:寄存器 0x0100[0] = 1 开始输出,= 0 停止输出,这是日常对焦调试最常用的控制方式。
常见陷阱:部分 sensor 在 Standby 模式下 I²C 仍然响应,但 MIPI 时钟停止。如果此时读取帧计数器,可能返回无效值。务必在唤醒后等待至少 1 帧时间再读取图像数据。
4.3 PLL 锁定时间
PLL(锁相环)负责为 sensor 内部 ADC、MIPI 和像素驱动提供时钟。PLL 锁定时间直接影响上电到出图的总延迟。
4.3.1 PLL 锁定时间的影响因素
- 参考时钟频率:通常为 6~27MHz 晶振或外部时钟。频率越高,锁定越快。
- VCO 增益与环路带宽:带宽越宽,锁定越快,但噪声越大。sensor 厂商会平衡锁定时间与抖动性能。
- 分频比:从参考时钟到目标频率的分频倍数。分频比越大,锁定时间通常越长。
- 温度与电压:极端温度下 PLL 锁定时间可能延长 2~3 倍。
4.3.2 典型锁定时间范围
| Sensor 类型 | 参考时钟 | 典型锁定时间 | 最大锁定时间 |
|---|---|---|---|
| VGA / 1MP 低端 | 6~12 MHz | 1~3 ms | 5 ms |
| 2~8MP 主流 | 12~24 MHz | 3~8 ms | 15 ms |
| 12MP+ 高端 | 24~27 MHz | 5~15 ms | 25 ms |
驱动实现要点:在 I²C 初始化序列中,配置完 PLL 相关寄存器后,必须插入至少
max_lock_time + 2ms 的延时,再开始配置其他寄存器。部分 sensor 提供 PLL Lock 状态寄存器(如 0x001E[0]),建议轮询该位确认锁定后再继续。
4.3.3 代码示例:PLL 锁定等待
// 配置 PLL 寄存器
sensor_write_reg(0x0300, 0x04); // PLL 分频配置
sensor_write_reg(0x0301, 0x00);
sensor_write_reg(0x0302, 0x1E); // VCO 倍频
sensor_write_reg(0x0303, 0x00);
sensor_write_reg(0x0304, 0x03); // 输出分频
// 等待 PLL 锁定(最大 15ms)
uint32_t timeout = 15000; // 15ms 超时
while (timeout--) {
uint8_t status = sensor_read_reg(0x001E);
if (status & 0x01) {
break; // PLL 已锁定
}
delay_us(1);
}
if (timeout == 0) {
// 处理 PLL 锁定失败
printf("ERROR: PLL lock timeout!\n");
return -1;
}
4.4 上电时序实战检查清单
在驱动调试阶段,使用示波器或逻辑分析仪验证以下时序点:
- 电源上升顺序:VDD_IO → VDD_CORE → VDD_PIX,上升时间 < 1ms。
- XCLR 释放时机:所有电源稳定后至少 1ms 再拉高。
- I²C 首次通信时机:XCLR 拉高后等待 5~20ms(具体值查 datasheet)。
- PLL 锁定确认:配置 PLL 后轮询锁定状态或等待最大锁定时间。
- MIPI 时钟稳定:PLL 锁定后再等待 1~2 帧时间,确保 MIPI 时钟稳定再开始接收图像数据。
调试技巧:如果 sensor 初始化后无输出,优先检查 XCLR 引脚电平是否被外部电路拉低。部分开发板的 XCLR 默认接 GPIO,需要在 bootloader 阶段提前拉高,否则 sensor 一直处于复位状态。