ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MIPI D-PHY波形拆解实战:从DDR时钟到行同步的调试指南

MIPI D-PHY波形拆解实战:从DDR时钟到行同步的调试指南 1. 为什么MIPI波形值得花时间拆解搞嵌入式显示或者摄像头调试的朋友大概率都遇到过这种场景屏幕点不亮或者摄像头出图花屏代码翻来覆去检查没问题最后卡在硬件信号上。这时候如果手边有台示波器能把MIPI信号抓出来看一眼很多问题几分钟就能定位。但现实是很多人拿到波形之后不知道从哪看起——DDR时钟、行同步、HS/LP状态跳变这些术语堆在一起确实容易懵。MIPI DSI和CSI这两套协议本质上都是高速差分串行接口物理层用的是D-PHY。它跟传统的RGB并口、LVDS有本质区别并口是每条信号线各管各的时钟和数据分开走拿示波器一夹就能看明白MIPI不一样它是把时钟和数据都做成差分对而且数据线上还叠加了低功耗状态和高速突发传输两种模式波形看起来是一簇一簇的突发不是连续翻转。这就导致很多人第一次抓MIPI波形的时候会觉得“这什么东西怎么跟书上说的不一样”。这篇内容就是写给那些需要实际动手调试MIPI接口的工程师不管你是做RK3567 Android平台的摄像头适配还是在ST7701S这类屏幕驱动IC上做竖屏转横屏的显示调试又或者是在FPGA上实现MIPI收发只要涉及到用示波器看波形、定位信号问题这里面的拆解思路都能直接拿来用。我会从DDR时钟的本质讲起把行同步在MIPI里的映射关系说清楚然后给出完整的波形拆解流程和常见问题排查表。不堆公式不抄协议文档全是实际调试中积累下来的判断方法。2. MIPI D-PHY的物理层逻辑与DDR时钟本质2.1 差分信号与DDR时钟的基本关系MIPI D-PHY的时钟通道是一条差分对通常标记为CLK和CLK-。它跑的是DDR模式也就是双沿采样——时钟的上升沿和下降沿都用来锁存数据。这一点跟DDR内存的时钟逻辑是一样的目的很简单在同样的时钟频率下把数据吞吐量翻倍。比如时钟跑500MHzDDR模式下等效数据率就是1000Mbps per lane。这里有个容易混淆的点MIPI的时钟通道在HSHigh Speed模式下是连续的差分时钟但在LPLow Power模式下会进入单端状态。所以你在示波器上看到的时钟波形并不是从头到尾都在翻转而是跟着数据突发一起出现。数据来了时钟开始跑数据传完时钟也停下来进入LP状态。这个特性直接决定了你抓波形时触发方式的选择——不能用普通的边沿触发去抓得用协议触发或者脉宽触发才能稳定捕获。差分信号的测量也有讲究。如果你用单端探头分别去碰CLK和CLK-看到的是两条反相的波形幅值大概在200mV左右HS模式。但真正有意义的是差分电压也就是CLK减去CLK-这个值在HS模式下典型是200mV差分摆幅。用差分探头当然最方便但如果没有也可以用两个单端探头做数学运算只是要注意两个探头的延迟要校准好否则差分波形会失真。2.2 HS模式与LP模式的切换机制MIPI D-PHY最让人头疼的地方就是HS和LP两种状态的切换。LP模式下每条线是单端信号电平范围0到1.2V用来传控制命令和进入低功耗HS模式下两条线组成差分对共模电压200mV差分摆幅200mV用来传高速数据。这两种模式的电气特性完全不同切换过程也有严格的时序要求。在实际波形上你会看到这样的序列先是LP-11两条线都是高电平然后变成LP-01一条高一条低接着进入HS-0差分零状态然后才是真正的HS数据突发。数据传完之后又经过HS-0回到LP-11。这个切换过程如果时序不对接收端就识别不了表现就是屏幕不亮或者摄像头不出图。用示波器抓这个切换过程建议把时基打到100ns/div左右同时抓时钟通道和至少一条数据通道。触发方式选LP-11到LP-01的跳变这样能稳定抓到每次突发的起始。我实测下来用脉宽触发配合欠幅触发比单纯的边沿触发靠谱得多因为LP状态的跳变沿比较慢边沿触发容易误触发。2.3 时钟通道与数据通道的相位关系MIPI D-PHY的时钟和数据之间有一个关键的相位关系时钟边沿要对准数据的中心。也就是说接收端在时钟的上升沿和下降沿采样时采到的应该是数据眼图的中心位置。这个相位关系如果偏了眼图就会闭合误码率飙升。在示波器上怎么看这个关系把时钟通道和数据通道同时抓出来用示波器的延迟测量功能量时钟边沿到数据跳变沿的时间差。理想情况下这个时间差应该是数据单位间隔UI的一半。比如数据率1GbpsUI就是1ns那时钟边沿应该对准数据眼图中心也就是距离数据跳变沿0.5ns的位置。实际调试中这个相位关系由发送端的时序参数决定但PCB走线长度差异也会影响。如果时钟线和数据线的走线长度差太多相位就会偏。一般要求差分对内的两条线长度差控制在5mil以内时钟对和数据对之间的长度差控制在50mil以内。超过这个范围眼图就会明显恶化。3. 行同步信号在MIPI协议中的映射与波形特征3.1 从RGB并口的行同步到MIPI的虚拟通道做惯了RGB并口的人第一次接触MIPI会很不适应——因为MIPI没有物理的行同步信号线。RGB接口有HSYNC、VSYNC、DE这些独立的信号线拿示波器一夹就能看到行同步脉冲。MIPI DSI把这些同步信息打包进了数据包里面通过虚拟通道Virtual Channel来区分不同的数据流。具体来说MIPI DSI协议定义了几种包类型短包用来传同步事件和命令长包用来传像素数据。行同步对应的是短包里的“Hsync Start”和“Hsync End”场同步对应的是“Vsync Start”和“Vsync End”。这些短包在数据通道上传输时也是一串HS突发但长度很短通常只有几个字节。所以在示波器上你看到的行同步不是一个周期性的脉冲而是一串短促的HS突发夹杂在长包数据之间。要把它和像素数据区分开得靠协议解码。现在的示波器大多支持MIPI DSI协议解码选件打开之后能直接标注出每个包的类型。如果没有解码选件也可以通过突发长度来粗略判断短包突发通常只有几十纳秒长包突发能持续几微秒甚至更长。3.2 行同步时序参数的波形测量方法虽然MIPI把行同步打包了但时序参数还是那些HSA行同步有效、HBP行同步后沿、HFP行同步前沿、HACT行有效像素。这些参数在屏幕驱动IC的初始化代码里都要配配错了屏幕就会偏移或者花屏。在波形上怎么测这些参数以ST7701S这类驱动IC为例你可以先抓一帧完整的波形找到Vsync短包的位置然后往下找Hsync短包。两个Hsync短包之间的时间间隔就是一行的时间。Hsync短包到第一个像素长包之间的间隔就是HBP最后一个像素长包到下一个Hsync短包之间的间隔就是HFP。这里有个实操技巧把示波器的余辉模式打开让多行波形叠加在一起这样能很直观地看到行与行之间的一致性。如果某一行明显偏了说明时序有问题。我遇到过一块屏HFP配小了导致每行的最后一个像素被截掉屏幕上表现为右边有一条竖线。后来把HFP从20改到40问题就解决了。3.3 竖屏改横屏时行同步参数的变化RK3567 Android平台上做MIPI竖屏改横屏是很多人会碰到的需求。这个改动表面上是显示方向的旋转实际上涉及到行同步和场同步参数的重新计算。竖屏的时候行同步对应的是屏幕的短边改成横屏之后行同步对应的是长边。如果驱动IC的初始化代码里HACT、HSA这些参数没跟着改显示就会错位。具体怎么改假设竖屏分辨率是720x1280行同步参数是按720来配的。改成横屏1280x720之后HACT要改成1280HSA、HBP、HFP也要按比例调整。但这里有个坑不是简单地把数值换过来就行还要考虑驱动IC的内部RAM映射方式。有些驱动IC支持硬件旋转你只需要改一个寄存器位有些则需要在软件层面做帧缓冲的旋转这时候行同步参数反而不需要大改。我在RK3567上调试的时候习惯先用示波器抓一下改之前的波形记录下Hsync短包的间隔和HACT长包的长度然后改完代码再抓一次对比看是否一致。如果不一致就说明参数没配对。这个方法比盲改代码高效得多。4. 完整波形拆解流程与实操步骤4.1 示波器设置与探头选择抓MIPI波形示波器的带宽至少要是数据率的2倍以上。比如数据率1Gbps示波器带宽至少要2GHz。如果带宽不够眼图会糊成一团什么都看不出来。采样率建议是数据率的5倍以上1Gbps的数据率对应5GSa/s的采样率。探头方面差分探头是最优选择但价格贵。如果没有差分探头可以用两个单端探头做差分测量但要注意两个探头的接地线要尽量短否则会引入振铃。我试过用两个普通无源探头测MIPI效果也能凑合看但眼图质量明显不如差分探头。触发设置是关键。前面说过MIPI的HS突发不是连续的用边沿触发很难稳定捕获。建议用协议触发如果示波器支持MIPI DSI解码或者用脉宽触发配合欠幅触发。脉宽触发用来抓LP状态的窄脉冲欠幅触发用来抓HS突发的起始。实测下来用LP-11到LP-01的跳变作为触发条件能稳定抓到每次突发的起始位置。4.2 从DDR时钟到数据突发的逐段拆解抓到波形之后按以下顺序拆解第一步看时钟通道。确认时钟在HS模式下是连续的差分波形频率是否和配置一致。如果时钟频率不对先查PLL配置。第二步看数据通道的LP到HS切换。找到LP-11状态然后看LP-01、HS-0的过渡。这个过渡时间通常在几十纳秒如果太长或者太短都可能是发送端驱动能力的问题。第三步看HS数据突发的眼图。把示波器调到眼图模式累积一段时间看眼图的张开程度。眼高和眼宽是衡量信号质量的关键指标。眼高一般要求大于100mV眼宽要求大于0.5UI。第四步用协议解码看包类型。确认Hsync、Vsync短包和像素长包的位置关系是否正确。如果短包和长包之间的间隔不对说明时序参数配错了。第五步测量时钟和数据之间的相位关系。用示波器的延迟测量功能量时钟边沿到数据眼图中心的时间差确认是否在0.5UI附近。4.3 协议解码与包类型识别示波器的MIPI DSI协议解码功能能把波形上的HS突发翻译成具体的包类型和参数。打开解码之后你会看到类似这样的标注VSYNC Start、HSYNC Start、HSYNC End、Pixel Data、VSYNC End。每个标注下面还有具体的参数比如虚拟通道号、数据长度等。如果没有解码选件也可以手动识别。短包和长包的区别在于突发长度短包通常只有4个字节突发时间很短长包的数据长度可变突发时间较长。另外短包一般出现在每行的开头和结尾长包出现在中间。通过这个规律也能大致判断出包的类型。我遇到过一种情况屏幕显示正常但偶尔会闪一下。用协议解码一看发现每隔几百帧就有一个HSYNC短包丢失。后来查出来是时钟通道的相位偏移太大导致接收端偶尔误判。把时钟走线重新等长之后问题就消失了。5. 常见问题排查与避坑经验5.1 波形抓不到或触发不稳定这是最常见的问题。原因通常有三个触发方式不对、探头接地不好、示波器带宽不够。触发方式前面说过了用LP-11到LP-01的跳变最稳。探头接地不好会导致波形上叠加很大的噪声看起来像是信号在乱跳。建议用探头自带的接地弹簧不要用长长的接地线。示波器带宽不够的话HS突发的上升沿会变缓眼图闭合这时候只能换更高带宽的示波器。5.2 眼图闭合与信号完整性优化眼图闭合说明信号质量差原因可能是走线阻抗不匹配、过孔太多、或者发送端驱动能力不足。MIPI D-PHY的差分阻抗要求是100欧姆如果PCB走线阻抗偏了信号反射就会导致眼图闭合。用TDR时域反射功能可以测走线阻抗如果偏差超过10%就要改叠层或者调整线宽。发送端驱动能力也是常见问题。有些驱动IC的HS驱动电流是可配的默认值可能偏小。在ST7701S上我遇到过默认驱动电流下眼图勉强能看但温度一高就出错。后来把驱动电流调大一档眼图明显张开高温下也稳定了。5.3 行同步偏移与显示错位行同步偏移表现为屏幕图像左右偏移或者某一边有黑边。原因通常是HSA、HBP、HFP参数配错了。用示波器抓一行波形量Hsync短包到第一个像素长包的时间这个时间应该等于HBP加上HSA。如果实测值比配置值大说明HBP配小了图像会往右偏。还有一种情况是竖屏改横屏之后行同步参数没改全。比如只改了HACT没改HSA导致行同步脉冲的位置不对。这种问题在波形上表现为Hsync短包和像素长包之间的间隔异常。解决办法是把所有行同步相关参数都重新算一遍确保总和等于一行的时间。5.4 常见问题速查表现象可能原因排查方法解决措施抓不到波形触发方式不对改用LP-11到LP-01跳变触发调整触发设置眼图闭合走线阻抗不匹配用TDR测阻抗调整叠层或线宽眼图闭合驱动电流不足查驱动IC寄存器调大HS驱动电流行同步偏移HBP/HFP配错量Hsync到像素包间隔重新计算时序参数偶发闪屏时钟相位偏移量时钟到数据延迟重新等长走线竖屏改横屏错位行同步参数未更新对比改前后波形重新配置所有时序参数5.5 实操心得与避坑技巧第一个心得抓波形之前先确认屏幕或摄像头是否真的在工作。有时候问题不在信号上而是电源或者复位没弄好。我踩过一次坑折腾了半天波形最后发现是复位引脚虚焊。第二个心得示波器的探头地线一定要短。MIPI的HS信号上升沿很快长地线会引入电感效应导致波形振铃。用接地弹簧是最稳妥的。第三个心得协议解码功能虽然方便但不能全信。有时候解码出来的包类型是对的但参数是错的。最好还是结合手动测量来交叉验证。第四个心得竖屏改横屏的时候不要只改分辨率参数还要检查驱动IC的扫描方向寄存器。有些驱动IC支持硬件旋转改一个位就行有些需要改扫描方向这时候行同步和场同步的角色会互换。第五个心得如果眼图怎么调都张不开试试降低数据率。有时候PCB走线质量有限跑不到标称速率降一档反而更稳定。这在成本敏感的消费类产品上很常见。6. FPGA实现MIPI时的波形调试要点6.1 FPGA端MIPI收发器的时钟域处理在FPGA上实现MIPI D-PHY跟用专用驱动IC是两回事。FPGA的IO资源虽然灵活但要跑高速差分信号得用专门的SelectIO或者SerDes资源。以Xilinx 7系列为例MIPI的HS模式需要用到ISERDESE2和OSERDESE2时钟要用MMCM来生成。这里的关键是时钟域的处理。MIPI的DDR时钟在FPGA内部要分成两个时钟域一个是高速的位时钟一个是低速的字节时钟。位时钟用来做串并转换字节时钟用来做协议解析。这两个时钟的相位关系必须固定否则数据会错位。在示波器上调试的时候建议同时抓FPGA的参考时钟和MIPI输出时钟确认两者的频率和相位关系是否正确。如果FPGA输出的MIPI时钟抖动很大可能是MMCM的配置有问题或者电源噪声太大。6.2 用ILA抓取MIPI协议层数据FPGA的好处是可以在内部抓信号。Xilinx的ILA集成逻辑分析仪可以抓MIPI协议层的数据比示波器方便得多。你可以把MIPI的包解析逻辑挂在ILA上实时看每个包的类型和参数。我通常会在ILA上抓这几个信号HS同步状态、包类型、虚拟通道号、数据长度。这样一旦出问题能很快定位是物理层的问题还是协议层的问题。如果ILA上看到包类型是对的但示波器上眼图闭合那就是物理层的问题反过来如果示波器上波形很好但ILA上包类型不对那就是协议解析逻辑的问题。6.3 FPGA与专用驱动IC的调试差异用专用驱动IC比如ST7701S的时候你只能通过I2C或者SPI去配置寄存器然后看波形。出了问题能改的只有寄存器参数和PCB。用FPGA的时候你可以直接改RTL代码灵活性高很多但调试复杂度也高。一个典型的差异是驱动IC的MIPI时序参数是固定的你只能选几个预设值FPGA的时序参数是你自己写的可以精确到每个时钟周期。所以用FPGA调试MIPI示波器上的波形会更“干净”但也更容易出现时序违例。建议在FPGA上先用低速跑通再逐步提高数据率每提高一档就抓一次波形确认。7. Linux平台MIPI摄像头调试的波形验证7.1 RK3567 Android MIPI摄像头调试流程RK3567平台上调试MIPI摄像头通常涉及几个层面设备树配置、驱动加载、V4L2管道配置、以及ISP调优。波形验证主要用在驱动加载之后、出图之前这个阶段。具体流程是先确认设备树里的MIPI DPHY和CSI控制器配置正确然后加载驱动用v4l2-ctl抓一帧图。如果抓不到图或者图是花的就用示波器抓MIPI波形。先看时钟通道有没有信号再看数据通道有没有HS突发最后用协议解码看包类型对不对。RK3567的MIPI CSI控制器支持多路虚拟通道调试的时候要注意虚拟通道号是否和摄像头配置一致。我遇到过虚拟通道号配错的情况波形上看起来一切正常但就是不出图。后来用协议解码一看虚拟通道号是1而驱动里配的是0改过来就好了。7.2 MIPI转LVDS的波形对比验证有些项目需要把MIPI转成LVDS比如用Linux适配MIPI转LVDS桥接芯片。这时候波形验证要分两段做先抓MIPI输入端的波形确认输入信号正常再抓LVDS输出端的波形确认转换后的信号也正常。MIPI和LVDS的波形特征完全不同。MIPI是差分突发LVDS是连续的差分信号。在示波器上LVDS看起来是连续翻转的差分波形而MIPI是一簇一簇的。如果MIPI输入端波形正常但LVDS输出端没有波形那问题就在桥接芯片的配置上。如果LVDS输出端有波形但屏幕不亮那可能是LVDS的时序参数配错了。7.3 摄像头出图异常的波形定位方法摄像头出图异常比如花屏、绿屏、条纹用波形定位的方法是这样的先抓一帧完整的MIPI波形看HS突发的数量和间隔是否和分辨率匹配。比如1080p的摄像头一帧应该有1080个行同步短包。如果数量不对说明行同步参数配错了。然后看每个HS突发的眼图质量。如果某些突发的眼图明显比其他的差说明信号完整性有问题可能是走线或者连接器的问题。最后用协议解码看像素数据是否正确。如果解码出来的像素值和预期不符那可能是数据格式配错了比如RGB和YUV搞混了。我遇到过一种花屏情况波形上一切正常协议解码也对但图就是花的。后来查出来是摄像头的MIPI数据率配高了超过了走线的带宽极限。把数据率降下来之后图就正常了。所以波形正常不代表一切正常还要结合系统层面的配置来综合判断。8. 写在最后MIPI波形拆解这件事说难也难说简单也简单。难的是协议层和物理层的交织很多问题不是单一因素导致的简单的是只要你掌握了从DDR时钟到行同步的拆解顺序大部分问题都能按图索骥地定位。我个人在实际操作中的体会是示波器再高级也不如对协议的理解来得重要。你得知道正常的波形长什么样才能判断异常的波形哪里不对。另外抓波形之前先把系统层面的配置检查一遍能省掉很多无用功。最后再分享一个小技巧如果手边没有高端示波器可以先用低速模式抓波形确认协议层没问题之后再逐步提高速率看物理层。这样能把问题分离开排查起来更有条理。
返回列表