2. 硬件接口基础:MIPI CSI-2协议详解,D-PHY物理层时序
好,咱们正式开始啃硬件接口这块硬骨头。MIPI CSI-2,这名字听起来挺唬人,对吧?其实说白了,它就是摄像头和处理器之间的一条专用高速公路。我当年第一次调CSI-2接口时,对着示波器看了整整三天,才把那些波形和协议对上号。今天我就把那些坑和经验,一股脑倒给你们。
2.1 MIPI CSI-2协议栈概览
MIPI CSI-2协议分了好几层,就像你寄快递,有包裹、有箱子、有卡车。咱们从上往下捋:
- 应用层:图像数据怎么打包,像素怎么排列。比如你传的是RAW10还是YUV422,这层说了算。
- 协议层:数据怎么分包、怎么组包。每一帧图像被切成一个个小包,加上包头包尾。
- 链路层:负责纠错、ECC校验。嗯,这里容易出问题,我后面会讲。
- 物理层:就是D-PHY,管电压、时钟、信号摆幅这些硬家伙。
我个人习惯,调试时先从物理层下手。物理层不通,上面再花哨也没用。
2.2 D-PHY物理层核心概念
D-PHY用的是差分信号,一对线传数据,一对线传时钟。为什么用差分?抗干扰能力强啊。你想想看,两根线绞在一起,外界噪声同时耦合到两根线上,一减就没了。
D-PHY有两种工作模式:
- 高速模式(HS):数据传输时用,电压摆幅只有200mV左右,速度快。
- 低功耗模式(LP):控制信号用,电压摆幅1.2V,速度慢但省电。
我在项目中遇到过一个问题:摄像头初始化时老是超时。查了半天,发现是LP模式下信号上升沿太慢,控制器没识别到。后来在D-PHY的驱动里调了 slew rate 参数才搞定。
2.3 D-PHY时序详解
时序这东西,说白了就是信号什么时候变、变多快。咱们重点看几个关键时序参数:
| 参数 | 含义 | 典型值 | 我的经验 |
|---|---|---|---|
| T_HS-PREPARE | 进入高速模式前的准备时间 | 40ns + 4*UI | 这个值设小了,接收端可能没准备好 |
| T_HS-ZERO | 高速模式建立时间 | 145ns + 10*UI | 我曾经设成100ns,结果丢包严重 |
| T_HS-TRAIL | 高速模式结束后的拖尾时间 | 60ns + 4*UI | 设太大会浪费带宽,太小会信号畸变 |
| T_CLK-POST | 最后一个数据包后时钟保持时间 | 60ns + 52*UI | 这个容易被忽略,但很重要 |
关键点:UI(Unit Interval)是一个数据位的时间。比如1Gbps速率下,1UI = 1ns。所以这些时序参数是跟速率挂钩的,不是固定值。
2.4 数据包格式
CSI-2的数据包,结构很清晰。每个包长这样:
+----------------+----------------+----------------+----------------+
| 包头 (4字节) | 数据 (可变) | 包尾 (2字节) | 可选填充 |
+----------------+----------------+----------------+----------------+
| 数据ID | 字计数 | 像素数据 | 校验和 | 对齐用 |
+----------------+----------------+----------------+----------------+
数据ID里包含了虚拟通道号(VC)和数据类型(DT)。虚拟通道最多4个,可以同时传多路数据。我做过一个双摄方案,就用VC0和VC1分别传主摄和副摄的数据,省了一组MIPI线。
避坑指南:我曾经在调试时发现图像花屏,查了两天才发现是字计数写错了。字计数是2字节,单位是字节。如果你传的是RAW10,每个像素占10位,但字计数是按字节算的,千万别搞混。
2.5 长包与短包
CSI-2有两种包:
- 长包:有数据负载,传图像数据用。包尾带CRC校验。
- 短包:只有包头,没有数据。用来传帧同步、行同步这些控制信息。
帧同步的流程是这样的:
- 发送帧开始短包(FS)
- 发送一行一行的长包(每行一个包)
- 发送帧结束短包(FE)
嗯,这里要注意:帧开始和帧结束必须成对出现。我见过一个案例,因为驱动bug导致FE没发出来,接收端一直等数据,最后超时复位了。
2.6 时钟与数据的关系
D-PHY的时钟是DDR模式的,也就是时钟的每个边沿都采样数据。举个例子:
- 时钟频率200MHz,DDR模式下数据速率就是400Mbps/lane
- 4 lane的话,总带宽就是1.6Gbps
我建议你们在选型时,留20%的余量。比如你算出来需要1Gbps,那就选1.2Gbps以上的方案。为什么?因为线缆损耗、PCB走线、温度变化都会影响信号质量。
警告:时钟和数据线必须等长。我见过一个板子,时钟线比数据线长了5mm,结果高速模式下数据采样出错。PCB设计时,同一组MIPI线的长度差不要超过0.5mm。
2.7 实际调试经验分享
最后,我分享几个调试MIPI接口的实用技巧:
- 先看时钟:用示波器量时钟线,看频率对不对、波形干不干净。时钟不对,后面全白搭。
- 再看LP状态:上电后先看LP模式下信号能不能正常跳变。很多问题出在初始化阶段。
- 最后看HS数据:用逻辑分析仪抓包,看包头对不对、CRC对不对。
我曾经遇到一个特别诡异的问题:摄像头偶尔出图,偶尔不出。查了三天,最后发现是电源纹波太大,导致D-PHY的PLL锁不住。换了颗LDO就好了。所以啊,硬件问题往往不是协议的问题,而是电源的问题。
好了,这一章的内容就到这儿。MIPI CSI-2和D-PHY,说白了就是一套规矩,告诉你怎么发、怎么收、什么时候发、什么时候收。把这些规矩搞懂了,后面写驱动、调HAL就顺风顺水了。