屏幕闪烁这个问题,做过显示驱动或者硬件调试的兄弟应该都不陌生。现象很直观:要么整个屏幕像呼吸灯一样周期性发暗,要么上下半屏亮度明显不一致,要么刷新时出现横纹、雪花点。很多人第一反应是去改驱动代码里的背光亮度、刷帧率、PWM占空比,折腾一圈发现毫无卵用。真正靠谱的做法,是把示波器探头怼到MIPI DSI的信号线上,看看数据到底是怎么传的。我自己在RK平台上调过好几块屏幕,从7寸RGB屏到1080P的MIPI屏都踩过坑,可以很负责任地说一句:示波器抓MIPI DSI信号,是排查屏幕闪烁问题最直接、最不可替代的手段。
这篇文章我打算完全按实战流程来讲,以RK平台为主要背景,讲清楚怎么用示波器抓取MIPI DSI信号,怎么从波形里判断问题出在哪个环节,以及最常见的几个坑在哪里。适合显示驱动工程师、硬件调试工程师,还有刚接触MIPI接口想系统学习信号抓取的朋友。你不需要有非常深的理论基础,但至少得会用示波器的基本操作,如果还是新手,文中涉及的基础概念我也会顺带解释。
1. 为什么屏幕闪烁必须看MIPI DSI波形
1.1 屏幕闪烁的常见原因分类
屏幕闪烁或者显示异常,原因往往不是单一的。我习惯把可能的问题分成四类:
第一类,代码和配置问题。比如初始化序列不对、刷新率配置错误、背光PWM频率过低、DSI的data lane数量配错,这类问题占了不少比例,但通常通过仔细review代码就能发现。
第二类,电源和电源时序问题。MIPI DSI屏幕一般需要AVDD、DVDD、VCI等多路电源,上电时序如果不对,屏内部逻辑就会处于不确定状态,表现出来的就是闪烁、白屏、花屏。
第三类,信号完整性问题。这一类最隐蔽,也是很多硬件工程师最先怀疑但最不会排查的。DSI信号在PCB走线上传输时,可能会因为阻抗不连续、走线过长、端接不当,产生反射、振铃、过冲,结果就是屏幕上出现随机闪烁、噪点、条纹。这类问题必须用示波器才能看得见。
第四类,EMI和环境干扰。这个比较玄学,但真实存在。比如FPC排线太长又没有屏蔽,系统里的DC-DC开关噪声耦合到DSI信号上,导致眼图闭合,高速传输误码,屏幕上就会间歇性闪一下。
分类的意义在于,它决定了排查顺序。我的习惯是:先快速过一遍代码逻辑和上电时序,排除第一类和第二类明显问题,然后再上示波器,集中精力排查第三类和第四类。因为信号完整性问题你靠肉眼盯代码是不可能盯出来的。
1.2 MIPI DSI信号基础:lane结构与电气特征
要用示波器抓DSI,你得先搞清楚DSI的物理层长什么样。
MIPI DSI使用差分信号传输,一对线就是一条lane,分为时钟lane(Clock Lane)和数据lane(Data Lane)。1条时钟lane加1到4条数据lane是常见配置,比如4-lane DSI就是1条CLK + 4条D0-D3。每一条lane由两根线组成,分别叫Dp/Dn(或者叫P/N),差分电压一般在200mV左右,共模电压在200mV上下。高速传输模式下,每个lane的data rate常见的有800Mbps、1Gbps、1.5Gbps,甚至更高。
DSI的传输有两种状态:HS(High-Speed)模式和LP(Low-Power)模式。HS模式传输真正的像素数据,速率高,信号幅度小;LP模式用于传输指令和总线控制,速率低,信号幅度大,约1.2V。屏幕上电、初始化、配置寄存器时,走的是LP下的指令传输;真正刷图像时,走的是HS高速数据。屏幕闪烁很多情况下就出在这两种状态的切换上,比如LP转HS的切换瞬间如果发生畸变,后面的数据就全乱了。
抓DSI信号,你主要关心的就是HS模式下波形有没有畸变,以及LP/HS切换瞬间是否干净。
1.3 示波器选型:带宽、采样率、探头要求
很多刚入门的兄弟问我,普通100M带宽的示波器能不能抓DSI?我直接说结论:不行,至少会很痛苦。
DSI信号速率是几百Mbps甚至上Gbps。按照经验法则,示波器带宽至少应该是信号最高频率的3到5倍。一个1Gbps的DSI信号,基频是500MHz,你至少得用1.5G带宽的示波器才能看到信号轮廓,要准确测量边沿和眼图,最好是2.5G到4G带宽。采样率方面,至少要有10GSa/s,否则波形细节全部丢失。存储深度也很重要,DSI初始化序列和整帧传输时间较长,存储深度太低采样时间就短,你可能只抓到几微秒的数据,啥也分析不了。
探头方面,DSI是差分信号,最佳方案是用差分探头,带宽至少1GHz,比如常见的S系列探头或者国产几家的差分探头。如果你手里只有单端探头,也不是完全不能用,可以分别捕捉Dp线对地的波形和Dn线对地的波形,再用示波器的数学通道做减法来近似差分信号。但这种方法误差比较大,而且在高速率下容易误判,只能作为应急手段。
另外,示波器探头的地线夹子一定要尽可能短。长地线会引入额外电感,导致测出来的波形上叠加了很多振铃和噪声,你会把好端端的信号误判成信号完整性问题。关于这一点后面专门说。
2. 抓取MIPI DSI信号前的准备:示波器与探头的正确设置
2.1 探头选型与连接技巧
DSI信号抓取的第一步,其实不是打开示波器,而是先想清楚用什么样的探头去接触被测点。
如果你用的是差分探头,连接方式非常方便。差分探头的两个输入端分别接Dp和Dn,探头尖端直接接触焊盘或测试点即可。注意很多PCBA上并没有预留MIPI测试点,这时候你可以用镊子把探头尖端压在背光FPC引出脚的焊盘上,或者在FPC排线的屏蔽层开口处找裸露的走线。实在不行,就在打样的时候让硬件工程师预留一排MIPI测试焊盘,间距建议1.27mm,方便探头接触。
如果用单端探头,连接技巧就更讲究一些。以D0 lane为例,你需要用一个探头接D0P,另一个探头接D0N,两个探头使用同一个参考地,然后在示波器上做A-B数学运算。这里最大的坑是地线的处理,两个探头的接地夹子如果各自走不同路径,地环路就会引入大的噪声。正确做法是,两个探头的地尽量接到同一个测试点附近的地焊盘上,并用尽量短的地线夹。
我个人还有一个习惯,会在抓信号之前先用万用表确认测试点和GND之间没有短路,防止探针不小心戳到电源引脚,烧掉示波器探头。
2.2 示波器关键参数设置
连接好探头后,示波器参数设置直接决定你能不能抓到有效波形。
采样率和存储深度是联动关系。以10GSa/s采样率为例,如果存储深度只有14Mpts,那么最长记录时间是1.4ms。DSI初始化时LP/HS切换非常快,但整帧数据在低速刷屏时可能长达几十毫秒。这时你可以有两种策略:如果只想看HS切换瞬间,存储深度不用太大,把时基设到几十微秒/格;如果想看整帧传输过程中的周期性干扰,就得开最大存储深度,时基放到几毫秒/格,甚至更大。
触发设置是最关键的一步。DSI信号使用差分信号,电平跳变很快,直接用边沿触发很难稳定抓到波形。我建议用脉宽触发或者毛刺触发,先触发在LP到HS切换的那个脉冲上。实际操作中更简单的方法是先把示波器设为自动触发,把触发电平设到LP高电平(约1.2V)的一半,也就是0.6V左右,然后运行自动触发,通常会捕捉到信号。要稳定触发,可以给RK平台设置一个循环输出测试图案的机制,比如每隔一秒刷一次纯红色图像,让波形周期性出现。
在测量参数项里,建议提前打开:频率、周期、峰峰值、最大值、最小值、上升时间、下降时间、正脉宽、负脉宽。这些都跟后面判断信号必不必要重新配置有关。不要贪多,打开七八个就够了,参数越多刷新率越低。
2.3 RK平台侧的准备
示波器这边准备好之后,还要让RK平台处于一个可控的状态。我的做法如下:
首先,确保所用屏幕能够在RK平台上正常点亮并进入系统界面。如果屏幕压根点不亮,你需要区分是供电问题还是DSI通信问题。这时候可以把DSI初始化序列注释掉一部分,观察屏幕是否出现背光亮起但无画面的现象,初步判断通路状态。
其次,强烈建议你在驱动里打开测试pattern功能。RK平台的DSI控制器通常支持test pattern生成,具体在datasheet里有说明,也有一部分是在MIPI DSI驱动调试节点里配置的。测试图案可以是纯色、渐变条、棋盘格,输出这些图案时DSI的信号内容是固定的,方便你在示波器上做稳定的观察。如果没有测试图案功能,也可以用应用程序循环刷新一个纯色画面,效果接近。
另外,在抓初始化序列的时候,需要把内核打印加上,确认初始化时序走到哪个阶段,这样可以对应示波器上的波形段。字符设备节点打开、cmd初始化执行、video流启动,这几个节点在示波器上都应该有明显的波形变化。提前在内核dts中把屏幕参数确认好:lane数量、data rate、hfp/hbp/vfp/vbp等时序参数。拿到这些参数后,你才好反向推算理论上每个lane的UI(Unit Interval,1bit时长)是多少。UI的计算公式很简单:1UI = 1 / data_rate。比如data rate是1Gbps,那1UI就是1ns。
3. 实战抓波:从LP到HS的完整切换过程
3.1 触发思路:如何稳定抓到DSI波形
真正上手抓DSI波形时,最让人抓狂的是示波器屏幕上一片乱码。DSI数据在HS模式下速度很快,而且数据内容高度随机化(虽然物理层有8b-9b编码或DSC编码,但对示波器来说仍是随机跳变),所以边沿触发很难稳定。
我的触发策略分两步:
第一步,先抓低速的LP信号。把时基设到比较宽的范围,比如100us/格到1ms/格,触发放到边沿触发,触发电平设为0.6V左右,斜率设为上升沿。这时候能看到LP脉冲序列,这是初始化指令在传输的过程。稳定抓住这一步之后,说明探针接触良好,示波器设置基本可行。
第二步,再抓HS信号。把时基缩到几百纳秒每格,触发模式改为单次触发(Single),然后在RK平台上手动触发一次画面刷新的动作,比如执行一次截屏命令或者打开某个APP。由于HS突发是周期性的,单次触发后即使波形跳变,屏幕上也保留了首次触发的波形。如果抓不到,就反复按Single按钮并刷新画面,总有一次能逮到。
还有一种非常推荐的触发方式,就是利用时钟lane。DSI的时钟lane在HS模式下持续输出时钟,波形是规则的方波,比数据lane容易触发得多。把探针同时接触时钟lane,用时钟lane的边沿触发,然后把数据lane的波形显示在同一时间轴上。这样你就能稳定看到数据和时钟的对齐关系。
3.2 RK平台屏幕初始化时抓取完整时序的实操步骤
在RK平台上,一次完整的屏幕点亮过程包含:MIPI DSI控制器上电、VDC电源开启、复位时序、初始化指令发送、开启视频流。示波器在屏幕上显示的是一个很长的时域波形。为了抓到这个完整过程,我建议把时基放在5ms/格到20ms/格,存储深度开到最大,然后Single触发,同时去触发系统启动屏幕的过程。
这里有个非常实用的操作技巧:不要从内核启动一开始就去抓,那样数据量太大,示波器根本存不下。RK平台的文档中一般有提到,屏幕初始化的时间点在U-Boot阶段或者内核显示子系统初始化阶段。你可以在代码里加一个udelay(500)之类的延时,或者在初始化函数入口加一个GPIO翻转操作,给示波器一个明确的触发信号。我之前惯用的做法是,把某个不用的GPIO在DSI初始化之前拉高,初始化完成之后拉低,然后用这个GPIO的上升沿当触发源。这样每次都能精确抓到初始化时序段,效率提升了不止一点。
在抓到的波形上,你能清楚看到LP指令期间的脉宽、LP与HS的切换、HS持续的时间等内容。同时用示波器的A/B光标标计量一下LP到HS的切换延迟、HS数据段的长度,对比驱动里配置的时序参数,折算出的时间是否一致。
3.3 测量哪些参数:UI、data rate、电压摆幅、压摆率
抓到HS高速突发的波形后,下一步就是测量关键参数。我平时基本上重点看五样东西:
第一,data rate。从波形上可以数出1UI的实际长度,再用1/UI得到实际data rate,看是否与dts中配置的目标值一致。如果偏差超过5%,就可能因为时钟配置不准导致链路不稳定,屏幕闪烁也就在所难免。
第二,电压摆幅。用示波器的最大值最小值功能,测量D0 lane的摆幅。HS模式下差分电压摆幅一般在140mV到270mV之间,共模电压在100mV到300mV之间。如果摆幅偏低,说明驱动能力不足或走线损耗过大。
第三,压摆率,也就是上升时间和下降时间。这个参数反映信号边沿的陡峭程度。上升时间太慢,说明信号路径电容过大;上升时间太快,又可能带来过冲和EMI。一般建议上升时间在UI时间的20%到40%之间。
第四,单bit波形形状。看波形边沿是否有塌陷、台阶或者双层边沿,这些往往反映出源端阻抗不匹配或接收端反射。
第五,通道间偏移。多条lane之间,同一时刻的数据边沿应该基本对齐,如果某条lane明显偏离,就容易在接收端采样判决时出错,表现为屏幕横向撕裂或闪烁。
把这些参数测出来以后,跟MIPI DSI规范的要求对比,问题基本就有方向了。以后你抓得多了,一看波形形状就能猜出八九不离十。
4. 波形分析:从异常波形反推闪烁根因
4.1 正常DSI波形长什么样
先说说正常的波形。用示波器抓时钟lane的HS模式波形,理想情况下是一个规则的方波,高低电平清晰,边沿陡峭,没有明显过冲和振铃。用ZUI(Zoom In)放大单个bit,可以看到波形单调地从一个电平过渡到另一个电平,没有回勾、没有多级台阶。
如果示波器支持眼图模式,用时钟恢复功能可以显示数据lane的眼图。正常的眼图应该有一个清晰张开的大眼睛,交叉点稳定,上下眼皮干净,没有雾状发散。眼图张开度越大,误码率越低。判断标准比较简单:眼睛的高度越高越好、宽度越宽越好,交叉点占bit周期的比例在50%附近最好。
如果是4-lane DSI,你可以用示波器的4个通道同时测量CLK、D0、D1、D2,剩下的D3分两次测。然后观察lane之间的时序关系。正常状态下,各个lane的HS突发应该同时开始、同时结束,并且数据边沿的抖动不至于偏差太大。
4.2 常见异常波形图鉴与对应问题
根据我自己遇到过的情况,异常波形大致可以分成五类,每一类的背后原因都不一样。
第一类:过冲和振铃。波形上升到高电平后有一个明显的凸起,然后振荡几圈才稳定。这通常说明信号路径存在阻抗不连续或者源端阻抗失配,最常见原因是PCB走线过长、过孔过多、或者DP/DN走线没有做等长。过冲太大容易击穿接收端输入级,或者导致误判电平,进而闪烁。解决办法是优化走线阻抗,或者在源端串联22Ω到33Ω的电阻,降低振铃。
第二类:波形塌陷。边沿上升过程中出现明显的平台,像台阶一样,信号先上升到一个中间电平再继续上升。这种情况往往是因为走线存在短路到地的路径,比如FPC排线压伤、虚焊,或者PCB过孔残桩。还有一种可能是示波器探头的负载效应太大,导致信号被拉低,这时候要更换更低电容的探头。
第三类:单个bit宽度不一致。同一段高速突发的波形,有些bit看起来宽有些窄。这说明数据源端的时钟不稳定,或者PLL没有锁定好。在RK平台上,如果你改过时钟配置,要重点检查PLL的VCO频率是否超出了合法范围。
第四类:LP/HS切换毛刺。在LP转HS或者HS转LP的瞬间,波形出现一个非常大、非常窄的尖峰毛刺。这个毛刺可能导致接收端的LP检测逻辑误判,从而在画面切换时出现瞬间闪烁。比如RK平台每次开机点亮时闪一下,很可能就是这个问题。这类毛刺也容易通过FPC耦合到背光控制线,造成背光闪烁。
第五类:某一根lane的信号幅度明显低于其他lane。4条lane里D0正常、D1正常、D2波形只有其他的一半。这反映的是第2条lane的走线阻抗异常、端接电阻贴错位置或屏幕内部短路。如果只有一个lane信号异常,屏幕显示出来的问题可能不是闪烁,而是花屏或者特定颜色不对。
4.3 用波形分析定位"闪烁"的过程:一个RK平台实测案例
讲一个我自己印象很深的案例。RK3399平台上点亮一块1080P的MIPI屏幕,现象是屏幕上半部分每隔几秒会轻微闪一下。看起来像是电源纹波,但用示波器测量各路电源,纹波都不高,背光也很稳定。于是我把探头接到了D0 lane,发现数据lane的波形正常,再接D1,还是正常,接D2的时候,发现上升沿后面跟着一个明显的振铃,幅度甚至超过了正常摆幅。
顺着这条线索,我检查硬件走线,发现D2 lane从主控到连接器之间走线出了名堂:跨过了一个分割的地平面,走线换层位置刚好有一个大电流电感在底下。信号经过这个地方时,阻抗突变,产生了反射振铃。更麻烦的是这个振铃的频率正好和屏幕刷新频率有某种拍频关系,所以就表现出间歇性闪烁。
处理办法也简单,PCB改板时把D2 lane换到完整的参考平面,并且在源端串联33Ω电阻吸收反射。但在改板期间,我用了示波器确认振铃主要来自某个位置的反射,于是在软件层面临时把D2 lane的驱动强度从高驱降到低驱,振铃幅度明显下降,闪烁频率降低了,至少不再影响日常使用。这个案例说明,先把问题波形抓到并确认是信号完整性导致的,再去决定是改硬件还是改软件,这个顺序非常关键。
5. 排查技巧与工具心得(含示波器杂学)
5.1 抓信号抓不住的常见原因与避坑清单
这里整理一下我在实践中踩过的坑。抓DSI信号抓不住,无非下面几个原因:
一是示波器带宽不足。带宽超过信号频率就会把信号的高频分量滤掉,你看到的波形迟钝、摆幅偏低,上升时间变长。如果此时去判断时序比如tRise和tFall,结论没有任何意义。
二是探头地线太长。普通示波器探头标配的地线是一根约15厘米长的带夹引线,这根线在数百MHz频率下电感效应非常大。它的存在会把信号的真实边沿搞出额外的振铃,多数情况下看起来就像信号质量问题。所以抓DSI时,地线越短越好,最好是探头尖端的接地弹簧,把地直接连在探头尖端附近的参考地。
三是触发位置不对。前面讲过的,用数据lane边沿触发抓高速数据是极其不靠谱的。建议要么用GPIO触发,要么抓时钟lane。如果临时没有GPIO信号,还可以试试示波器的串行总线触发功能,如果示波器支持MIPI DSI协议触发,那就更省心。
四是示波器采样率不够导致的假波形。10GSa/s是底线,如果只有5GSa/s甚至2GSa/s,波形会严重混叠,出现完全不存在的高频振铃。这种情况下,先别怀疑硬件,先怀疑示波器设置。
五是忽略了探头的衰减比设置。抓到波形后如果发现幅度只有正常值的十分之一,先看一下探头是不是打到X10档但示波器通道设成了X1。这种低级错误很常见,亲手就能排查。
为方便速查,我把抓取失败现象与调整对策整理成了一个小表。
| 失败现象 | 可能原因 | 调整方向 |
|---|---|---|
| 完全没有波形 | 探头接触不良或触发条件太严格 | 检查连接,改成Auto触发 |
| 波形幅度偏大偏小 | 探头衰减比设置错误 | 确认探头档位和通道档位一致 |
| 波形有大量高频毛刺 | 地线太长或带宽/采样率过度衰减 | 缩短地线,检查示波器带宽参数 |
| 波形边缘呈圆角 | 带宽不足 | 换更高带宽示波器或探头 |
| 触发不稳定、波形乱跳 | 触发源选择和阈值不合适 | 换成GPIO触发或时钟lane触发 |
5.2 进阶技巧:XY模式看李萨如波形、仿真工具辅助
除了常规的时域测量,示波器本身还有一些值得玩味的功能,对调试MIPI DSI也有帮助。
一个是XY模式。把两个信号分别接到CH1和CH2,再切换示波器的显示模式为XY,这时屏幕上不再显示波形而是显示两个信号的相位关系图,也就是李萨如图形。虽然DSI数据信号本身随机跳变,不适合用XY模式做精确测量,但如果你需要快速判断两个时钟信号(比如DSI时钟和系统参考时钟)之间的相位关系,XY模式非常直观。如果有朋友看到示波器上显示李莎莎信号这个说法,其实指的就是李萨如,拼音输入法的锅,实际用途就是这。
再一个是把示波器波形导出为CSV。很多示波器支持将采集到的波形数据以CSV文件保存到U盘。你可以在PC上用Python的matplotlib等工具重绘波形,并做一些自动化的参数分析。比如批量计算每个上升沿的宽度、每两个边沿之间的间隔,省去在示波器上手动光标测量的繁琐步骤。之前我写过一个自动化脚本,从CSV文件上自动识别HS突发段的起始位置并计算总时长,大大提升了复现问题的效率。
另外,multisim和proteus这类仿真软件,在MIPI DSI信号分析上虽然不能完全替代真实示波器,但在学习阶段用来模拟信号完整性问题很有意思。你可以用它们搭一个简单的差分信号传输链路,调整电路参数观察波形变化,对理论理解帮助很大。不过真要定位屏幕闪烁,还是手里那台真材实料的示波器最靠谱。
5.3 RK平台显示调试的综合排查策略
最后把RK平台上排查屏幕闪烁的综合策略梳理一遍。示波器抓波形不是孤立的,而是一个联合排查过程的最后一环。
第一步,查看内核日志和驱动状态。RK平台文档中提供了debugfs节点,可以查看MIPI DSI当前工作状态、lane配置、data rate、video模式等信息。检查有没有link training失败、CRC错误之类的报错。这些信息在示波器之前就能暴露一大半问题。
第二步,确认屏幕供电电压和上电顺序。用示波器或万用表测量AVDD、VCI等电压波形。如果上电时序有误,跟代码中配置的时序要求对比,及时调整。
第三步,用示波器抓DSI信号。上面讲的方法都集中在这一步。
第四步,联合分析。很多时候闪烁不是单一原因,而是一果多因。比如DSI信号U点张开度不足,同时背光PWM频率正好落在人眼敏感区,那么即使信号质量只是轻微劣化,也会引发明显闪烁。这时就需要在软硬件两个方向同时做调整,比如优化PWM频率到20kHz以上,同时改善DSI信号质量。
如果你手头有条件,还可以参考热词里提到的EMMC HS400模式实测时序的方案。EMMC HS400和MIPI DSI的抓取原理是相通的,核心都是找对触发源、测量电平、分析眼图。能把MIPI DSI抓明白,再去看EMMC的时序,上手快得多。
另外多说一句,示波器本身的接地和电源质量也会影响测量准确性。尤其是普通两插电源供电的示波器,可能会受到系统其他设备的地环路干扰。在需要精确测小信号时,建议示波器用隔离电源或者接一个干净的电源插排。我见过不少奇怪的测量波形,最后发现干扰来自示波器自己的地环路。
我个人现在做RK平台屏幕调试,已经形成了固定套路:驱动代码过一遍、上电电压测一遍、DSI差分波形抓一遍、必要时眼图再来一遍。四步走下来,闪烁问题十有八九能找到根。最后再跟新手朋友说一句:示波器不只是用来修板子的工具,它更像是你和信号之间对话的桥梁。花点时间把探头、触发、参数测量这些基本功练扎实,以后遇到屏幕闪烁、触摸乱跳、内存不稳这些问题,都会比旁人淡定很多。