3. Sensor 上电时序关键参数与典型波形
Sensor 上电时序是 Camera 模组正常工作的基础。若 AVDD、DVDD、IOVDD、MCLK、PWDN、RST 等信号的时序关系不满足 Sensor 数据手册要求,轻则 I2C 无法通信,重则 Sensor 初始化失败甚至损坏硬件。本章逐一拆解每个关键参数的定义、时序约束与典型波形。
3.1 电源域:AVDD、DVDD、IOVDD
Sensor 通常需要三路独立电源,分别供给模拟电路、数字核心与 IO 接口。三者的上电顺序、电压稳定时间与纹波要求直接影响 Sensor 内部 PLL 锁定与像素阵列偏置。
| 电源符号 | 典型电压 | 供电对象 | 关键约束 |
|---|---|---|---|
| AVDD | 2.8V / 3.3V | 模拟电路(像素偏置、PLL、ADC) | 纹波 < 30mVpp;先于 DVDD 稳定 |
| DVDD | 1.2V / 1.8V | 数字核心(逻辑、ISP 前端) | 纹波 < 50mVpp;必须在 AVDD 之后建立 |
| IOVDD | 1.8V / 2.8V | IO 接口(I2C、MCLK、PWDN、RST) | 与 DVDD 同时或稍后;需匹配主控 IO 电平 |
工程经验: 多数 Sensor 要求 AVDD 先于 DVDD 上电,间隔至少 0.1ms~1ms。若使用同一 PMIC 供电,需确认 LDO 使能顺序或增加 RC 延时。
3.2 MCLK:主时钟输入
MCLK 是 Sensor 内部 PLL 的参考时钟,通常由主控 SoC 或外部晶振提供。MCLK 的频率精度与占空比直接影响帧率与像素时钟的稳定性。
- 典型频率: 6MHz / 12MHz / 24MHz / 27MHz(依 Sensor 型号而定)
- 频率容差: ±1% 以内,部分高速 Sensor 要求 ±0.5%
- 占空比: 45%~55%
- 建立时间: MCLK 必须在电源稳定后、RST 释放前稳定输出
时序约束: 从 DVDD 稳定到 MCLK 开始振荡,通常需要 1ms~5ms 的等待时间。若 MCLK 来自 SoC GPIO 模拟,需确认 GPIO 驱动能力与输出阻抗匹配。
3.3 PWDN 与 RST:控制信号时序
PWDN(Power Down)与 RST(Reset)是 Sensor 的硬件控制引脚,用于控制 Sensor 的工作模式与复位状态。错误的电平组合会导致 Sensor 无法进入正常模式。
| 信号 | 有效电平 | 典型连接 | 时序要求 |
|---|---|---|---|
| PWDN | 高有效(部分 Sensor 低有效) | GPIO 或 PMIC 控制 | 上电期间保持有效;电源稳定后释放 |
| RST | 低有效(通常内部上拉) | GPIO 或专用复位 IC | RST 低电平宽度 ≥ 1ms;释放后等待 Tready |
常见错误: PWDN 与 RST 同时拉高导致 Sensor 进入测试模式;或 RST 释放过早,MCLK 尚未稳定,造成 PLL 失锁。务必按照数据手册的时序图严格操作。
3.4 I2C 通信时序要求
I2C 是 Sensor 与主控之间最常用的控制总线。上电后,I2C 通信必须在所有电源稳定、MCLK 振荡、RST 释放之后才能发起。过早的 I2C 访问会导致 NACK 或寄存器写入失败。
- I2C 地址: 7bit 或 10bit,常见 Sensor 地址 0x20~0x6C
- 速率: 标准模式 100kHz,快速模式 400kHz,高速模式 1MHz
- 上电等待时间: 从 RST 释放到首次 I2C 通信,通常需要 5ms~20ms
- 时序参数: SCL 高/低电平宽度、上升/下降时间、数据建立/保持时间
驱动实现要点: 在 Linux 内核中,I2C 通信通过 i2c_transfer() 完成。上电时序控制通常在 Sensor 驱动 probe() 函数中,使用 msleep() 或 usleep_range() 实现延时等待。
/* 典型上电时序代码片段 */
static int sensor_power_on(struct sensor_dev *sdev)
{
/* 1. 使能 AVDD */
regulator_enable(sdev->avdd);
usleep_range(1000, 2000); /* 等待 1ms */
/* 2. 使能 DVDD */
regulator_enable(sdev->dvdd);
usleep_range(1000, 2000); /* 等待 1ms */
/* 3. 使能 IOVDD */
regulator_enable(sdev->iovdd);
usleep_range(1000, 2000); /* 等待 1ms */
/* 4. 使能 MCLK */
clk_prepare_enable(sdev->mclk);
usleep_range(2000, 5000); /* 等待 MCLK 稳定 */
/* 5. 释放 PWDN */
gpiod_set_value(sdev->pwdn, 0);
usleep_range(1000, 2000); /* 等待 PWDN 生效 */
/* 6. 释放 RST */
gpiod_set_value(sdev->rst, 1);
msleep(20); /* 等待 Sensor 初始化完成 */
return 0;
}
3.5 完整上电时序波形图
将上述所有信号整合到一张时序图中,可以清晰看到各信号之间的先后关系与等待窗口。这是驱动开发中最重要的参考图。
3.6 常见时序问题与排查方法
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| I2C 通信 NACK | IOVDD 未稳定;RST 未释放;Sensor 地址错误 | 用示波器测量 IOVDD 与 RST 波形;核对数据手册地址 |
| Sensor 输出全黑或花屏 | AVDD 纹波过大;MCLK 频率偏差超限 | 检查电源纹波;用频率计测量 MCLK |
| Sensor 无法退出 standby | PWDN 电平错误;上电顺序不满足 | 确认 PWDN 有效电平;调整电源使能顺序 |
| 帧率不稳定 | DVDD 电压偏低;MCLK 占空比异常 | 测量 DVDD 电压;检查 MCLK 占空比 |
调试建议: 在驱动 probe() 函数中增加 dev_dbg() 打印每个步骤的时间戳,配合示波器多通道同时抓取 AVDD、DVDD、IOVDD、MCLK、PWDN、RST、SCL、SDA 共 8 个信号,可以快速定位时序问题。