4. Sensor上电时序

Camera Sensor 的上电时序(Power On Sequence)是初始化流程中最基础也最关键的环节。任何时序违反(如电源斜坡时间过快、复位释放过早、时钟未稳定即开始配置)都可能导致 Sensor 无法正确识别 ID、输出异常图像甚至永久损坏。本章从硬件驱动工程师的视角,系统梳理典型上电序列、复位时序要求以及时钟稳定时间窗口,并给出调试中的实测要点。

核心原则: 所有电源轨必须按照 Sensor 数据手册规定的顺序、斜坡时间(Slew Rate)和稳定延迟(Settling Delay)建立,复位信号必须在所有电源稳定且时钟稳定之后才能释放。

4.1 典型上电序列(Power On Sequence)

绝大多数 MIPI Camera Sensor 采用三路或四路独立电源供电,典型电源域包括:

  • VDD_IO (1.8V / 2.8V): I/O 接口电源,为 SCCB(I²C)、MIPI CSI 控制信号供电。
  • VDD_CORE (1.2V / 1.5V): 核心逻辑电源,为 Sensor 内部数字逻辑、PLL、ADC 供电。
  • VDD_ANA (2.8V / 3.3V): 模拟电源,为像素阵列、模拟前端(AFE)供电。
  • VDD_PLL (1.8V / 2.8V): 部分 Sensor 将 PLL 电源独立引出,以减少噪声耦合。

以下表格列出三种主流 Sensor 的上电顺序要求(以数据手册典型值为准):

电源轨 顺序 斜坡时间 (Slew Rate) 稳定延迟 (tsettle) 典型值
VDD_IO 第 1 步 ≥ 0.1 V/μs ≥ 1 ms 1.8V / 2.8V
VDD_ANA 第 2 步 ≥ 0.1 V/μs ≥ 1 ms 2.8V / 3.3V
VDD_CORE 第 3 步 ≥ 0.05 V/μs ≥ 2 ms 1.2V / 1.5V
VDD_PLL(可选) 与 VDD_CORE 同时或之后 ≥ 0.1 V/μs ≥ 1 ms 1.8V / 2.8V
常见陷阱: 部分 Sensor 要求 VDD_IO 必须最先上电,否则 I²C 总线可能处于不确定状态,导致首次通信失败。调试时若发现 I²C ACK 异常,应首先用示波器检查 VDD_IO 的上升沿是否早于其他电源。

下图展示了一个典型的三路电源上电序列时序图:

典型 Camera Sensor 上电序列时序图 典型 Camera Sensor 上电序列时序图 t t₀ t₁ t₂ t₃ VDD_IO 1.8V / 2.8V VDD_ANA 2.8V / 3.3V VDD_CORE 1.2V / 1.5V tsettle ≥ 1ms tsettle ≥ 1ms tsettle ≥ 2ms

4.2 复位时序(Reset Timing)

Sensor 复位分为硬件复位(Hardware Reset)和软件复位(Software Reset)。硬件复位通过拉低 XSHUTDOWN 或 RESET 引脚实现,软件复位通过写入寄存器(如 0x0103)触发。硬件复位时序要求更为严格,必须满足以下条件:

  1. 复位脉冲宽度(tRST_LOW): 通常要求 ≥ 1ms,部分 Sensor 要求 ≥ 10ms 以确保内部状态机完全复位。
  2. 复位释放延迟(tRST2READY): 从复位释放到 Sensor 准备好接收 I²C 命令的时间,典型值为 5ms ~ 20ms。
  3. 复位释放与时钟的关系: 复位释放必须在主时钟(MCLK / XCLK)稳定之后,否则 PLL 锁定可能失败。
调试技巧: 在驱动代码中,硬件复位释放后建议加入至少 20ms 的延迟(使用 msleep(20)),再执行 Sensor ID 读取。如果 ID 读取失败,用示波器测量 XSHUTDOWN 引脚,确认复位脉冲宽度是否满足最小值。

下图展示了复位时序与时钟稳定时间的关系:

复位时序与时钟稳定时间关系图 复位时序与时钟稳定时间关系图 t MCLK 24MHz 稳定输出 时钟建立时间 XSHUTDOWN 低电平(复位) 高电平(释放) tRST_LOW ≥ 1ms tRST2READY ≥ 5ms I²C 可进行寄存器配置

4.3 时钟稳定时间要求

Sensor 的主时钟(MCLK / XCLK)通常由外部晶振或 SoC 的 GPIO 输出提供。时钟稳定时间(Clock Settling Time)指从时钟信号开始输出到频率和幅度达到 Sensor 要求的稳定范围所需的时间。关键参数包括:

  • 频率容差: 典型要求 ±1% 以内,部分 Sensor 要求 ±0.5%。
  • 抖动(Jitter): 周期抖动(Period Jitter)通常要求 < 200ps RMS。
  • 占空比: 45% ~ 55% 之间。
  • 稳定等待时间: 从时钟使能到开始配置 Sensor 的延迟,建议 ≥ 5ms。
实测建议: 使用示波器测量 MCLK 引脚,观察从 SoC 输出使能到频率稳定(±1% 以内)的时间。如果发现频率漂移或抖动过大,应检查晶振负载电容匹配或 SoC 时钟源配置。

下表总结了不同时钟源类型的典型稳定时间:

时钟源类型 典型稳定时间 适用场景 注意事项
外部无源晶振(Crystal) 5ms ~ 20ms 高精度、低抖动需求 需匹配负载电容,起振时间较长
SoC GPIO 输出(有源时钟) 1ms ~ 5ms 多 Sensor 共用时钟、快速启动 注意 GPIO 驱动能力,避免波形畸变
内部 PLL 生成(Sensor 自带) 10ms ~ 50ms 减少外部元件、简化 PCB PLL 锁定时间较长,需等待 Lock Flag

4.4 完整上电与复位流程代码示例

以下代码展示了一个典型的 Sensor 上电与复位流程,适用于 Linux 内核驱动或 RTOS 环境:

/* 上电序列:按 VDD_IO -> VDD_ANA -> VDD_CORE 顺序 */
static int sensor_power_on(struct sensor_device *sensor)
{
    int ret;

    /* Step 1: VDD_IO 上电 */
    ret = regulator_enable(sensor->vdd_io);
    if (ret)
        return ret;
    usleep_range(2000, 3000);  /* 等待稳定,≥ 1ms */

    /* Step 2: VDD_ANA 上电 */
    ret = regulator_enable(sensor->vdd_ana);
    if (ret)
        goto err_vdd_ana;
    usleep_range(2000, 3000);

    /* Step 3: VDD_CORE 上电 */
    ret = regulator_enable(sensor->vdd_core);
    if (ret)
        goto err_vdd_core;
    usleep_range(3000, 5000);  /* 核心电源稳定时间较长 */

    /* Step 4: 使能主时钟 */
    ret = clk_prepare_enable(sensor->mclk);
    if (ret)
        goto err_clk;
    usleep_range(5000, 7000);  /* 时钟稳定时间 ≥ 5ms */

    /* Step 5: 硬件复位释放 */
    gpiod_set_value(sensor->reset_gpio, 1);  /* 拉高释放复位 */
    usleep_range(10000, 15000);              /* 等待 Sensor 就绪 */

    return 0;

err_clk:
    regulator_disable(sensor->vdd_core);
err_vdd_core:
    regulator_disable(sensor->vdd_ana);
err_vdd_ana:
    regulator_disable(sensor->vdd_io);
    return ret;
}
注意: 上电失败时,必须按照与上电相反的顺序关闭电源(Power Down Sequence),否则可能导致 Sensor 内部闩锁(Latch-up)或损坏。上述代码中的错误处理路径已经体现了这一原则。

4.5 调试检查清单

在实际调试中,建议按照以下清单逐项验证上电时序:

  • ☐ 用示波器测量各电源轨的上升沿顺序,确认与数据手册一致。
  • ☐ 测量 VDD_IO 上升时间,确保斜坡时间 ≥ 0.1 V/μs。
  • ☐ 测量复位引脚低电平宽度,确认 ≥ 1ms。
  • ☐ 测量 MCLK 频率,确认在 Sensor 要求的容差范围内(±1%)。
  • ☐ 在复位释放后等待至少 10ms 再发送 I²C 命令,验证 Sensor ID 读取成功。
  • ☐ 如果使用内部 PLL,检查 PLL Lock 寄存器状态,确认锁定后再进行后续配置。
快速定位: 如果 Sensor 初始化失败,优先检查 VDD_IO 是否最先上电、复位脉冲宽度是否足够、时钟是否稳定。这三个因素占据了 80% 以上的上电时序问题。