尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MIPI CSI-2调试实战:从物理层到协议层的花屏定位指南

MIPI CSI-2调试实战:从物理层到协议层的花屏定位指南 去年帮客户调试一款车载摄像头模组画面总是隔几行就出现一溜花屏帧率稍微拉高就开始丢数据。我拿着示波器探头在MIPI差分线上来回测连续熬了三个晚上最后发现问题居然出在CSI-2短包的ECC校验被FPGA侧误判上。那次之后我意识到MIPI CSI-2这个协议虽然已经问世十几年但真正能把它从物理层到协议层讲透的资料并不多。市面上的文章要么只讲引脚定义要么一上来就贴一堆寄存器很少有文章把“信号长什么样、数据怎么组包、为什么会出现花屏丢数据”串成一条完整的链路讲清楚。这篇东西就是冲着弥补这个缺口来的。无论你是刚接手MIPI CSI-2调试的嵌入式工程师、准备在FPGA上实现CSI-2 RX的硬件开发者还是做摄像头传感器驱动的软件同学只要你需要面对CSI-2接口这篇文章都可以帮你建立一套完整的分析框架。我尽量用做过项目、踩过坑的口吻来写不堆术语但也把该讲的协议细节都讲到位。1. 为什么CSI-2这个老协议依然值得深耕从一个花屏事故说起先说开头的那个花屏事故因为它非常典型。摄像头模组输出的MIPI信号接到FPGAFPGA再处理后送显示。现象是画面不是完全没有图像而是随机出现几条横向的错位彩带严重的时候整个下半屏都是花的。当时我们最先怀疑的是物理链路以为MIPI时钟和数据线的信号质量不行或者等长没做好。结果示波器测下来差分的摆幅、压摆率、时序全都正常眼图也干净。然后怀疑传感器配置把RAW10的DT数据类型改来改去甚至把lane数从4lane降到2lane问题依旧。最后是抓包分析用逻辑分析仪看CSI-2总线上的包结构才发现FPGA侧的接收状态机把短包Short Packet错误地当成了长包Long Packet的头来处理。因为短包和长包在链路上都有32bit的包头区别在于短包没有数据体和包尾协议解析时如果状态机漏掉了对短包的识别下一个合法长包的包头就会被吞掉导致整包CRC校验失败、数据丢失表现出来就是花屏。这个案例告诉我MIPI CSI-2不是“接上就能用”的高速串行口。它是一个有清晰层级结构的协议物理层、协议层、数据格式层各自独立又相互影响。你只有理解了每一层在干什么、出了问题时该从哪一层开始排查才能真正驾驭它。这也是这篇文章想传递的核心价值——不是念一遍Spec而是告诉你CSI-2到底是怎么把图像数据从Sensor搬进SoC的以及出了问题怎么定位。MIPI CSI-2的全称是Camera Serial Interface 2由MIPI联盟维护目前最新的大版本已经到CSI-2 v3.0但大家在项目里实际用得最多的还是基于D-PHY的CSI-2 v1.x/v2.x。它和Display端的DSIDisplay Serial Interface是对应的一个进图像一个出图像。CSI-2之所以成为主流是因为它最大程度地统一了摄像头模组和主控SoC之间的接口标准让模组厂商和SoC厂商可以独立演进。对从业者来说理解CSI-2就是理解所有基于MIPI接口的摄像头系统的共同语言。如果你是刚接触这个领域我可以先给你一个宏观的图景CSI-2协议栈大致分为物理层PHY、协议层Protocol Layer和应用层Application Layer。应用层处理的是图像格式本身RAW、YUV、RGB这些协议层负责把图像数据分割成规定的包Packet在链路上传输物理层则负责把包里的比特真正变成差分信号发出去。后面所有章节都会围绕这条链路展开。2. 数据通路拆解CSI-2收发链路到底是怎么把图像搬上总线的2.1 从Sensor到SoCD-PHY的物理链路构成一条标准的MIPI CSI-2物理链路由一条或多条数据lane加一条时钟lane构成。这里说的lane在D-PHY标准里是一对差分线常用命名是Dp/Dn数据正负和Clkp/Clkn时钟正负。一个典型的4-lane摄像头物理上就是5对差分线4对数据、1对时钟。为什么CSI-2偏偏要用差分信号因为图像数据量太大了。一个1080P30fps的RAW10图像原始数据率大概 1080×1920×10×30 ≈ 622Mbps这还只是一个镜头的数据。如果用单端信号传不仅容易受共模噪声干扰还很难在长距离或高码率下保持信号完整性。差分信号的好处在于它把信号定义在“两根线的电压差”上外界的共模噪声同时叠加在两根线上差分电压不变。你可以把它想象成两个人在相反方向同时抬一块木板木板的高度代表信号值风噪声对两个人的推力是一样的木板相对地面的高度不受影响。D-PHY的物理传输格式并不是只有一种模式而是有高速High-Speed, HS和低功耗Low-Power, LP两种工作模式。传图像数据时走HS模式此时一对差分线上高速翻转差分电压幅度很小典型只有200mV左右不同规格略有差异传控制命令、进入或退出待机时走LP模式此时信号是单端电平幅度在1.2V左右。一个信号线协议要同时兼容两种电压域这也是D-PHY的独特之处和很多只看差分幅度的高速串行协议不太一样。2.2 时钟在CSI-2里的角色DDR采样与奇偶laneCSI-2的时钟lane时刻在跑持续输出一个高速时钟数据lane上的信号按这个时钟进行双沿采样DDR。也就是说时钟的上升沿和下降沿都会采一个bit。这一点非常关键很多初接触CSI-2的人会把它的时序想成SPI那种单沿采样结果在FPGA里写接收逻辑时抓不到数据。举个例子如果时钟lane的HS频率是200MHz那单条数据lane的bit率就是400Mbps4条数据lane加一起是1.6Gbps。CSI-2在协议层推荐的做法是数据内容按字节分发到不同的lane上而不是把一整个字节拆开放到多条lane上之后还需要复杂的重组。这种“按字节分配lane”的做法称为lane distribution。实际信号波形上你如果拿示波器看会看到时钟lane是一串方波数据lane上的信号则在两个电平之间跳变。D-PHY在HS模式下的“1”和“0”是通过Dp/Dn的电位极性定义的Dp高于Dn时一般定义为一个状态低于则定义为相反状态。具体极性映射不同接收机可以配置但物理本质就是这么回事。2.3 HS与LP状态转换为什么示波器上看到的波形一半平一半跳调试MIPI时很多人第一次抓波形都会懵数据线上既有大幅度的1.2V跳变又有一小段大幅度平平的“直线”再突然出现密密麻麻的小幅方波这是为什么其实那些大幅度的部分就是LP状态下的控制信号比如进入高速传输前的准备时序而那一段“平平直线”加小幅方波就是从LP转到HS之后高速数据传输的开始。D-PHY定义了一系列的时序状态用来保证收发双方顺利切换。比如发送端要进入HS模式传一组数据时会先让Dp/Dn都处于LP的某个逻辑电平然后经过一段称为t_HS_PREPARE的时间把差分摆幅建立起来再开始翻转时钟和数据。接收端要识别这个HS进入序列一般检测差分信号过了某个阈值就开始锁定时钟。这些时序参数虽然通常在传感器端和接收端的寄存器里已经配好了但做FPGA接收或者给新Sensor配驱动时你还是要对这些名字有印象。它们不是“存在但不用理会”的文档而是你排查“信号起来了但数据采不对”这一类问题时的第一嫌疑对象。常见的t_HS_TRAIL、t_HS_PREPARE、t_HS_ZERO这几个参数如果配置不当会导致HS进入失败或退出时机不对表现出来就是时好时坏。3. 包结构与数据格式读懂短包长包才算真正看懂了CSI-2总线3.1 短包是“标题”长包是“正文”CSI-2是怎么组织数据的CSI-2协议层最核心的设计是把所有传输内容抽象成两种包短包Short Packet和长包Long Packet。我习惯叫它们“标题”和“正文”。短包只有32位的Packet HeaderPH没有数据体和包尾它的作用非常单一——传递同步信息和帧控制。Sensor每开始一帧图像传输时会先发一个帧起始Frame Start, FS短包每结束一帧时再发一个帧结束Frame End, FE短包。每一行开始时发一个行起始Line Start, LS短包行结束时发一个行结束Line End, LE短包。FS和FE这两个短包是图像帧同步的关键。接收端或者后端的ISP全靠这两个短包来界定一帧的边界。如果FE丢失接收端就会傻等下一帧的FS这时候表现出来的就是帧率异常、帧数据堆积。如果LS、LE丢失则会影响行同步最终导致画面错行或花屏。长包才是真正装图像数据的包。它由三部分组成Packet HeaderPH、数据体Payload、Packet FooterPF。PH固定32位里面包含了虚通道号2bit、数据类型DT6bit、字计数WC16bit和ECC8bit。数据体是你要传的字节流长度由WC字段直接指定。PF是16bit的CRC校验。接收端通过PH里的WC知道要收多少个字节收够之后校验CRC校验通过就认为这一包数据是干净的。3.2 数据类型与RAW格式RAW10到底是怎么塞进字节流的DT字段是CSI-2里经常要打交道的东西。它告诉接收端当前这包数据是什么格式。常见的DT有YUV422-8bit0x1E、RGB8880x24、RAW80x2A、RAW100x2B、RAW120x2C、RAW140x2D等。你调试传感器驱动时必须保证sensor输出的DT和SoC端dts/driver里配的DT一致。我曾经遇到过一次图像整体偏紫、颜色错乱的问题查到最后就是DT配错SoC按RAW12去解RAW10数据bit错位导致颜色乱套。RAW10这类非整字节格式有一个小坑10bit像素数据无法直接用整字节表示。CSI-2标准规定RAW10采用打包方式把4个10bit像素打包成5个字节。这5个字节里前4个字节分别存4个像素的高8位第5个字节的低2位存第一个像素的低2位它的中2位存第二个像素的低2位以此类推。这个打包规则听起来不复杂但一旦在FPGA里做bit重排时把顺序搞反要么图像整体错位要么出现固定的竖条纹。对于FPGA实现者这里我建议拿到位图数据先做一个小样本测试用已知像素值。比如发4个10bit像素分别是0x1A0、0x1A1、0x1A2、0x1A3按RAW10打包后应该在总线上看到哪5个字节心里要能有数。然后用这个预期去对着示波器或逻辑分析仪抓到的数据逐bit对比比瞎调快一百倍。3.3 虚通道Virtual Channel与多路摄像头并发CSI-2的Packet Header里那2bit虚通道号VC很多人会忽视。但实际上在多摄方案里它是救命的东西。VC的作用是让同一个MIPI物理链路上可以同时传输多路不同的图像数据流接收端靠VC号把不同的流拆开。比如前置摄像头和深度摄像头可以共用同一个CSI-2接口传感器A的数据全部打上VC0的标签传感器B的数据打上VC1的标签SoC端按VC分别路由到不同ISP。2bit意味着VC最多支持0~3四个通道。如果你要做超过四路摄像头的复用就得靠CSI-2 v2.0引入的DLVMData Lanes Virtual Machine之类的新特性来扩展或者物理上增加CSI接口。但在绝大多数项目里四个VC已经足够用了。调试VC相关问题时最容易碰到的坑是SoC端驱动配置的VC号和Sensor端实际输出的VC号不一致。这种配置错误对信号波形毫无影响数据链路完全正常但接收端会把数据丢到错误的通道里去最终表现为主控收不到图像或者两个摄像头画面互串。我建议在调试任何多摄方案时第一步先把Sensor的VC输出寄存器值和SoC端driver里的VC配置值都列出来逐一核对。这一步看似简单但真的能排除掉相当一部分“莫名奇妙”的问题。4. 示波器与协议分析实战CSI-2信号在物理链路上到底长什么样4.1 用示波器量D-PHY探头怎么接、触发怎么设MIPI CSI-2调试最常用的工具还是示波器但示波器测MIPI是有不少门道的。首先你要用差分探头测量差分对而不是两个单端探头看两路波形。因为差分探头的共模抑制能力保证了测出来的就是真正的差分信号。如果没有差分探头一部分中高端示波器支持用两个通道做数学运算A减B也能近似看但精度会打折扣尤其在高频下误差会放大。触发设置是新手最容易懵的地方。CSI-2的HS信号频率高、持续时间短且前面有一段LP信号如果你直接用上升沿触发会因为LP阶段的低电平跳变而误触发。我常用的方式是先把垂直档位调大让整个波形完整显示出来观察一段时间找到HS burst的周期性特征然后用脉宽触发Pulse Width Trigger设置一个只对HS高频振荡有效的窄脉冲宽度条件。或者更简单粗暴一点在Sensor端写寄存器让Sensor持续输出测试图案Test Pattern这样HS burst就会以固定帧率出现便于触发和观察。当你能稳定抓到一次HS传输波形后重点看两件事时钟lane和数据lane的差分摆幅是否在规格范围内以及数据和时钟的边沿对齐关系。D-PHY是源同步接口数据信号的建立保持时间由时钟信号边沿位置决定。如果时钟和数据在PCB上走线长度差太多或者接收端的输入延迟没校准就可能出现数据采错。波形上看就是数据翻转点不在时钟边沿的中间位置附近。4.2 时钟波形与关键时序一堆参数里最先要确认的是哪几个MIPI调参最常碰见的是一堆t_开头的时序参数看着就头大。但其实对大多数调试场景你先盯住这几个就够了t_HS_PREPARE高速传输开始前数据线要进入HS准备状态的时间。太短接收端可能来不及检测到HS状态太长会浪费链路的可用带宽。 t_HS_TRAILHS传输结束后维持HS状态一段时间再切回LP。太短会导致信号还没完全安静下来就切LP产生毛刺。 t_LPXLP模式下脉冲的最小宽度主要影响控制信号。这个参数在很多SoC的phy配置里都暴露出来一般不用动。拿示波器抓波形时你可以把HS burst的头和尾放大来看量一下这些时间间隔是否跟sensor侧配置的值吻合。大多数时候厂家默认配置是没问题的你只需要确认不是某个补丁版本把时序改坏了。真正会逼你动这些参数的是低功耗产品比如电池供电的IPCAM为了省电会让Sensor频繁进出HS/LP时序余量不足就会在切换瞬间出CRC错误。4.3 协议分析仪和逻辑分析仪抓包才是定位花屏的终极大招示波器能看到信号长什么样但看不到“包”的内容。尤其是在花屏、丢帧这类问题出现时你需要看到总线上实际传输的包序列。推荐的方式是用逻辑分析仪配合协议分析软件。现在主流的逻辑分析仪厂商比如Saleae、Kingst都有MIPI CSI-2的协议解码插件你只要把Dp/Dn差分对转成单端逻辑电平接入分析仪或者直接买支持差分的探头软件就能自动解出FS、FE、长包的DT、WC、CRC状态。我把抓包定位问题的优先级固定为先看短包序列是否完整FS、FE是否成对出现再看长包CRC是否全绿最后看DT和WC是否符合预期。按照这个顺序排查大部分花屏问题都能定位到“帧同步丢失”“某条lane的数据CRC错”“包长度超限”这几类里面。相比在FPGA里加ILA使劲抓内部信号这样从总线角度切入往往更快。5. 踩坑实录FPGA实现、RK平台点亮屏与RAW错位的排查链路5.1 FPGA实现CSI-2 RX哪些资源是必须的如果你要在FPGA里实现一个MIPI CSI-2接收端最先要解决的是物理层。Xilinx系FPGA上高性能HP Bank提供MIPI支持但要注意bank电压和端接电阻设置。接收差分信号时你需要使用IBUFDS_DIFF_OUT把差分对转成单端然后送入ISERDESE2做串并转换。ISERDESE2是FPGA里的专用串行器可以把高速串行bit流转成并行字节。DDR模式下时钟和数据都由时钟lane恢复所以你需要用MMCM或PLL生成相位移位的采样时钟确保I/O逻辑在正确的窗口采到数据。当数据以字节流进入FPGA内部逻辑后接下来就是协议层的活了需要寻找SoTStart of Transmission模式。D-PHY在HS传输开始时会自动发送一段固定的同步序列SoT接收端通过检测这个序列来完成字节对齐。如果你的接收逻辑没有完成字节对齐后面的一切解析都是白搭数据可能错位1个bit图像就彻底花了。字节对齐后才开始按Packet Header的格式去解析DT、WC、VC组包流程以及ECC/CRC校验。一个完整的CSI-2 RX IP不是几百行代码能写完的但核心链路就是这么几条。5.2 RK平台点亮MIPI屏从VBT到dts的时序配置闭环很多人一搜索MIPI调试就会看到“RK平台点亮MIPI屏”这个方向。虽然这属于DSI显示接口但调试方法和CSI-2高度相似而且很多工程师在两个方向上是同时接触的。拼接收、通屏幕RK平台遇到的首个难题往往是时序和VBT配置。在RK平台上屏幕驱动参数包括HSA、HBP、VSA、VBP等通常需要放到dts里还要和屏厂提供的初始化序列保持一致。如果参数对不上最常见的结果是屏幕出现亮度过低、闪屏甚至直接黑屏。另外RK在U-Boot阶段会通过VBTVideo BIOS Table本质上就是一份boot阶段显示参数表去初化显示屏如果你只改了内核dts而没同步U-Boot的VBT就会出现“内核起来后屏幕闪一下黑掉”的经典现象。和CSI-2的PHY配置一样这一类平台级调试本质上就是把一个时序参数表格搬到正确的位置。动手前先把dts、U-BootVBT、屏厂时序表三份文件对齐能省一整天的力气。5.3 数据错位、lane翻转和极性配错RAW图像云纹的经典根因收到一张明显有固定竖条纹和颜色错乱的图像很多人的第一反应是去调ISP结果忙活半天发现根因在CSI-2的bit对齐上。RAW数据错位有个非常典型的特征图像中会出现规律的斜向条纹像被梳子刮过一样而且每一行错位的偏移是固定的。如果是单个bit错位RAW10的像素值会整体“错位”导致相邻像素的bit互相污染。这种问题的可能原因有三个一是接收端的字节对齐没有找到正确的SoT位置导致整体偏移了若干bit二是Sensor端的lane mapping和SoC端配置不一致比如Sensor输出的lane0接到了SoC的lane3上而软件仍然按顺序解析此时图像会出现行内数据块交换的现象三是极性配反Dp/Dn接反或者时钟极性被翻转也会造成采样错误。排查这类问题我的做法是从FPGA内部抓PCS侧的数据先看对齐后的并行数据是不是能解出合理的DT和WC再看数据内容是否符合已知的测试图案。如果FPGA内部已经错乱那就不是ISP的问题而是物理或PCS阶段的问题。5.4 CRC与ECC错误是偶发还成批出现决定了不同的排查方向收到CSI-2总线上有CRC错误反馈时先不要急着重启板子。你要区分两种场景。第一种是偶发的比如一个长包里只有一两个CRC错误这种情况通常指向信号完整性问题走线阻抗不连续、连接器接触不良、供电纹波过大等。抓波形时往往看不出明显问题但把码率降一半再测可能就好了这时就要考虑增加端接或者优化PCB。第二种是成批错误比如每帧固定若干个包CRC全错。这种就很少是信号质量问题而大概率是逻辑问题——某个状态机的状态跳转被干扰或者ECC检测把短包误当成长包尾。回到开头那个花屏事故我们最后就是在逻辑分析仪上发现短包后的状态机没有正确复位导致紧接的长包解析错位。这种bug靠加电容换PCB是永远解决不了的必须回到协议层去查状态机。5.5 调试顺序建议物理层到协议层的标准排查链路结合上面的案例我整理了一套自己一直在用的CSI-2排查流程按顺序做能覆盖绝大多数调试问题确认Sensor和SoC/FPGA的lane数、lane极性、时钟极性配置一致。确认DT、WC、VC配置一致输出Test Pattern而不是真实场景图。用示波器抓HS burst确认差分摆幅、时钟频率、t_HS_PREPARE和t_HS_TRAIL大致正常。用逻辑分析仪抓包确认FS/FE短包成对出现LT包CRC全绿。如果CRC有错区分偶发还是成批偶发查信号完整性成批查状态机和协议解析逻辑。如果CRC全绿但图像仍花查字节对齐和RAW打包规则用已知像素值测试图案做逐bit对比。这套流程看起来很朴素但它真的能够把物理层问题和协议解析问题区分开。绝大多数项目真正走到第6步的不多前5步里就已经能解决掉大部分疑难杂症。6. 一些和工具、规范打交道的经验从看懂协议到少熬夜6.1 手里的规范版本要和芯片匹配别拿旧Spec硬套新模组吃了这么多年技术的饭我发现MIPI这块最大的坑其实藏在规范版本分散里每一版MIPI CSI-2都会加入一些新特性。CSI-2 v1.0提供了最基础的RAW/YUV/RGB传输v1.1加入了对RAW14和RAW16的支持v1.2引入了C-PHY和向更高数据率演进方向v2.0加入了DLVM等多个虚通道机制。如果你买的是新款Sensor模组而你的SoC或FPGA IP还只支持v1.1的协议特性就可能在VC扩展、CRC计算方式上出现兼容性差异。我建议做项目前先明确三件事Sensor输出的是哪个版本规格的CSI-2信号接收端IP支持到哪个版本以及两者在DT、ECC、CRC上是否按同一规范实现。特别是C-PHY的收发器如果一端是D-PHY只有部分是C-PHY某些模组会默认启用相对高级的特性导致信号根本不通。6.2 协议文档的阅读方法先看时序图再看状态机最后看寄存器MIPI规范由MIPI联盟发布完整CSI-2规范加上D-PHY规范动辄几百页。对实际开发来说不需要从头到尾读完。我自己的阅读顺序是先从主文档的“Protocol Layer”章节把短包长包结构看懂然后翻到“D-PHY”章节看HS/LP状态图和时序参数表最后才去看寄存器相关的示例。规范里的状态图State Machine非常有用但很多人容易跳过它直接看波形结果只记住了波形外形遇到时序切换的边界情况就懵。寄存器这块我认为和架构协议文档同等重要。不同Sensor厂家对CSI-2 PHY的控制差异很大有的把t_HS_TRAIL全部开放成寄存器位有的则只给一个“综合时序微调”的缩放因子。不确认模组的手册去硬调时序几乎等于盲人摸象。6.3 从CSI-2调试延伸出去CAN、SPI这些协议其实都在帮你建立“分层思维”如果你已经能把MIPI CSI-2的分层思维吃透再去看别的协议就会觉得通透很多。比如搜MIPI相关热词时经常会看到CAN协议、SPI协议、PCIE协议这些协议表面上千差万别但核心思想高度一致物理层怎么保证信号可靠传输链路层怎么界定报文格式应用层怎么解释数据。CAN的报文ID、SPI的片选和时钟极性、PCIE的TLP包都是“协议层把数据装上信封”的思路。分层思维还有一个实际好处调试时你会有更强的定位能力。不会一遇到图像异常就拔电容、换芯片、改驱动而是能冷静地判断“这个问题属于哪一层”。这种定位能力恰恰是资深工程师和新手最本质的差距。6.4 一套趁手的调试装备清单最后把我这些年积累的、最常用的CSI-2调试装备列一下给正准备入坑的朋友一个参考带宽不低于1GHz的示波器配差分探头最好带MIPI自动触发选件。如果预算有限至少也要500MHz带宽加有源差分探头否则测200mV摆幅的高速差分信号会严重失真。 支持MIPI CSI-2解码的逻辑分析仪采样率最好不低于500MSa/s。解码插件能省去你手动数bit的力气。 Sensor端的测试图案Test Pattern功能绝大多数Sensor都有调试时务必充分使用它。 一张准确标注了lane mapping和极性定义的原理图以及一份和硬件完全一致的寄存器配置表。这些工具不一定都要买顶配但一样都不能缺。在项目最紧张的时候往往是手里工具足够的工程师能更快定位问题而不是靠着经验瞎猜。CSII-2说到底不是一门“看一遍就会”的知识它是那种必须亲手在示波器前扎扎实实抓过波形、在逻辑分析仪里确认过每一包CRC之后才能真正内化的技能。我建议你从一个小项目练手开始比如在开发板上接一个最普通的MIPI摄像头模组自己写一个最简的接收逻辑或者用现有的IP跑通一次图像采集然后刻意制造几个故障——故意把极性配反、把DT配错、把lane数少配一条看波形和图像分别会变成什么样。这种“主动踩坑”的训练比什么都涨功夫。
返回列表