4. 图像传感器与PolarFire接口实战
本章把图像传感器到PolarFire的整条采集链路拆开来看:从CMOS传感器的像素阵列与读出时序,到I2C寄存器配置,再到LVDS/MIPI物理层接收、去马赛克前处理,最后拼成一个可运行的实时采集系统。目标不是背接口名词,而是能对着示波器、逻辑分析仪和Libero/HSIO配置界面,判断“数据到底有没有进来、进得对不对”。
一、CMOS传感器时序:先看懂“谁在什么时候有效”
以常见的卷帘快门CMOS为例,传感器内部把像素阵列按行读出,外部看到的关键信号通常包括:像素时钟PCLK(或MIPI的字节时钟)、行有效HSYNC、场有效VSYNC,以及并行数据D[9:0]或串行差分对。PolarFire侧要做的第一件事,是把这些信号对齐到同一个采样域。
时序上要抓住三个量:行周期(HSYNC周期,等于有效像素数+行消隐)、场周期(VSYNC周期,等于有效行数+场消隐)、数据有效窗口(HSYNC拉高且VSYNC拉高期间,PCLK边沿对应的数据才有效)。例如一个示例配置:分辨率1280×720、PCLK=74.25 MHz、每行总周期1650个PCLK、每场总行数750,则行频约45 kHz、帧率约60 fps。这些数值属于教学示例,实际以传感器数据手册为准。
PolarFire的I/O和HSIO接收端需要关注建立/保持窗口。若PCLK与数据存在偏斜,可在Libero中调整输入延迟或使用IDELAY,使采样点落在数据眼图中心。判断依据很直接:用逻辑分析仪抓HSYNC、VSYNC和PCLK,确认VSYNC高电平期间HSYNC数量等于有效行数,且每行PCLK有效边沿数量等于有效像素数。
二、I2C配置:把传感器从“默认状态”调到“可用状态”
传感器上电后通常处于默认输出模式,分辨率、曝光、增益、输出接口(并行/LVDS/MIPI)都由寄存器决定。PolarFire通过I2C主机(MSS或软核)写寄存器完成初始化。典型流程是:上电复位→延时等待内部PLL锁定→写时钟/分频寄存器→写输出接口选择→写分辨率与窗口→写曝光/增益→最后写“流开启”位。
以某示例传感器为例,I2C从地址0x36(7位),寄存器16位地址、8位数据。关键寄存器可抽象为:0x3000[0]=流开启,0x3001=输出接口选择(0x01并行、0x02 LVDS、0x03 MIPI),0x3002-0x3003=行宽,0x3004-0x3005=行高,0x3500=曝光高字节。写序列可用如下伪代码表示:
i2c_write(0x36, 0x3000, 0x00); // 先关流
i2c_write(0x36, 0x3001, 0x02); // 选择LVDS输出
i2c_write(0x36, 0x3002, 0x05); // 行宽高字节
i2c_write(0x36, 0x3003, 0x00); // 行宽低字节 → 1280
i2c_write(0x36, 0x3004, 0x02); // 行高高字节
i2c_write(0x36, 0x3005, 0xD0); // 行高低字节 → 720
i2c_write(0x36, 0x3500, 0x04); // 曝光示例值
i2c_write(0x36, 0x3000, 0x01); // 开流
配置完成后不要只看“写成功”,要用逻辑分析仪抓I2C波形,确认ACK位正常;再用示波器看PCLK/LVDS是否出现。若PCLK无输出,优先检查“流开启”位和PLL锁定状态寄存器。
三、LVDS与MIPI接收:物理层到像素层的转换
LVDS接口把并行像素数据串化成若干对差分线,通常包含1对时钟+若干对数据。PolarFire的HSIO支持LVDS输入,需要在Libero中配置为差分接收,并设置正确的数据速率和位序。接收端一般用IDDR把双沿数据拆成单沿,再按帧同步字对齐通道。
MIPI CSI-2则更复杂:物理层D-PHY、协议层包含短包(帧起始FS、帧结束FE、行起始LS、行结束LE)和长包(像素数据)。PolarFire可通过硬核或软核CSI-2接收IP完成解包。实战中先确认Lane数量(1/2/4 lane)、数据速率(如800 Mbps/lane)、虚拟通道号,再检查FS/FE是否成对出现。若只收到FS没有FE,通常是行长度寄存器与实际输出不匹配。
四、去马赛克前处理:Bayer到RGB的第一步
大多数CMOS输出Bayer格式,每个像素只有R/G/B之一。去马赛克前处理通常先做黑电平校正、坏点校正、白平衡增益,再做插值。PolarFire内可用DSP块搭建3×3窗口,对每个像素取邻域。以RGGB阵列为示例,中心像素为R时,G取上下左右平均,B取对角平均;中心为G时,R和B分别取水平或垂直相邻的R/B平均。这一步在流水线中要保证行缓存深度至少2行,才能同时访问3行数据。
五、实时采集系统搭建:把链路串起来
一个可运行的实时采集系统可以按下面的顺序搭建:传感器上电→I2C初始化→HSIO接收→帧同步与行列计数→行缓存→去马赛克→AXI4-Stream打包→DDR帧缓存→显示或以太网输出。判断系统是否跑通,看三个指标:帧率是否稳定、图像是否有撕裂或错位、颜色是否正常。若帧率只有预期一半,检查是否每帧多算了场消隐;若图像错位,检查行缓存深度和HSYNC对齐;若颜色偏绿,检查Bayer相位是否配错。
| 观察现象 | 可能原因 | 排查动作 |
|---|---|---|
| 无PCLK | 流未开启或PLL未锁 | 读状态寄存器,抓I2C |
| 行数不对 | VSYNC期间HSYNC计数错误 | 逻辑分析仪统计HSYNC |
| 图像撕裂 | 帧缓存读写冲突 | 检查DDR带宽与乒乓切换 |
| 颜色异常 | Bayer相位或白平衡错误 | 核对RGGB/BGGR顺序 |
把上述环节都验证过,才算真正完成从传感器到PolarFire的实时采集链路。后续的图像处理算法,都建立在这条稳定通路之上。