
做嵌入式显示调试这几年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 接 CLKPChannel 2 接 CLKN地线尽量短参考地选 DSI 接口旁边的 GND 测试点。这样看到的才是真实单端电平。LP-11 正常应该是接近 1.2VLP-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; panel0 { 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 1b1; dout_n 1b1; end LP10: begin dout_p 1b1; dout_n 1b0; end LP00: begin dout_p 1b0; dout_n 1b0; end HS_ZERO: begin dout_p 1b0; dout_n 1b1; end // 数据阶段根据发送内容切换 HS0/HS1 default: begin dout_p 1b1; dout_n 1b0; end endcase end状态机的核心不是逻辑而是时序。比如 LP00 的宽度不够面板会认为 HS 还没有准备好整包数据都收不到。所以我建议每个状态都用独立计时器宁可把时间放到手册范围的中值也不要贴着最小值做。曾有人为了减少延迟把 LP00 压得很短结果一个屏能用另一个批次屏就死机批次差异吃掉全部裕量。4.2 时钟通道和数据通道的 deskew calibrationMIPI 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 时序和命令间隔横向花屏、左右错位通道映射/时序不对>