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