3. Sensor 上电时序基础概念

Sensor 上电时序(Power-up Sequence)是指 Sensor 从电源关闭状态进入正常工作状态过程中,各电源轨、控制信号(如复位、使能)以及通信接口(如 I2C)必须遵循的严格时间顺序与电平关系。错误的时序可能导致 Sensor 初始化失败、寄存器读取异常,甚至永久损坏 Sensor 内部电路。

3.1 上电时序定义

上电时序定义了 Sensor 在上电和断电过程中,各个电气参数随时间变化的先后顺序与约束条件。核心要素包括:

  • 电源轨顺序:多路供电(如 AVDD、DVDD、IOVDD)的上电先后与延迟。
  • 复位信号时序:复位引脚在电源稳定后的释放时机。
  • 使能信号时序:PWDN(掉电)/STANDBY 引脚的电平切换时刻。
  • I2C 通信使能点:Sensor 准备好接收 I2C 命令的时间窗口。
  • 稳定时间:从电源稳定到 Sensor 内部振荡器、PLL 锁定的等待时间。
调试要点:在瑞芯微平台上,Sensor 上电时序通常由 PMIC(电源管理芯片)的 GPIO 或 DVFS 控制,配合 Sensor 驱动中的 msleep()/usleep_range() 实现。务必使用示波器实测各电源轨的上升沿时间差,而非仅依赖代码中的延时数值。

3.2 典型 Sensor 上电时序图(Power-up Sequence)

下图展示了一个典型的三路供电 Sensor(如 OV5640、IMX219)的上电时序关系。图中标注了关键时间参数 t1~t5,这些参数在 Sensor 数据手册中均有明确的最小/最大值要求。

典型 Sensor 上电时序图(Power-up Sequence) t AVDD 2.8V DVDD 1.2V IOVDD 1.8V RESET 高电平(释放) I2C 可通信 t1 t2 t3 t4 t5(总上电完成时间) 说明:各时间参数 t1~t5 的具体数值需查阅对应 Sensor 数据手册,不同型号差异较大。

3.3 时序参数详解(t1, t2, t3...)

上图中的 t1~t5 是 Sensor 数据手册中最常见的时序参数。下表汇总了各参数的定义、典型范围及违反后果:

参数 定义 典型范围 违反后果
t1 AVDD 稳定到 DVDD 开始上升的延迟 0 ~ 5 ms 内部模拟电路未稳定,数字域上电可能产生毛刺
t2 DVDD 稳定到 IOVDD 开始上升的延迟 0 ~ 10 ms IO 电平未建立,数字核心可能误判复位状态
t3 IOVDD 稳定到 RESET 引脚释放(拉高)的延迟 1 ~ 20 ms 复位释放过早,Sensor 内部寄存器状态不确定
t4 RESET 释放到 I2C 可开始通信的等待时间 5 ~ 50 ms I2C 通信无应答(NACK),Sensor 未就绪
t5 总上电完成时间(从 AVDD 开始到 I2C 就绪) 10 ~ 100 ms 驱动初始化超时,Sensor 探测失败
常见陷阱:部分 Sensor 数据手册中的 t3 和 t4 可能合并为一个参数,或使用不同的命名(如 t_PU、t_START)。务必以数据手册中的时序图标注为准,不要仅凭经验值。瑞芯微平台驱动中,建议在 sensor_probe() 函数内使用 usleep_range() 实现微秒级精确延时,避免使用 msleep() 导致时序偏差。

3.4 上电时序的驱动实现要点

在瑞芯微 Linux 内核 Sensor 驱动中,上电时序通常通过以下方式实现:

  • GPIO 控制:使用 gpiod_set_value() 控制电源使能、复位、掉电引脚。
  • Regulator 框架:通过 regulator_enable() / regulator_disable() 管理多路电源轨。
  • 延时函数:usleep_range(min, max) 用于微秒级延时,msleep() 用于毫秒级。

以下是一个典型的上电时序代码片段:

static int sensor_power_on(struct device *dev)
{
    struct sensor_data *sensor = dev_get_drvdata(dev);
    int ret;

    /* 1. 使能 AVDD(模拟电源 2.8V) */
    ret = regulator_enable(sensor->avdd_reg);
    if (ret)
        return ret;
    usleep_range(2000, 3000);  /* t1: 等待 AVDD 稳定 */

    /* 2. 使能 DVDD(数字核心电源 1.2V) */
    ret = regulator_enable(sensor->dvdd_reg);
    if (ret)
        goto err_dvdd;
    usleep_range(2000, 3000);  /* t2: 等待 DVDD 稳定 */

    /* 3. 使能 IOVDD(IO 电源 1.8V) */
    ret = regulator_enable(sensor->iovdd_reg);
    if (ret)
        goto err_iovdd;
    usleep_range(5000, 7000);  /* t3: 等待 IOVDD 稳定后释放复位 */

    /* 4. 释放复位(RESET 拉高) */
    gpiod_set_value(sensor->reset_gpio, 1);
    usleep_range(10000, 15000); /* t4: 等待 Sensor 内部初始化 */

    /* 5. 此时 I2C 可开始通信 */
    return 0;

err_iovdd:
    regulator_disable(sensor->dvdd_reg);
err_dvdd:
    regulator_disable(sensor->avdd_reg);
    return ret;
}
调试建议:在瑞芯微平台上调试 Sensor 上电时序时,建议在驱动中增加 dev_dbg() 打印各电源轨的使能状态和时间戳。同时使用示波器或逻辑分析仪抓取实际波形,与数据手册时序图逐项比对。常见问题包括:t3 过短导致复位释放时 IOVDD 未稳定、t4 不足导致 I2C 通信无应答。

3.5 上电时序与 I2C 通信的关联

上电时序直接影响 I2C 通信的成败。Sensor 在未完成内部初始化前,I2C 从机地址不会响应,主机发送的寄存器读写命令将返回 NACK。典型关联点包括:

  • I2C 通信起始点:必须在 t4 结束后才能发起首次 I2C 通信。
  • 寄存器初始化窗口:部分 Sensor 在上电后有一段“初始化窗口期”,在此期间必须完成关键寄存器配置,否则 Sensor 会进入默认模式。
  • 电源波动影响:上电过程中电源轨的纹波或跌落可能导致 I2C 总线状态机异常,表现为 SCL/SDA 被拉低。
上电时序与 I2C 通信状态关系 电源未稳定 复位未释放 内部初始化 I2C 就绪 t1~t3 t3 t4 I2C 通信只能在最后一个阶段发起,提前通信将导致 NACK 或总线挂死

3.6 常见上电时序问题排查清单

现象 可能原因 排查方法
I2C 探测返回 -ENODEV 上电时序不足,Sensor 未就绪 增加 t4 延时,用示波器检查 RESET 释放到 I2C 起始的时间
寄存器读取全为 0xFF 电源未正常建立,或复位未释放 测量各电源轨电压,检查复位引脚电平
寄存器读取全为 0x00 I2C 地址错误,或 Sensor 处于掉电模式 确认 PWDN 引脚电平,核对数据手册地址
偶发性通信失败 电源纹波过大,或时序处于临界值 增加电源去耦电容,适当延长各延时参数
Sensor 输出图像异常 上电顺序错误导致内部寄存器初始化失败 严格按照数据手册时序重新配置驱动
核心原则:上电时序是 Sensor 驱动调试的“第一道关卡”。在瑞芯微平台上,建议在驱动开发初期就使用 GPIO 模拟时序,配合示波器验证,确认无误后再切换到 PMIC 控制。切勿跳过此步骤直接进行 I2C 通信调试,否则会浪费大量排查时间。