☰
MIPI LP CD 调试全指南:从电平时序到 FPGA 实现
2026/10/1 8:58:58 网站建设 项目流程

做嵌入式显示调试这几年,MIPI DSI 接口的坑我踩了不少。最容易被忽略的,往往不是高速数据误码,而是低速状态下的那点控制电平。MIPI LP CD 这三个词放一起,字面意思是低功耗模式下的 Clock/Data,但实际调试中,它代表的是从屏幕初始化到每一帧画面刷新,所有低速控制时序和通道映射问题的集合。无论你是做 RK3588 Linux 适配,还是用 FPGA 去推一个 ST7701S 的屏,只要碰到点不亮、横向花屏、睡眠唤醒失败,问题大概率都要回到 LP 和 CD 这两个关键词上。

这篇文章我想把 MIPI LP CD 从概念、测量方法、故障定位到 FPGA 实现,完整串一遍。内容不绕弯,直接按我平时调屏的顺序来。适合刚接触 MIPI 的驱动开发者,也适合被各种疑难杂症折磨过、想系统排查一遍的老手。

1. 先拆概念:MIPI LP 和 CD 到底在说什么

1.1 LP 不是省电模式,而是物理层的“低速控制挡位”

MIPI D-PHY 是 MIPI 联盟定义的一种物理层标准,在显示和摄像头上用得最多。它内部定义了两套完全不同的工作模式:High-Speed,也就是 HS 模式,用低摆幅差分信号高速传批量数据;Low-Power,也就是 LP 模式,用单端方式传输低速控制信号。很多人一听 LP 就以为是省电模式,实际完全不是一回事。LP 模式的主要作用不是省电,而是完成主机和外设之间的握手、状态切换、命令传输和总线方向切换。

可以这样理解:HS 模式像高速公路上的车队,一次性把很多数据送过去,效率高但需要封闭路权;LP 模式像城市道路上的红绿灯和变道指令,每辆车能不能进高速、什么时候停、什么时候走,都得靠它控制。MIPI 屏能不能点亮,很大程度上不是看你 HS 数据能不能跑,而是看你 LP 状态切换做得对不对。

MIPI DSI 链路上,时钟通道和数据通道都要能在 LP 和 HS 之间来回切换。显示初始化阶段的命令,比如 Sleep Out、Display On,往往都是在低速率下发的;一帧图像数据则通过 HS 突发传输。两个模式之间的转换,不是简单把电平抬高、压低就能完成,必须满足 D-PHY 定义的一系列时序参数。CD 这两个字母,在这里通常就是指时钟通道和数据通道。

1.2 CD 的歧义:我通常按 Clock/Data 理解,但别忘掉 Command/Display

搜索 MIPI LP CD 的时候,你会发现搜出很多东西:Linux 的 cd 命令、CD 光盘、CI/CD、各种奇怪的缩写。做 MIPI 调试的人看到 CD,第一反应应该是 Clock/Data,也就是时钟通道和数据通道。时钟通道负责给数据通道提供同步基准,数据通道负责传输像素数据和控制命令。两者在物理链路上是并行的,但在时序上要严格对齐。

不过在协议层,CD 还有一个同样重要的含义:Command 和 Display。DSI 协议里定义了两种工作模式,一种是 Command Mode,一种是 Video Mode。Command Mode 下,主机通过 LP 或低速命令把画面数据写到屏的控制芯片内部显存里,适合静态画面省电;Video Mode 下,主机按照像素时钟持续把数据流推给屏,适合动态视频。面板手册里如果出现 CD 这个缩写,有时指的就是这个意思。

所以我在调试时习惯把 CD 拆成两层看:物理层看 Clock/Data 通道的电气时序,协议层看 Command/Display 模式的配置。如果你遇到屏幕能显示但刷新率不对,可能不是物理信号问题,而是 Command Mode 和 Video Mode 的配置和面板不匹配。EPD、OLED 这类屏经常是 Command Mode,普通 TFT-LCD 多半是 Video Mode,但也不是绝对,必须看面板规格书。

1.3 为什么 LP 和 CD 绑在一起才容易出问题

很多屏点亮失败,并不是初始化代码写错,而是 LP 阶段的时序没满足。HS 信号出了问题,通常表现为花屏、雪花、闪屏;LP 信号出了问题,表现就隐蔽得多,可能是点不亮、偶尔能亮、休眠唤醒后黑屏、初始化卡住。原因是 LP 信号是单端大摆幅,对板级寄生参数、上下拉电阻、走线回流路径都非常敏感。

嵌入式工业设备里尤其明显。MIPI 排线稍微长一点,或者转接板上的地不完整,LP 电平就会被干扰。比如 LP-11 状态本该是高电平,结果被相邻信号耦合拉低,面板就认为总线没有进入正确的 Stop 状态,后续所有命令都白发。再有就是电源上电顺序,MIPI 屏对 Power、 Reset、 MIPI 信号的先后顺序要求很严格。顺序不对,LP 链路上出现乱码,面板主控进入异常状态,必须掉电重启才能恢复。

我见过最典型的一个案例,整机休眠唤醒后一半概率黑屏。后来用示波器抓 LP 状态,发现唤醒时主机已经发出 MIPI 命令,但面板还在上一帧的 LP 状态没有退出,总线直接“僵”在那里。最后是通过调整睡眠唤醒流程,在进入休眠前把 DSI 总线完整回到 LP-11 状态,再等一段 hold 时间,问题才解决。这类问题不抓 LP,光靠读寄存器永远查不出来。

2. 用示波器拆解 LP CD 信号:电平、切换和测量方法

2.1 先把四态电平搞清楚

D-PHY 的每条 lane 有两根线,比如时钟通道是 CLKP、CLKN,数据通道是 D0P、D0N。HS 模式下这两根线构成差分对,看的是两根线之间的电压差;但在 LP 模式下,两根线是独立的单端信号,逻辑状态由两根线各自的绝对电平组合决定。D-PHY 定义了四个 LP 状态:LP-00、LP-01、LP-10、LP-11。

LP-11 表示两根线都是高电平,是链路空闲的 Stop 状态;LP-00 表示两根线都是低电平,是进入 HS 前的准备状态;LP-01 和 LP-10 用于表示不同的握手或命令状态。面板和主控就是靠这些状态变化来对齐动作的。测量的时候,如果只用一个差分探头,把 CLKP 和 CLKN 相减,LP-11 和 LP-00 的差分结果都接近 0,根本区分不出来。这就是很多人抓不到 LP 问题的原因,不是信号没有,而是探头和测量方式选错了。

我自己调试时,永远用两个普通无源探头,Channel 1 接 CLKP,Channel 2 接 CLKN,地线尽量短,参考地选 DSI 接口旁边的 GND 测试点。这样看到的才是真实单端电平。LP-11 正常应该是接近 1.2V,LP-00 接近 0V。如果量到 LP-11 只有 0.8V 左右,先查供电和上下拉电阻,在动手改驱动之前就要把硬件嫌疑排除。

2.2 LP 到 HS 的切换:一段不能跳过的“仪式”

MIPI 数据从 LP 进入 HS 突发,不是简单地两个模式一切就行。D-PHY 规范里定义了一串固定的状态顺序,常见的是 Stop 状态 LP-11 先切到 LP-10,再切到 LP-00,然后进入 HS-Zero,再发同步序列,最后才发数据。整个过程看起来像一次起步:先松开刹车,再踩离合,挂挡,最后给油。如果哪个状态持续时间不够,或者顺序跳了,面板端就判断不出发送已经开始。

这几个状态对应几个关键时序参数,最常见的是 THS-PREPARE、THS-ZERO、THS-TRAIL 和 TLPX。THS-PREPARE 是进入 HS 之前的准备时间,THS-ZERO 是 HS-Zero 的持续时间,THS-TRAIL 是 HS 结束后的收尾时间,TLPX 是 LP 信号最小的脉冲宽度。每个面板控制器的手册里都会给出建议值或范围。调试时不需要死死记住每个参数,但至少要在示波器上确认这些阶段确实存在,并且持续时间没有明显比手册范围短。

时钟通道和数据的切换顺序也要注意。DSI 里时钟通道通常先进入 HS,数据通道再进入 HS;结束的时候数据通道先退出,时钟通道再退出。如果面板对顺序要求严格而主机没有遵守,表现出来就是画面能亮但边缘有杂色,或者亮一下马上熄灭。遇到这种问题,不要只盯着初始化序列,先看时钟通道和数据通道的 HS 进出关系。

2.3 使用 Escape Mode 和 BTA 时的 LP CD 细节

DSI 的命令传输不仅有普通 LP 传输,还有一种 Escape Mode,专门用于在数据通道上传输低速命令、状态查询或者触发信号。Escape Mode 的进入、数据发送、退出,全程都是在 LP 状态下完成的。它有一套自己的时序,从 LP-11 出发,通过特定的电平组合进入 Escape 模式,然后再发送命令字节。很多面板的写初始化命令就是靠 Escape Mode 一个一个发过去的。

还有 BTA,也就是总线切换。BTA 的作用是让外设暂时获得总线控制权,向主机发数据或者 ACK。比如 Command Mode 屏的 TE 信号、读取屏 ID 和错误状态,都需要 BTA。BTA 对 LP 时序非常敏感,切换太快或太慢,屏端都可能响应不了。实际调试中,如果 MIPI 读命令老是超时,多半不是 I2C 那种地址问题,而是 BTA 时序没有给够。

测量时可以这样抓:让主机发一条读命令,然后在总线上等待 BTA。用示波器的单次触发模式,从头抓到尾,看 LP 状态是否完整经历“主机发送结束 -> 总线释放 -> 面板接管 -> 面板发送数据 -> 总线交还主机”这个过程。有些示波器的 DSI 协议解码支持 BTA 标记,但就算不支持,只要能看到 LP 电平的切换和稳定时间,也能判断个大概。

2.4 实操:示波器怎么设置才算对

MIPI LP 调试最容易犯的错误是拿差分探头直接看波形。我的建议是先用两个探头分别看 P 和 N,确认 LP 状态没问题之后,再切换到差分测量看 HS 眼图。设置方法大致如下:Channel 1 和 Channel 2 都设为 DC 耦合,垂直范围 0 到 1.5V 足够;触发放到 CLKP 的下降沿,因为 LP-11 到 LP-10 或 LP-00 的切换必然伴随 CLKP 从高到低。

抓系统启动过程时,用单次触发,把时间窗口拉大到 100ms 或者更大,然后按复位键或重新上电。示波器会记录从复位释放到 MIPI 信号出现的完整过程。看到的是大段时间轴上的一串脉冲,再用 Zoom 放大看每一个切换细节。如果脉冲边缘有过冲、塌陷或者毛刺,先怀疑探头地和排线,再怀疑驱动能力。

还有一个很容易忽略的点:探头的接地线长度。接地线越长,环路电感越大,示波器上看到的 LP 振铃越夸张。很多时候你以为 LP 噪声大是硬件问题,其实是测量方法引入的。尽量用接地弹簧,或者把探头地接到 DSI 座附近的测试地,而不是夹在电源板的地上。这样量出来的 LP 波形才有参考价值。

3. 从 LP CD 到显示画面:常见故障的定位思路

3.1 横向花屏的排查顺序

屏幕出现横向花屏,也就是画面一条条错位、像被裁开再拼接的样子,很多人第一反应是信号完整性差。但我遇到的情况里,很大比例其实是通道映射和时序参数不对。MIPI DSI 的像素数据是打包成包发送的,包里有同步、头、像素数据、CRC。如果主机端设置的 HFP、HBP、像素时钟和面板端不一致,面板就会把每一行的数据对齐到错误的位置,画面上看就是横向错位。

排查横向花屏,先从软件参数开始,不要急着动硬件。确认跟你用的屏匹配的时序是 Hactive、Vactive、HFP、HBP、VFP、VBP 这些值,然后在设备树里核对。第二检查数据通道映射,D0、D1、D2、D3 有没有在转接板上交换顺序,或者时钟通道有没有反相。FPGA 做 RGB 转 MIPI 的时候,这种错误尤其常见,因为转接板上 P/N 顺序很容易反。

还有一个和 LP 相关的点是 HS 突发结束后的 Tail 状态。如果数据在最后一个像素之后没有正确收尾,提前退出了 HS,面板会把下一帧的开头当成上一帧的尾巴,产生的也是横向条纹式花屏。这时候要抓数据通道最后一组 HS 数据和 LP 退出之间的波形,确认 THS-TRAIL 够长。ST7701S 这类屏对收尾时序比较敏感,驱动里如果配置了过短的 Trail,就会出现特定分辨率下才有的横纹。

3.2 点不亮和睡眠唤醒失败:先看 LP,不要急着改 HS

屏幕完全不亮,大家习惯去查背光、复位、电源、初始化代码。这些没错,但如果都正常,问题往往在 LP CD 链路。点不亮常见的原因是主机发第一条初始化命令时,DSI 总线根本没有进入 LP-11 就绪状态。面板还在上电复位过程中,主机就开始发命令,命令自然全部丢失。

正确做法是给面板一个完整的 Power -> Reset -> LP-11 就绪时序。按复位键时,MIPI 总线要保持 Stop 状态,复位释放后再等一段时间,让面板主控内部时钟稳定,然后发第一条 DCS 命令。这个等待时间通常在几十毫秒到几百毫秒,具体看面板数据手册。很多 Linux 驱动里已经处理了,但你自己写驱动或者做 FPGA 时,很容易忽略 reset 和 MIPI 状态之间的耦合。

睡眠唤醒失败的问题,更多是“退出链路”没做好。面板进入睡眠后,MIPI 总线应该回到 LP-11 并保持稳定;唤醒时要经过完整的 LP->HS 切换,然后重新发送 Sleep Out 命令。如果主机在睡眠期间把 DSI 时钟完全关掉,或者直接把引脚置成低电平,唤醒后总线状态对不上,面板就一直停在上一个状态。我调过一块 OLED 屏,唤醒后必须断电重启,查了一个星期才发现是 Linux DSI 驱动的 LP 挂起函数把时钟通道置低了。

3.3 RK3588 Linux 适配 MIPI 屏时的实际参数

RK3588 做 Linux 显示适配,MIPI DSI 的调试入口主要在设备树。不同的 SDK 版本,节点名可能叫 mipi_dsi0、mipi_dcphy0,也可能有差异,但基本思路一样。你需要告诉内核:屏接在哪个控制器上、用了几个数据通道、面板时序参数是多少、复位和背光 GPIO 是哪些。

一个典型的 ST7701S 面板设备树片段大致长这样:

&mipi_dsi0 { status = "okay"; panel@0 { compatible = "st7701s,some-panel-vendor"; reg = <0>; backlight = <&backlight>; reset-gpios = <&gpio3 5 GPIO_ACTIVE_LOW>; enable-gpios = <&gpio3 6 GPIO_ACTIVE_HIGH>; pinctrl-names = "default"; pinctrl-0 = <&mipi_dsi0_panel_pins>; port { mipi_dsi0_panel_out: endpoint { remote-endpoint = <&mipi_dsi0_controller_in>; }; }; }; }; &mipi_dsi0 { status = "okay"; mode = "video"; clock-lanes = <1>; >typedef enum logic [2:0] { STOP, LP10, LP00, HS_ZERO, HS_SYNC, HS_DATA, TRAIL } state_t; always @(posedge clk) begin case (state) STOP: begin dout_p = 1'b1; dout_n = 1'b1; end LP10: begin dout_p = 1'b1; dout_n = 1'b0; end LP00: begin dout_p = 1'b0; dout_n = 1'b0; end HS_ZERO: begin dout_p = 1'b0; dout_n = 1'b1; end // 数据阶段根据发送内容切换 HS0/HS1 default: begin dout_p = 1'b1; dout_n = 1'b0; end endcase end

状态机的核心不是逻辑,而是时序。比如 LP00 的宽度不够,面板会认为 HS 还没有准备好,整包数据都收不到。所以我建议每个状态都用独立计时器,宁可把时间放到手册范围的中值,也不要贴着最小值做。曾有人为了减少延迟把 LP00 压得很短,结果一个屏能用,另一个批次屏就死机,批次差异吃掉全部裕量。

4.2 时钟通道和数据通道的 deskew calibration

MIPI D-PHY 的高速数据是按 UI 为单位对齐的,数据通道和时钟通道之间的偏斜不能太大,否则面板采样时建立保持时间不够。Deskew calibration,也就是去偏斜校准,目的就是调整各通道之间的传输延迟差异。在 FPGA 里,一般用 IODELAY 原语对各数据通道做数字延迟调整。

校准的思路是让发送端发出一个已知的训练图案,然后用示波器同时抓 CLK 和 D0,看数据跳变沿和时钟沿的相对位置。如果某个数据通道整体偏慢,就在该通道加 delay step,逐步逼近最佳采样点。有的 FPGA 的 D-PHY IP 自带硬件校准,会定期跑一轮 deskew 流程,但如果你自己写状态机,就必须在初始化阶段完成这个对齐,不能跳过。

实际操作时,我习惯在 HS 数据包前面加一段固定的同步图案,比如 0b0000011111 这类易于识别的序列。在示波器上数 CLK 沿和 D0 跳变之间的时间差,记录下每个数据通道的偏移量,再把对应的 delay 值写进寄存器。这样一个屏能稳定,不代表批量都能稳定,最好留出至少 25% UI 的裕量。如果板子走线长度差异太大,一个时钟周期内根本对齐不了,那就不是校准能救的,必须改 PCB。

4.3 FPGA 实测中的 LP 时序陷阱

用 FPGA 驱动 MIPI,最容易踩的是 IO 标准配置。如果某个引脚被配置成差分 LVDS,那么在驱动低电平时,P 和 N 两路会产生共模变化,无法精确表示 LP-01、LP-10 这类状态。想模拟 LP,就得把 IO 配置成单端标准,比如 LVCMOS12,然后外部配合合适的端接。输出电平 1.2V,是 LP 的关键。

再说国产 FPGA。热点里提到的紫光同创这类国产型号,做 MIPI 驱动时会发现很多只有 LVDS 差分原语,没有专门的 D-PHY 模拟前端。这种情况下,系统方案必须在板子上加一颗 D-PHY PHY 或者 MIPI 桥接芯片。FPGA 内部专职做协议和状态机,物理层交给 PHY,这样信号质量才有保证。省下 PHY 芯片,后续在量产阶段可能因为眼图裕量问题反复折腾。

另外,不要在小封装的 CPLD 上尝试多通道 MIPI 输出。MIPI 的 LP 状态切换需要精细的压摆率控制,普通逻辑器件的 IO 驱动强度、转换速率是固定的,很难满足 D-PHY 对边沿单调性的要求。实测下来,直驱方案超过四通道以后,过冲问题很难压下去。能用 PHY 芯片的尽量用 PHY 芯片。

4.4 用协议分析工具验证你的状态机

FPGA 状态机调完,光看波形绿灯还不行,最好能接一个 MIPI 协议分析仪,或者用示波器的 DSI 解码功能解出包内容。看包的时候,重点不是数据内容本身,而是包头的 CRC、ECC 是否正确。如果 CRC 总是报错,多半是 HS 阶段的发送时钟和数据没有对齐。如果 CRC 正确而屏还是不亮,问题可能出在初始化命令内容和命令顺序上,和物理层无关。

协议分析仪还有一个好处:能看到 DSI 的返回响应。部分屏支持 BTA 应答,读寄存器或者读状态时,分析仪可以抓到驱动是否真的收到 ACK。我之前自己写 FPGA 发送端时,发现发送命令后总线没有进入 BTA 状态,一开始以为是屏坏了,后来发现是 Escape Mode 的进入序列少了半个周期,导致屏根本没识别出这是命令。这类问题,靠人眼看波形很难定位,但协议分析仪一下就能标出来。

5. 调试工具、快速检查表和一点经验

5.1 五分钟快速体检

拿到一块新屏,不要让屏幕直接上高压,先做一轮 MIPI LP CD 快速体检。过程大概是这样:拿到面板手册,先确认 DSI 通道数、供电电压、复位极性、初始化命令数量;板子先不上电,测量 MIPI 连接器各引脚对地阻抗,排除短路;上电后不打开显示,用示波器看 CLKP 和 D0P 是否都是高电平,如果稳定在 1.2V 左右,说明总线处于 LP-11 空闲状态。

然后是触发启动过程。主机执行初始化命令的同时,用示波器抓 CLKP 的下降沿,观察从 LP-11 到 LP-10 再到 LP-00,然后进入 HS 的完整过程。如果前端状态切换正常,再量最后一个命令结束时的收尾波形,确认回到 LP-11。这样五分钟差不多就能判断链路好不好,不需要等系统起来再看屏幕。

很多嵌入式 Linux 板卡,看似系统起来了,其实 MIPI 初始化往往在半秒钟内就完成了。如果示波器触发设置不对,很容易错过启动信号。建议把示波器的触发设为正常模式,在触发源上选 CLKP 下降沿,然后一遍遍重启系统,直到抓到完整的初始化窗口。抓到的波形建议直接存按键波特图,后续遇到问题方便对照。

5.2 面板手册里的关键时序参数速查表

面板厂商的数据手册里,不是所有参数都重要,但以下这几个直接决定 MIPI LP CD 能不能工作,调试时优先看:

参数含义常见判断经验
LP-11 idleStop 状态电平接近 1.2V,稳定不漂移
TLPXLP 最小脉冲宽度几十 ns 到几百 ns,以手册为准
THS-PREPAREHS 进入前准备时间常见 40 ns 到 85 ns,不可无视
THS-ZEROHS-Zero 持续时间必须存在,且不能过短
THS-TRAILHS 退出收尾时间过短会造成下一拍识别失败
TSKEW时钟与数据偏斜越小越好,建议留 25% UI 裕量

这里列的是经验范围,不能当成所有屏的通用值。不同屏控制器,比如 ST7701S、NV10501、HX8399,对同一参数的要求可能差出一倍。调试时一定先翻手册,再结合示波器同时测。不要拿资料包里的模板初始化代码直接量产,因为你手上的屏批次可能不一样,参数裕量也不一样。

还有一点,设备树和驱动里设置的时序,和面板初始化命令里的时序要对应。ST7701S 这类屏,初始化命令里会切到实际分辨率,但主机端的 DSI 控制器也要知道同样的 Hactive/Vactive,否则数据传输速率和包结构都对不上。LP 阶段没问题,这一步错了也会黑屏或者花屏。

5.3 常见故障速查表

下面这张表是我在实际调试中整理出来的,遇到对应现象,优先按表的顺序排查:

现象优先怀疑检查内容解决方向
点不亮,背光不亮电源/复位/背光控制Power、Reset、PWM 引脚修正上电顺序
点不亮,背光亮无画面初始化命令未送达LP 切换波形、初始化数据调整 LP 时序和命令间隔
横向花屏、左右错位通道映射/时序不对>

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询