2、Sensor 接口与数据采集:驱动配置、MIPI/LVDS 调试与 RAW 图解析

各位好,欢迎来到第二章。上一章我们聊了 ISP 的整体架构,今天咱们把镜头往前推,看看 ISP 的第一道关卡——Sensor 接口与数据采集。

说白了,Sensor 就是 ISP 的眼睛。它把光信号转成电信号,再通过物理接口把数据喂给 ISP。这个环节要是出了问题,后面算法调得再好也是白搭。我见过不少团队,花几个月调 3A 算法,结果发现是 Sensor 配置错了,RAW 图数据格式压根不对——嗯,这种坑咱们得提前避开。

2.1 Sensor 驱动配置:让 Sensor 先“活”起来

拿到一块新的 Sensor 模组,第一件事不是看图像,而是让它能正常输出数据。驱动配置通常包括这几步:

  1. 上电时序:AVDD、DVDD、IOVDD 谁先谁后,delay 多少毫秒,差一点都不行。
  2. 时钟配置:MCLK 主时钟频率,PLL 倍频参数,输出像素时钟。
  3. 寄存器初始化:通过 I2C/SPI 写入 Sensor 内部寄存器,设置工作模式。
  4. 输出格式选择:RAW10、RAW12、RAW16?Bayer 排列是 RGGB 还是 BGGR?
  5. 帧率与分辨率:VTS/HTS 寄存器控制帧长和行长,决定最终帧率。
我的习惯: 每次写 Sensor 驱动,我都会先打印出上电后的 Sensor ID 寄存器。如果 ID 读不对,后面全是白费功夫。曾经有个项目,Sensor 死活读不到 ID,查了两天才发现是 IOVDD 电压设成了 1.8V,而 Sensor 要求 2.8V——这种低级错误,犯一次就记住了。

2.2 MIPI/LVDS 接口调试:物理层的“握手”

驱动配好了,Sensor 开始输出数据。但数据能不能被 ISP 正确接收,取决于物理接口的调试。目前主流接口就两种:MIPI CSI-2 和 LVDS。

对比项 MIPI CSI-2 LVDS
信号类型 差分对,D-PHY/C-PHY 差分对,低压差分信号
最大速率 D-PHY 4.5Gbps/lane 通常 1Gbps/lane 以内
协议层 内嵌同步码、ECC、CRC 通常需要外部同步信号
调试难度 中等,需关注 skew 和 LP/HS 切换 较低,但抗干扰能力弱
常见场景 手机、平板、车载摄像头 工业相机、安防、大分辨率 Sensor

调试 MIPI 接口时,我最常遇到的问题是 lane 错位 和 时钟相位不对。你想想看,Sensor 送出来的数据是 4 lane,但 ISP 接收端 lane 顺序没对上,图像就会像万花筒一样乱掉。

避坑指南: 我曾经调试一个 8M 的 Sensor,MIPI 信号用示波器看波形完美,但 ISP 就是收不到数据。折腾了一下午,最后发现是 D-PHY 的 LP-11 状态没保持足够时间——Sensor 刚上电就切到 HS 模式,ISP 还没准备好。解决方案很简单:在 Sensor 初始化后加 10ms 延时,再开始接收数据。

2.3 RAW 图数据格式解析:读懂 Sensor 的“语言”

接口通了,数据进来了。但进来的是一串二进制数,怎么把它变成我们能理解的图像?这就涉及到 RAW 图格式解析。

RAW 图本质上就是 Sensor 每个像素的原始电压值,没有经过任何处理。常见的格式有:

  • RAW8:每个像素 8bit,范围 0-255,常用于低端 Sensor。
  • RAW10:每个像素 10bit,但存储时通常用 16bit 对齐,或者 5 个字节存 4 个像素。
  • RAW12:每个像素 12bit,常见于高动态范围 Sensor。
  • RAW16:每个像素 16bit,用于高精度工业相机。

这里有个关键点:Bayer 排列。Sensor 的每个像素只能感知一种颜色(R、G 或 B),它们按照固定的模式排列。最常见的模式是 RGGB,也就是第一行 R、G、R、G...,第二行 G、B、G、B...

核心概念: 解析 RAW 图时,必须知道三个参数:
1. Bayer 排列模式(RGGB/GRBG/BGGR/GBRG)
2. 每个像素的位深(8/10/12/16)
3. 数据存储顺序(高位在前还是低位在前)

举个例子,假设你拿到一个 RAW10 格式的数据,Sensor 输出的是 RGGB 排列。数据以 16bit 对齐存储,每个像素占 2 个字节,但只有低 10 位有效。如果你直接按 16bit 读取,图像会偏暗——因为高 6 位全是 0。正确的做法是右移 6 位,或者直接取低 10 位。

// RAW10 数据解析示例(16bit 对齐)
uint16_t raw_data = read_sensor_data();  // 读取 16bit
uint16_t pixel_value = raw_data & 0x03FF; // 取低 10 位
// 或者右移 6 位,得到 0-1023 范围
uint16_t pixel_value_shifted = raw_data >> 6;

2.4 知识体系总览

下面这张图总结了本章的核心流程。从 Sensor 驱动配置开始,到物理接口调试,再到 RAW 数据解析,每一步都是环环相扣的。

Sensor 接口与数据采集流程 Sensor 接口与数据采集流程 Sensor 驱动配置 上电时序 · 时钟 · 寄存器 MIPI / LVDS 接口 物理层 · 协议层 · 调试 RAW 数据接收 DMA · 缓存 · 帧同步 RAW 格式解析 Bayer · 位深 · 存储顺序 ISP 输入 BLC · 去噪 · 去马赛克 💡 关键提醒: 每一步都需要验证:驱动配好 → 读 Sensor ID;接口调通 → 看帧同步信号;RAW 解析 → 用工具显示图像。

2.5 实战中的常见问题与排查思路

在实际项目中,Sensor 接口调试往往是最耗时的环节。我整理了几个高频问题,供大家参考:

现象 可能原因 排查方法
无图像输出 上电时序不对、时钟未稳定、I2C 通信失败 示波器量电源和时钟,打印 Sensor ID
图像花屏 MIPI lane 顺序错、时钟相位偏移、数据位宽不匹配 检查 lane mapping,调整 D-PHY 的 skew 参数
图像偏色 Bayer 排列解析错误、RAW 位深取错 确认 Sensor 手册中的 Bayer 模式,检查移位操作
帧率不稳定 VTS/HTS 配置错误、DMA 带宽不足 计算理论帧率,对比实际帧率,检查 DMA 中断
我的经验: 调试 MIPI 接口时,我习惯先用示波器看 D-PHY 的 LP-11 和 LP-01 状态切换。如果 LP 状态正常,再切到 HS 模式看数据眼图。眼图张开度不够,多半是 PCB 走线阻抗不匹配,或者端接电阻没焊对。

2.6 本章小结

Sensor 接口与数据采集,是 ISP 流水线的第一道关卡。驱动配置让 Sensor 活起来,MIPI/LVDS 调试让数据传过来,RAW 格式解析让数据读得懂。这三步走稳了,后面的 ISP 算法才能有米下锅。