干显示调试这行的,很多人RGB屏、LVDS屏调得飞起,但一碰到MIPI屏就卡壳。说白了,MIPI DSI并没有你想象的那么玄乎,它就是把并行数据串行化,再加入一套完整的链路控制协议。但点屏这件事,坑从来不在协议本身,而在参数到底怎么算、初始化序列怎么给、供电时序怎么控,以及黑屏之后你用什么思路去排查。
这篇文章我按实际调试顺序来讲,从拿到一块MIPI屏的规格书开始,到算时序、写设备树、移植初始化代码、上电抓波形,最后到画面稳定显示。整个过程基于我在海思平台(尤其是Hi3798MV300/MV310这类盒子方案)上的实际经验,大部分内容在其它Linux/Android平台上同样适用。如果你是第一次点MIPI屏,或者已经点了但一直花屏、闪屏、偏移,这篇文章应该能帮你少走很多弯路。
1. 点屏前的准备:先理清四件事
很多新手拿到一块屏,直接就在驱动里填参数,填完发现没反应,就开始怀疑IC、怀疑屏、怀疑人生。我的习惯是:动手改代码之前,先把四件事弄清楚。
1.1 从屏规格书里拿到这几张“底牌”
第一件事是确认接口类型。MIPI DSI和MIPI CSI虽然都叫MIPI,但一个是显示接口、一个是摄像头接口,协议层的东西完全不同。曾有同事拿着摄像头接口的屏硬往DSI控制器上接,折腾了三天,最后仔细看规格书才发现自己搞错了方向。这种低级错误在项目紧张的时候最容易犯,因为大家都默认屏就是显示接口,很少有人会专门去核对规格书第一页的接口说明。
第二件事是确认Lane数量。常见的有1-Lane、2-Lane、4-Lane,也有8-Lane的,但消费类屏上少见。Lane数量直接影响你后面算时钟。规格书上一般会写“4-Lane DSI Interface”或“2 data lanes + 1 clock lane”,也有用示意图表示的。这个信息千万别猜,错了的话要么带宽不足、要么驱动配置不匹配。
第三件事是确认分辨率和刷新率。这两个参数直接决定像素时钟和DSI时钟。比如1080P@60Hz,和1080P@75Hz,计算出来的链路速率差很多,而链路速率是你在驱动里最核心的一个参数。另外,有些屏规格书里写的是“Frame Rate 55~65Hz”,这种情况下建议取中间值60来算,不要直接拉满,留点裕量。
第四件事是确认屏的供电电压和背光类型。MIPI屏一般需要多个供电轨,比如IOVCC(1.8V/2.8V)、VCI/VCC(2.8V~3.3V),有些还需要VSN、VSP。背光常见的有LED恒流驱动和LED升压驱动两种,前者你只需要给PWM信号,后者还需要配置升压芯片。这一步决定了你的硬件原理图是否支持这块屏,也决定了设备树里GPIO、PWM、电源节点的初始值。
1.2 调试环境和工具,别等到黑屏才想起
调MIPI屏最怕什么?最怕板子已经打样回来了,你才发现示波器带宽不够、串口终端没拉出来、打印口根本没接。我在项目启动前会提前准备好三样东西:
一是串口调试终端。串口日志是点屏调式里最重要的信息源。海思平台一般在bootloader阶段就会初始化串口,系统起来后也可以随时打开串口终端看内核打印。你改的每一版本设备树、驱动参数,都可以通过打印信息确认是否生效,比如“parse lcd panel params fail”这类关键错误信息。
二是示波器或逻辑分析仪。MIPI信号是差分信号,时钟频率动辄几百MHz甚至上千MHz,普通100MHz的示波器根本抓不到有效波形。我在实际调试中一般用500MHz以上的示波器配合差分探头。如果你实在没有差分探头,至少也要有一根接地弹簧比较短的单端探头,把探头地线尽量缩短,去测量CLK通道的单端波形。注意:这种方法只能算“能看个大概”,不能作为正式的信号质量验收手段。
三是点亮代码的基准参考。如果是拿到了原厂或者代理商提供的例程,先别急着改,把原始配置完整跑一遍,确认屏能亮,再去做裁剪。如果没有任何参考代码,那就需要你自己从0开始,这考验的是对时序、初始化序列、控制器寄存器三者的理解。
在这里我的建议是:做完这三项确认,再进入参数计算。跳过这些步骤直接写代码,后续遇到的绝大多数怪问题,回头查根因都是信息缺失或者工具不到位。
2. MIPI DSI时序与时钟参数计算
这块是整个点屏过程的核心,也是“看起来最简单、实际最容易出错”的部分。很多人直接把屏幕规格书里的时序参数抄进设备树,结果屏幕要么不亮、要么闪烁、要么画面偏移。为什么?因为DSI接口的时序不是你想填什么就填什么。
2.1 Video模式下的水平垂直时序长什么样
先摆一组概念:MIPI DSI工作模式分Command模式和Video模式。Command模式本质上是把屏幕当成内存,主控往显存里写数据,屏幕自己刷新;Video模式则是主控持续不断地把像素数据流发送给屏幕,屏幕边收边显示,这时时序结构就很重要了,因为屏幕端需要恢复出一个连续的、类似VGA接口的同步信号。
在海思平台这类Linux/Android方案上,电视、显示器用途的屏幕基本都是Video模式。Video模式下的时序由以下几个参数组成:
- HACT:有效像素,比如1920。
- HSA:水平同步信号脉宽。
- HFP:水平前沿,即同步信号结束到有效像素开始之间的时间。
- HBP:水平后沿,有效像素结束到下一个同步信号开始之间的时间。
- VACT:有效行数,比如1080。
- VSA、VFP、VBP:对应的垂直同步脉宽、垂直前沿、垂直后沿。
屏幕端会根据这些参数恢复出HSYNC、VSYNC、DE信号,然后逐行扫描点亮面板。所以这些值不是随便写,每一家面板厂商在规格书里都会给出一个“推荐值”,你按推荐值来,通常没有问题。但问题往往出在:你已经按推荐值填了,屏幕还是不正常。这时候就要检查DSI协议层自身的开销有没有被考虑进去。
2.2 像素时钟和Lane速率,用一个例子全部算明白
以一块常见的1080P(1920x1080)@60Hz、4-Lane、RGB888的MIPI屏为例。
第一步,算像素时钟。像素时钟的公式是:
PixelClock = (HACT + HFP + HBP + HSA) * (VACT + VFP + VBP + VSA) * FrameRate如果规格书给出的水平时序是:HACT=1920、HFP=88、HBP=148、HSA=44,那么水平总周期就是 1920+88+148+44=2200。垂直时序如果给的是:VACT=1080、VFP=4、VBP=36、VSA=5,那么垂直总周期就是 1080+4+36+5=1125。
PixelClock = 2200 * 1125 * 60 = 148.5MHz。这个值眼熟吧?这就是标准1080P@60的像素时钟。
第二步,算DSI链路速率。Video模式下,像素数据是24bit/像素(RGB888)或者是18bit(RGB666)。你可以这样理解:主控要把每个像素的24bit数据拆分成串行数据流,通过Lane一条条发出去。所以DSI时钟的关键公式是:
DsiBitClock = PixelClock * BitsPerPixel / LaneCount代入上面的例子:148.5MHz * 24 / 4 = 891Mbps。也就是说,每个数据Lane需要跑在891Mbps的速率上。
这里有个非常常见的错误:有人直接用1920108060,而没有把消隐区(HFP、HBP这些)算进去,得出约124.4MHz的像素时钟,再算出约746Mbps的Lane速率。这个速率对不对?如果驱动里按746Mbps去配,实际可能也能勉强亮,但会出现一种很隐蔽的症状:画面偶尔闪烁、或者屏幕上下边缘有杂线,因为在帧与帧之间、行与行之间的消隐区里,数据量不够了,接收端时序恢复得就不稳。
第三步,把速率转换成寄存器值。一般驱动里不会直接填Mbps,而是填写一个“bit clock”或者“byte clock”值,具体计算公式各平台略有差异。以海思平台的经验为例,驱动里配置的DSI时钟通常是在这个计算的Lane速率基础上,加上一定余量后再换算成对应的寄存器。有些方案里直接给出文本形式的时序参数,比如“64, 1920, 88, 148, 44, 1080, 4, 36, 5”这种格式,此时你只要保证这9个数和你算出来的时序一致就行。
2.3 水平消隐参数:为什么不能照搬RGB屏的值
这部分是真正的“经验区域”。很多工程师从RGB屏或者LVDS屏转过来,第一反应是“把规格书的HFP、HBP原样填进去就行”。这在RGB接口上是对的,但在MIPI DSI Video模式下不完全是。
原因是DSI链路本身有协议开销。每一行数据在链路上传输时,并不是只传有效像素,还会附带包头(Packet Header)、ECC校验、CRC校验、包尾(Packet Footer)等。如果HFP或HBP太小,链路就没有足够的时间把这些附加信息塞进去,会出现“带宽瞬间不够”的情况。
业界有一个常用的经验值:在Video模式下,HFP和HBP各需要满足最小字节数。具体数值由DSI规范中的“burst mode”和“non-burst mode”决定,最小一般是Packet Header(4字节)+ Packet Footer(2字节)+一些时间余量,折合成字节数后,通常要求是一行内至少有足够时间发送4个Packet的最小同步包。我实际调试中,会在规格书给出的HFP、HBP基础上,尽量保持规格书推荐值不变;如果规格书没给,或者给了之后发现屏幕闪烁,我可以尝试把HFP和HBP相对调大,比如HFP加到100~120,HBP加到160~180。
这里还要区分是否开启了Burst Mode。如果屏支持Burst Mode,DSI时钟可以比像素时钟低,因为可以在消隐区“暂歇”,用突发方式快速把数据发完;如果不支持Burst Mode,DSI时钟必须高于像素时钟,否则带宽不足。所以在看驱动代码时,看到有个burst mode标志位的时候,你要结合屏规格书确认它到底支不支持。这个坑我踩过:把一块不支持Burst Mode的屏强行启用了Burst Mode,结果是屏幕亮了一部分,剩下部分是雪花。
总结一下,参数计算的正确顺序应该是:
- 从规格书确认Lane数、分辨率、刷新率、RGB格式。
- 算出包含消隐区的像素时钟。
- 根据Lane数算出DSI链路速率。
- 对比规格书里建议的DSI速率(有些规格书直接写最大速率,有些写最小速率),确保计算值在范围内。
- 把水平垂直时序参数转换成平台驱动的格式,填进去。
3. 驱动侧适配:设备树、初始化序列和背光
参数算完,就该动代码了。海思平台通常采用标准Linux内核加Android系统,显示链路一般走DRM或海思自研的HDMI/LCD框架。无论哪种框架,你的核心任务三件事:设备树节点、初始化序列、背光与供电。
3.1 设备树里怎么声明一块MIPI屏
设备树是硬件配置和驱动之间的“桥梁”。海思平台一般会在项目的dts目录下根据单板型号定义显示节点。假设你用的一颗ST7701S控制IC的屏,设备树里典型的结构是:
&dsi { status = "okay"; compatible = "hisilicon,hi3798mv300-dsi"; panel@0 { compatible = "realtek,st7701s"; reg = <0>; reset-gpio = <&gpio 12 GPIO_ACTIVE_LOW>; pwr-gpio = <&gpio 14 GPIO_ACTIVE_HIGH>; backlight = <&backlight>; port { panel_to_dsi: endpoint { remote-endpoint = <&dsi_to_panel>; }; }; }; };这里面有两点容易忽略:
一是compatible的值不是随意取的。它必须和驱动里of_match_table里匹配的字符串完全一致,否则内核根本找不到驱动来绑定这个panel。很多“点不亮”的问题,其实底层原因就是这个字符串对不上,内核直接忽略了面板节点。
二是GPIO的方向和有效电平。reset-gpio、pwr-gpio的控制方向必须正确,有效电平必须和原理图一致。有些硬件上复位是高有效,你在代码里却配成低有效,那面板一直在复位状态,任何初始化序列都白搭。
如果你的平台不用DRM框架,而是用海思传统的LCD/TVO框架,设备树会变成另一套写法,一般会有fb或disp节点,然后通过lcd_panel这类子节点来声明timing。这种情况下,你需要把第2节算出来的HFP、HBP、HSA这些值直接填到display-timings里。
3.2 初始化序列(Init Code)移植
MIPI屏的初始化序列,本质上是一串寄存器配置命令,由主控通过DSI接口以命令包的形式发出去。屏拿到命令后,内部的控制IC会配置好扫描方向、电压偏置、伽马曲线、分辨率等寄存器的值。
常见的初始化序列格式是:
static struct dsi_cmd_desc st7701s_init_cmds[] = { {0x01, 1, 0x00, {0x00}}, // 0x01: Generic Short Write,1个参数 {0x11, 0, 0x00, {0x00}}, // 0x11: 退出休眠 {0xFF, 5, 0x01, {0xFF, 0x77, 0x01, 0x00, 0x00}}, // 厂商自定义命令 ... ... };在STM32等MCU平台写串口屏程序时,你见到的类似方式,在MIPI屏上也是相似的思想。只不过MIPI命令包还有更细的分类:DCS Short Write(0x05)、DCS Long Write(0x39)、Generic Short Write(0x02/0x03)等。每一家屏厂给的初始化序列文件里,通常会标明每条命令的类型,你移植的时候需要把类型一并保留,不能只填命令和数据。
这里我想重点强调一个实操中的习惯:不要一次性把所有初始化命令全部手动录入,而是应该先找代理要一份该IC的标准初始化文件,最好是文本格式。如果只有打印出来的PDF或者截图,那就需要一个个手动输入,这时候特别容易漏命令、输错值,而且排错极其痛苦。我印象里有一次排查一块屏的色偏问题,查了半天,最后发现是初始化序列里的一个0x02写成了0x00,导致某个电压档位完全不对。
初始化序列移植完成后,还有一个小细节:很多屏要求退出休眠模式(Sleep Out,命令0x11)后,需要延时120ms再开显示(Display On,命令0x29),之后才能开背光。这个延时大于屏规格书要求的典型值(一般是120ms),我在实际中习惯把两个命令之间留更大余量,比如延时150ms,避免某些屏因为上电时序偏紧导致启动异常。
3.3 供电和背光时序,决定你是黑屏还是暗屏
屏幕亮不起来,很多人首先怀疑参数,其实供电和背光时序出问题的概率更高。这个好理解:面板的各个电源轨如果上电顺序不对,初始化命令发过去屏根本不理你;背光如果没开,那即使显示内容完全正常,你看到的也只是一块黑屏。
以常见的MIPI屏为例,典型的上电时序是:
- 打开IOVCC(IO电源),延时5~10ms。
- 打开VCI/VCC(主电源),延时10~20ms。
- 拉高复位引脚或者给一个低脉冲复位信号,保持至少10ms。
- 延时120ms以上(不同屏要求不同)。
- 发送初始化序列(包括Sleep Out)。
- 等待120ms后再发Display On。
- 最后打开背光。
这个顺序不能乱。我在调一个项目时就遇到过:主控本身的初始化代码完全没有问题,但背光电源是由屏的AVDD引脚同时控制的,导致复位完成后屏还没有完全启动,背光就已经亮了。表面上看是“有背光无画面”,实际上是背光被过早开启,屏内部逻辑可能还在复位,等你发初始化序列时根本无法响应。
在设备树上怎么体现这些时序?一般会在驱动探针函数里,按顺序请求GPIO和regulator,然后通过gpiod_set_value、regulator_enable、msleep来控制。有些平台会专门封装一个panel_simple_probe,只要你把设备树里power-supply、reset-gpios、enable-gpios、backlight这些节点写对,驱动框架会自动按顺序执行。如果用的是这类通用驱动,你要特别注意它内部的时序是否和你屏的规格书一致,不一致的话必须要做适配,不能硬套。
4. 从点亮到稳亮:实操流程与微调技巧
参数对了,设备树也写了,初始化序列也移植完了。但第一次上电,通常不会那么顺利。下面我把实际操作流程完整地过一遍,包含首次点屏的步骤和后续微调的技巧。
4.1 首次点屏:先出画面,再谈画质
第一次上电前,我建议进行一次全面检查,重点是:
- 串口是否连接好,能实时看到内核日志。
- 设备树是否有语法错误,可以用
fdtdump或dtc工具反编译确认。 - 面板的reset管脚是否是默认状态,避免屏在上电时处于不确定的复位状态。
- 背光是否设置了默认关闭,避免一上电就点亮。
上电后,第一步看串口日志。如果内核成功探测到panel,一般会打印类似panel-simple: probe successfully的信息。如果没有任何panel相关日志,优先检查设备树节点是否被正确加载。
第二步是确认DSI链路是否训练成功。链路刚建立时,主控和屏之间是有协商过程的,在日志里可能体现为D-PHY:lane0 lane1 lane2 lane3等初始化信息。如果链路训练失败,日志里会有明确的错误提示,比如DSI LINK ERROR、wait dsi phy ready time out。这种错误出现时,不要怀疑初始化序列,要优先查硬件连接、供电和时钟频率。
第三步是发送初始化序列并观察。如果一切正常,屏幕上应该会出现内容。第一次点亮的时候,屏幕上哪怕有杂色、条纹,对我来说都是“巨大成功”——因为链路通了,剩下的事情就是参数微调。
如果全黑,但有背光,那就是显示数据根本没有从主控端发出去,或者屏端没有正确接收。如果连背光都不亮,先查背光使能GPIO和PWM配置,这比查显示参数更优先。
4.2 画面偏移、闪烁、条纹怎么调
第一块屏亮了之后,真正的“调屏”才刚刚开始。最常见的三个问题是画面偏移、闪烁、条纹。
画面偏移,从用户视角看是图像整体向左或向右偏了一截,右侧或左侧会出现一条黑边或“拖影”。这基本是HFP、HBP设置和屏幕实际接收到的时序对不上。解决办法是精确地增大或减小HBP、HFP。有个技巧:图像整体左移,就增加HBP;整体右移,就减小HBP或者增大HFP。这个方向关系建议你自己在平台上测试两到三次后形成肌肉记忆,因为不同DSI控制器实现上可能略有差异。
闪烁,这个原因比较多。如果是一阵一阵的闪烁,优先检查VSYNC和DSI时钟是否稳定,可以考虑把DSI链路速率提高一点,或者在驱动中开启帧率自动适配。如果是某个固定区域闪,可能是初始化序列里的伽马或者电压设置不对。如果是整个屏幕微闪,特别是在低亮度场景,那基本是背光PWM频率太低,或者PWM的占空比分辨率不够。背光PWM频率一般建议至少1kHz以上,否则人眼能感知到闪烁。
条纹,常见的是“水波纹”或者“雪花点”。水波纹大多是EMI问题,表现在屏幕上有规律的横条纹,这种情况优先优化硬件上的走线和地平面,或者调整DSI的驱动电流、压摆率参数。雪花点一般代表数据传输不稳,优先检查Lane速率是不是超出屏的极限,或者时钟通道的信号质量差。某些平台上可以调整DSI PHY的厂商寄存器来改善信号质量。
4.3 竖屏改横屏、分辨率切换这类特殊需求
项目做久了你会发现,屏幕规格书只是起点,最终需求往往带着各种“魔改”。比如产品要做竖屏显示,但手头只有一块横屏规格的面板;或者外形结构变了,需要把画面旋转90度;又或者同一主板要兼容两个分辨率不同的屏。
竖屏改横屏,如果是MCU类的小屏,很多时候靠的是初始化序列里的扫描方向寄存器。比如ST7701S这类IC,寄存器里一般有设置扫描方向的位段,改一下初始化序列就能实现GS/SS方向的切换。但如果是在DRM框架下,更推荐用panel驱动里的drm_panel接口,配合drm_panel_orientation_quirk属性在设备树里声明屏幕方向,让系统统一做旋转。这样做的好处是Android的SurfaceFlinger和HDMI输出的方向都能保持同步,而不是只改了屏幕输出。
分辨率切换,如果你同一块主板要兼容720P和1080P两块屏,一般有两种做法:一是准备两套设备树,通过硬件拨码或者eFuse区分;二是在驱动里通过读取某个GPIO或I2C设备ID,运行时选择不同的timing参数。第一种做法最简单可靠,但维护成本高;第二种做法灵活,但要求你的驱动框架支持动态切换。在海思平台上,我更推荐第一种,因为内核设备树本身就是给你做单板配置管理用的,强行在驱动里搞多分辨率适配,后期容易出各种“我这个版本没编译进去”的问题。
5. 黑屏花屏闪屏排查速查与避坑心得
最后这部分,是板子上墙、项目追得紧的时候,我最依赖的一份排查清单。我把常见问题按现象分类整理成表格,再补充一些常规手段之外的“活经验”。
5.1 常见问题排查清单
| 现象 | 可能原因 | 排查顺序与方法 |
|---|---|---|
| 全黑、无背光 | 背光电源、PWM、GPIO配置错误 | 先量背光供电电压,再查PWM是否有波形,最后查使能GPIO电平 |
| 全黑、有背光 | 显示链路未建立、初始化序列未执行、屏没有退出睡眠 | 先看串口日志有无panel probe失败,再确认初始化命令是否发送成功,最后检查Sleep Out/Disp On是否执行 |
| 白屏 | 屏没有收到有效视频数据,或者收到数据格式错误 | 查看DSI链路速率配置、色彩格式(RGB888/RGB666),用示波器看CLK是否有连续时钟 |
| 画面偏移 | HFP/HBP时序不一致 | 调整水平时序参数,左右移动画面确认方向 |
| 花屏/雪花 | 链路信号质量差、Lane速率过高 | 降Lane速率或降低DSI时钟,检查PCB走线,必要时调整PHY驱动电流 |
| 固定区域颜色异常 | 初始化序列寄存器配置错误 | 对照IC数据手册,逐条核对初始化序列里的电压、伽马、扫描设置 |
| 闪烁 | 背光PWM频率过低、帧率不匹配、DSI时钟不稳 | 提高PWM频率到1kHz以上,确认像素时钟与刷新率匹配,给链路速率留5%-10%余量 |
| 内容上下颠倒/左右反转 | 初始化序列扫描方向配置与需求不一致 | 修改IC的扫描方向寄存器,或通过DRM orientation属性 |
| 灰屏 | 信号源端或屏端欠压、初始化序列执行了一半 | 用示波器量AVDD、IOVCC电压,检查上位机发送的初始化序列是否有命令被平台过滤 |
这张表我每次开会都要用,因为团队里的新人遇到问题总是喜欢闷头猜,而不按排查顺序操作。其实百分之八十的问题都集中在供电、背光、时钟、参数这四类。
5.2 我用得最多的几个调试手段
串口日志是第一手段。在海思平台调试时,我会在驱动里无保留地开相关的打印,比如panel probe的返回值、初始化命令的发送状态、PHY的配置值。内核启动阶段的信息非常关键,建议调试期间关闭内核的quiet输出,确保所有信息都进串口。
第二个手段是示波器实测。很多人一上来就抓Data Lane的数据波形,这其实很难分析,因为你不知道每一bit代表什么。我建议先抓CLK Lane:如果是连续时钟模式,CLK波形应当是连续的方波或正弦波,频率大约等于DSI Bit Clock的一半;如果时钟停了或者频率不对,那问题一定在主控侧,而不是屏侧。等CLK波形正常了,再慢慢看Data Lane。示波器带宽不够时,哪怕只能看到波形“有”,也比什么都没有强。
第三个手段是devmem或者io_read。在系统起来之后,直接读取DSI控制器相关寄存器的值,和驱动里配置的预期值对比,能快速判断驱动有没有写进去。比如链路的实际时钟分频、lane数量配置、时序寄存器,都能通过寄存器读出来。这比加printk重新编译内核快太多了,尤其是在每次编译要几分钟以上的方案里。
第四个手段是“照片大法”。当屏幕显示内容不对时,用手机拍一张屏幕照片,拿到电脑上放大看。很多条纹、偏移、缺色问题,在动态画面下很难判断,但静态照片能让你看清像素级的故障。这个土办法帮我发现了好几次初始化序列色彩格式不匹配的问题。
避坑提示:调试期间不要一上来就开背光,全程保持背光点亮会掩盖掉很多上电时序问题。我习惯先把背光关闭,确认无背光时画面数据链路正常了,再开背光做最终验证。这样黑屏和有背光黑屏很容易区分。
写在最后
MIPI屏调试这件事,说难也难,说简单也简单。难的是它把硬件、驱动、协议、数据结构串在了一起,任何一个环节有问题都会表现为“屏幕点不亮”,排查链路很长。简单的是,只要你把供电时序、DSI时钟计算、初始化序列、水平垂直时序这四个环节逐一验证过,剩下的大多数异常都是这三个方向的问题之一。
我自己这几年调过的屏里,最折腾的一块其实不是海思平台,而是某个MCU直驱的小尺寸MIPI屏。当时因为MCU的DSI控制器能力有限,计算出的Lane速率刚好卡在屏规格的上限附近,怎么调都是偶发花屏。最后我选择主动把刷新率从60Hz降到55Hz,画面稳定了。这个项目给我最大的教训是:参数计算不能只满足数学公式,还要留出足够的工程余量,不管是时钟、时序还是供电,都不能“算得刚刚好”。
最后再多说一句:如果你手上也有一块MIPI屏正在调,先不要急着怀疑屏坏了。拿示波器测一下CLK有没有输出,拿万用表量一下各路电源电压有没有到位,再查串口日志里驱动有没有正常加载,这三步走完,问题基本能缩小到一半以上。剩下的就是耐心的逐项验证了。