3. Bayer RAW数据采集与MIPI接口:MIPI CSI-2协议基础、Sub-Lane架构、Lane速率计算,以及FPGA端MIPI D-PHY IP核的配置与调试
好,咱们进入第三章。这一章讲的是ISP流水线的“入口”——Bayer RAW数据怎么从传感器进到FPGA里。说白了,就是MIPI CSI-2接口那点事。
我刚开始做ISP项目时,觉得MIPI协议就是个传输通道,没啥好研究的。结果第一次调板子,图像全是花屏,查了三天才发现是Lane速率算错了。嗯,从那以后我再也不敢小看这个接口了。
3.1 MIPI CSI-2协议基础
MIPI CSI-2,全称是Camera Serial Interface 2。它是MIPI联盟定义的一套摄像头串行接口标准。咱们做FPGA ISP,打交道最多的就是它。
CSI-2协议分三层:
- 应用层:处理图像数据格式,比如RAW8、RAW10、RAW12、YUV等。
- 协议层:负责数据包封装、解包,包括长包(Long Packet)和短包(Short Packet)。
- 物理层:就是D-PHY,负责电气信号和时钟同步。
你想想看,传感器拍到的RAW数据,先经过应用层打包成像素格式,再通过协议层加上包头包尾,最后通过D-PHY串行化发出去。FPGA这边就是反过来:D-PHY接收串行数据,协议层解包,应用层还原出RAW像素。
核心概念:长包 vs 短包
- 短包:只有32位数据,用于帧同步、行同步等控制信息。比如帧起始(FS)、帧结束(FE)、行起始(LS)、行结束(LE)。
- 长包:包含包头(32位)、数据负载(可变长度)、包尾(16位CRC校验)。图像数据都在长包里。
我在项目中遇到过一个问题:传感器输出的帧同步信号和MIPI包里的FS/FE对不上,导致FPGA端帧缓存错乱。后来我直接在协议层解析短包,用硬件状态机跟踪帧边界,问题就解决了。
3.2 Sub-Lane架构
Sub-Lane,说白了就是MIPI D-PHY内部的一种并行转串行机制。一个Lane内部其实有多个Sub-Lane在同时工作。
D-PHY的每个Lane包含一对差分信号(Dp/Dn)。但为了提升速率,协议允许在一个Lane内部分成多个Sub-Lane。比如:
- 1 Sub-Lane:传统模式,一个Lane一次传1位。
- 2 Sub-Lane:一个Lane一次传2位,速率翻倍。
- 4 Sub-Lane:一个Lane一次传4位,速率再翻倍。
你可能会问:那为什么不直接用更多Lane?原因很简单——PCB布线。Lane多了,等长约束、串扰问题都来了。Sub-Lane是在不增加物理Lane数的前提下提升带宽,说白了就是“压榨”单对差分线的潜力。
我的经验: 选Sub-Lane模式时,一定要看传感器和FPGA两端都支持。有些老传感器只支持1 Sub-Lane,你硬配成2 Sub-Lane,它根本不认。我吃过这个亏,调了三天才发现是传感器不支持。
3.3 Lane速率计算
这个环节最容易出错。Lane速率算不对,图像要么花屏,要么根本出不来。
计算公式其实不复杂:
Lane速率(Mbps)= (像素时钟频率 × 每像素位数 × 总像素数) / (有效Lane数 × 每时钟传输像素数)
举个例子:
- 传感器输出:1920×1080 @ 60fps,RAW10格式
- 像素时钟:148.5 MHz
- 每像素位数:10 bit
- 总像素数:1920 × 1080 × 60 ≈ 124.4 Mpixels/s
- 使用4 Lane,每时钟传2像素
算一下:
Lane速率 = (148.5 × 10 × 124.4e6) / (4 × 2) ≈ 231.5 Mbps
嗯,这里要注意:实际MIPI速率还要加上协议开销(包头、包尾、CRC等),一般要预留10%~15%的余量。所以我通常会取整到250 Mbps,然后看D-PHY IP核能不能支持。
| 分辨率 | 帧率 | 格式 | Lane数 | Sub-Lane | 理论速率 | 推荐配置 |
|---|---|---|---|---|---|---|
| 1920×1080 | 60 | RAW10 | 4 | 1 | 231.5 Mbps | 250 Mbps |
| 3840×2160 | 30 | RAW12 | 4 | 2 | 746.5 Mbps | 800 Mbps |
| 640×480 | 120 | RAW8 | 2 | 1 | 147.5 Mbps | 160 Mbps |
避坑指南: 我曾经把Lane速率算得太紧,结果FPGA端D-PHY IP核跑在临界频率上,温度一高就丢包。后来我强制把速率往上取整到下一个标准值(比如250→300 Mbps),问题就消失了。记住:MIPI速率宁高勿低,但别超过传感器和FPGA的极限。
3.4 FPGA端MIPI D-PHY IP核的配置与调试
FPGA端接收MIPI信号,通常用厂商提供的D-PHY IP核。以Xilinx为例,就是MIPI D-PHY IP核(现在叫MIPI CSI-2 RX Subsystem)。
配置步骤大致如下:
- 选择Lane数:根据传感器输出,选1、2、4 Lane。
- 设置Lane速率:按上面算好的值填进去。
- 配置Sub-Lane模式:确认传感器和IP核都支持。
- 选择数据格式:RAW8/10/12/14等。
- 使能CRC校验:建议打开,能帮你定位传输错误。
- 配置时钟模式:Continuous Clock还是Non-Continuous Clock?
这里有个关键点:时钟模式。Continuous Clock模式下,时钟一直跑;Non-Continuous Clock模式下,只有传数据时才有时钟。省电,但调试起来麻烦。我建议刚开始先用Continuous Clock,等调通了再切。
调试技巧: 我第一次调MIPI时,IP核配置完,啥信号都没有。后来发现是复位时序不对——D-PHY IP核需要先复位PHY层,再复位协议层,最后复位应用层。顺序反了,IP核就罢工。你可以用ILA抓一下PHY层的Lock信号,如果Lock一直不拉高,八成是复位或时钟问题。
调试MIPI接口,我总结了一个“三板斧”:
- 第一斧:看Lock信号。PHY层Lock了,说明物理连接没问题。
- 第二斧:看短包。抓到FS/FE了,说明协议层在正常工作。
- 第三斧:看长包CRC。CRC没错,说明数据传输是干净的。
这三步走完,MIPI接口基本就通了。剩下的就是调图像格式对齐——比如传感器输出RAW10,但IP核配成了RAW8,那图像颜色肯定不对。
这张图把MIPI接收链路和调试方法串起来了。你调试时,就按这个顺序查:先看物理层Lock,再看协议层短包,最后看数据CRC。三步走完,99%的问题都能定位。