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校验。
  • 短包:只有包头,没有数据。用来传帧同步、行同步这些控制信息。

帧同步的流程是这样的:

  1. 发送帧开始短包(FS)
  2. 发送一行一行的长包(每行一个包)
  3. 发送帧结束短包(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就顺风顺水了。