一、课程导论与硬件基础:智能相机系统架构概览

各位同学,欢迎来到《智能相机图像传感器驱动开发实战》的第一课。

做图像传感器驱动这么多年,我最大的感触是:不懂硬件,驱动写出来就是空中楼阁。你想想看,连传感器怎么输出数据的都不知道,出了问题怎么定位?所以这一章,咱们先把底层的硬件基础打牢。

1.1 智能相机系统架构概览

先看一张典型的智能相机系统框图(我这里用文字描述,大家脑补一下):

镜头 → 图像传感器(CMOS/CCD) → 模拟前端(AFE) → ISP(图像信号处理器) → 编码器 → 存储/传输
                                    ↑
                              驱动控制(I2C/SPI)

说白了,整个系统就干三件事:感光、处理、输出

我个人习惯把系统分成三层:

  • 光学层:镜头、滤光片、机械结构。这部分我一般不碰,但得懂。
  • 传感层:图像传感器本身,这是咱们驱动的核心对象。
  • 处理层:ISP、CPU、内存、接口。驱动要负责把数据从传感层搬到处理层。

重点:驱动开发者的战场主要在传感层和处理层之间的接口上。你写的每一行代码,最终都要落到硬件时序上。

1.2 图像传感器工作原理(CMOS vs CCD)

图像传感器说白了就是一个光电转换器。光子打到像素上,产生电子,然后读出电压值。

目前主流是CMOS,CCD基本快退出消费市场了。但工业相机里CCD还有一席之地。

特性 CMOS CCD
读出方式 每个像素独立读出 整行/整列转移读出
功耗 低(几mW到几百mW) 高(几W级别)
噪声 较高(有固定模式噪声) 低(全局快门优势)
速度 快(支持高帧率) 慢(逐行转移)
成本

我在项目中遇到过一件事:一个客户非要用CCD做安防相机,结果功耗压不下去,散热成了大问题。最后换了CMOS全局快门方案,问题迎刃而解。所以选型时别只看画质,系统约束更重要

1.2.1 像素结构与读出时序

每个CMOS像素内部其实就是一个光电二极管 + 晶体管开关。曝光结束后,通过行选信号逐行读出。

驱动里最关键的几个时序参数:

  • 曝光时间:决定了进光量,单位是行周期或微秒。
  • 帧周期:一帧图像的总时间,帧率 = 1 / 帧周期。
  • 读出时间:从第一个像素到最后一个像素读出的时间。

小技巧:调试时我习惯先看帧同步信号(VSYNC)和行同步信号(HSYNC)的波形。只要这两个波形对了,数据大概率没问题。

1.3 关键电气接口介绍

传感器和处理器之间怎么传数据?靠的就是这些接口。目前主流就三种:MIPI CSI-2、DVP、LVDS

1.3.1 MIPI CSI-2(当前绝对主流)

MIPI CSI-2 是移动设备的标准接口。它用差分信号传输,速度可以做到每通道几Gbps。

驱动开发时你需要关注:

  • 通道数:1/2/4 lane,lane越多带宽越大。
  • 数据速率:每lane的比特率,要和SoC的MIPI控制器匹配。
  • PHY配置:HS模式(高速)和LP模式(低功耗)的切换。

我曾经被一个MIPI信号质量问题折腾了两周。现象是图像偶尔出现条纹,查到最后发现是PCB走线阻抗不匹配,导致信号反射。嗯,这里要注意:MIPI对PCB layout要求极高,差分对之间长度差不能超过5mil。

1.3.2 DVP(并行接口,老当益壮)

DVP就是并行接口,数据线8/10/12/16位,加上HSYNC、VSYNC、PCLK。优点是简单,缺点是速度上不去(一般不超过100MHz)。

驱动DVP传感器时,我最头疼的是时序对齐。数据要在PCLK的上升沿或下降沿被采样,如果skew太大,数据就错了。

// DVP驱动中典型的帧同步处理
void dvp_vsync_isr(void) {
    if (vsync_polarity == RISING_EDGE) {
        frame_start = 1;  // 帧开始
        pixel_count = 0;
    } else {
        frame_end = 1;    // 帧结束
        // 触发DMA传输
    }
}

避坑指南:我曾经遇到过DVP接口的传感器,VSYNC极性搞反了,结果图像上下颠倒。查了三天才发现是寄存器配错了。所以拿到新传感器,第一件事就是看数据手册里的时序图,确认极性。

1.3.3 LVDS(工业/高端应用)

LVDS也是差分信号,但和MIPI不同,它更注重长距离传输抗干扰。工业相机里很常见。

LVDS驱动开发要注意:

  • 串行化/解串行化(SerDes)的时钟恢复
  • 通道绑定(多个LVDS通道合并成一路数据)
  • DC平衡编码(比如8B/10B编码)

1.4 传感器模组选型要点

选传感器模组,我一般按这个顺序评估:

  1. 分辨率与帧率:够用就行,别盲目追求高像素。1080p@30fps在很多场景下比4K@15fps实用。
  2. 接口兼容性:你的SoC支持什么接口?MIPI lane数够不够?
  3. 光学尺寸:1/3英寸、1/2.3英寸等,要和镜头匹配。
  4. 功耗与散热:尤其是手持设备,功耗高了续航崩。
  5. 驱动复杂度:有些传感器寄存器多达上千个,调试起来很痛苦。

我的经验:选型时一定要拿到数据手册(Datasheet)参考驱动代码。没有参考代码的传感器,我一般直接pass。因为这意味着你要从零开始配寄存器,太费时间了。

好了,这一章的内容就是这些。下一章咱们会深入MIPI CSI-2的物理层和协议层,手把手教你配置MIPI PHY。到时候我会分享一个我调试MIPI信号时用的“三板斧”方法,保证实用。

记住:驱动开发,硬件先行。把这一章吃透了,后面写代码会顺畅很多。