☰
MIPI LP/CD通道时序详解:从ST7701S花屏到RK3588与FPGA调试
2026/10/1 9:11:55 网站建设 项目流程

最近在调试一块国产安卓平板方案时,遇到一个很典型又很难查的问题:屏幕用的是 ST7701S 驱动 IC,接口是 MIPI DSI,现象是横向花屏——屏幕不是完全不能显示,而是每隔几行就错位,像被硬生生“扯”断了一样。起初以为是驱动 IC 的初始化序列没写对,反复核对寄存器配置,没用。后来把示波器接上去,盯着 C(Clock)和 D(Data)通道的波形看了半天,才定位到真正的原因:LP(Low Power)模式的握手时序出了问题,导致 HS 数据流被异常中断。

这篇文章不打算讲教科书里的 MIPI 理论,而是围绕“MIPI LP”和“CD(Clock/Data)通道”这两个核心,把我在这几年在 RK3588、FPGA 上调试 MIPI DSI/CSI 时踩过的坑、验证过的方法,以及原理层面的理解梳理一遍。如果你正在处理 MIPI 花屏、驱动不起、或者用 FPGA 做 MIPI 接口设计,这篇内容应该能帮你省下几天的时间。

1. 先还原标题:LP 是什么,C/D 又是什么?

1.1 MIPI D-PHY 里藏着两套完全不同的物理协议

很多人一提到 MIPI,脑子里浮现的是一对高速差分线,比如经典的 “CLKP/CLKN” 和 “D0P/D0N”。这个直觉没有错,但它只描述了一半的故事。MIPI D-PHY 物理层实际上定义了两种截然不同的工作模式:

  • HS(High-Speed)模式:差分信号,幅度大约 200mV 左右,电流驱动,用于搬运大数据量(比如一帧图像的所有像素点)。这个模式下,时钟和数据的速率都是真正的 Gbps 级别。
  • LP(Low-Power)模式:单端信号,幅度约 1.2V,电压驱动,速率很慢(最多几十 Mbps),但它负责的事情非常关键——链路的初始化、握手、进入/退出 HS 的指令,以及待机唤醒,全部都是靠 LP 状态来传达的。

换句话说,MIPI 并不是一条“可以跑慢点的高速线”,而是两套完全不同的电气标准共存在同一对物理引脚上。你把 LP 单独拎出来研究时,会发现它跟 I2C、SPI 这类单端总线反而更像。

1.2 定位到具体引脚:C 是时钟通道,D 是数据通道

标题里的“CD”合在一起,我理解为Clock/Data 通道对的简称。这是 MIPI DSI 系统里最基本的物理资源划分:

  • C(Clock Lane):提供时钟信号,DSI 接口是源同步的,数据线必须跟随时钟线的边界才能正确采样。
  • D(Data Lane):传输实际的像素数据和命令。DSI 最少需要 1 根 Data Lane,常见的是 4 根,也就是 D0~D3。

在 LP 模式下,C/D 通道并不是完全静默的。它们各自维持在某个电平状态,组合起来可以表达逻辑“0”和“1”。更关键的是,D-PHY 定义了一组特殊的LP 状态序列,比如 LP-11、LP-01、LP-00、LP-10,这几种状态的组合,构成了链路从“待机”进入“高速突发传输”的控制流程。

用个生活化的类比:HS 模式就像高速公路,车流快但需要收费站放行;LP 模式就是那个收费站。你不可能直接把车从停车场扔到高速公路上,必须经过取卡、抬杆、降级、加速这个流程。MIPI 里的“抬杆动作”,完全由 C/D 通道在 LP 状态下的电平跳变顺序决定。

2. C/D 通道在 LP 模式下的硬件约束:端接、挖空和极性不能想当然

2.1 端接电阻和上下拉:LP 状态下的电流路径

很多硬件工程师在画 MIPI 原理图时,习惯性地把端接电阻抄过来,最常见的是在靠近接收端芯片的地方放一对 100Ω 差分阻抗匹配电阻。这本身没什么问题,但有一类板子在 LP 模式下会翻车,根源就是这对电阻导致 LP 单端电平达不到逻辑阈值。

为什么?因为 LP 模式是单端电压驱动,发送端通过内部的上拉/下拉电阻网络强制总线到某种状态。如果在外部额外并联了弱下拉或者强上拉,相当于给本来就靠内部开关驱动的总线额外增加了一个“负载”。负载过重,电平上升沿变缓,接收端可能根本识别不出完整的 LP-11 / LP-00 转换状态。

一个常见做法是:如果主控端的 PHY 芯片内部已经集成 ODT(On-Die Termination)和偏置电阻,外部就不要再去放额外的端接网络了;如果用的是纯 FPGA 逻辑 + 外部 PHY,则要严格按照 PHY 芯片手册的说明来决定是否放置外部端接。

2.2 同层挖空:治了 HS 却坑了 LP

热词列表里有“mipi同层挖空”,这是个很有意思的点。为了让 MIPI 差分线阻达到 100Ω,很多 PCB 设计师会在走线层的下方挖空地层,减少参考平面的电容效应,让阻抗上升。这个操作对 HS 模式很有效,因为 HS 信号对阻抗匹配极度敏感。

但是,挖空也会带来一个副作用:阻抗变高,意味着信号路径对寄生电容更敏感。LP 模式是慢速单端信号,对阻抗虽然没那么挑剔,但它害怕电容导致上升沿变慢。如果你的 C/D 通道挖空范围过大,导致走线下方出现大面积的掏空区域,走线之间、走线与邻近网络之间的寄生电容会明显增加。实测中,这种电容会让 LP 的 1.2V 信号上升沿从十几纳秒拖到几十纳秒,如果赶上接收端的阈值窗口比较窄,就会频繁出现握手失败或者是偶发的花屏。

我的建议是:挖空要严格约束在差分对本身的下方,并且保持在走线宽度的 2~3 倍范围内,不要为了阻抗把整片地都切开。挖空区域的外边缘还要加一圈回流地孔,让参考平面有个明确边界。

2.3 Lane 极性:一个被严重低估的配置项

在设备树或者 FPGA 约束里,几乎总会遇到 Lane Polarity(通道极性)的配置。很多工程师不改它,觉得正反无所谓,差分信号反转了数据自然就是反的,接收端会纠正。这句话在 HS 模式下有一定道理,但在 LP 模式下完全错误。

LP 模式是单端电平,它不存在“差分反转”的概念。如果你把 CLKP 接到了 CLKN 的位置上,HS 模式下接收端可能还能通过内部交叉纠正正常接收,但 LP 模式下接收器看到的电平逻辑就完全反了——原来该是 LP-11 的状态变成了 LP-00,握手永远无法成功。

遇到过不止一次,换屏幕不花屏但点不亮,查到最后就是 FPC 排线那里 C 差分对的 P/N 接反了,软件里没做lane-polarities修正。

3. 一次实际定位:ST7701S 横向花屏的 LP-CD 时序之谜

3.1 现象描述与初步排除

回到文章开头那个案例。屏幕是 1080x1920 的 MIPI 屏,驱动 IC 是 ST7701S。现象很明确:

  • 系统能正常启动到 GUI,背光正常。
  • 屏幕上有横向的、位置不固定的错位色带,大概每隔几十行出现一次。
  • 用手机拍屏幕,能明显看出整个画面在轻微抖动,像刷新率不稳定。

最初我怀疑是初始化序列里某个寄存器的边界值设置不对。ST7701S 的寄存器本身就比较复杂,尤其是跟 VCOM、Display Timing 相关的,写错一个字节就可能花屏。于是花了一个下午,把所有时序寄存器全部按数据手册核对。没有发现异常,信号源输出也正常。

然后怀疑电压。MIPI IO 的 AVDD、DOVDD、VCI 逐一用万用表测了一遍,波形上看没有明显纹波。DDR 和主控端的供电也用了示波器测,没有掉压。

最后才想到用逻辑分析仪去抓 MIPI 总线。分析仪没有那么高的采样率上 HS,但抓 LP 状态转换很轻松。这一抓,真相就露出来了。

3.2 逻辑分析仪下的 LP 状态机异常

把逻辑分析仪的三根通道分别接到 CLKP、D0P 和 D0N 上,采样率设置成 100MHz,捕获时长 2 秒。把抓到的二进制数据,按照 D-PHY 的 LP 状态定义解码出来,得到了一条时间线:

正常情况下,每次 HS 突发之前,链路应该按顺序经历:

LP-11 -> LP-10 -> LP-00 -> HS-Zero -> HS-Burst -> HS-Trail -> LP-11

中间任何一个状态缺失或时序长度不足,接收端就会判定链路进入错误状态,直接丢弃后面的一段数据。

但实际上抓到的是:HS-Burst 传到一半,D0P/D0N 突然变成了 LP-11,然后马上又跳回 HS 继续传。这相当于传输被硬生生切成了两半,接收端在中间那段看到的是非法状态,于是整行像素就对不上了,表现在屏幕上就是横向花屏。

为什么会凭空插一段 LP-11 进去?追踪到源头,是 D-PHY 的 Deskew 校准没做好。

3.3 Deskew 校准和走线延迟差值的计算

MIPI D-PHY 规范里有一个机制叫 Deskew Calibration(通道去偏斜校准)。它发生在每次进入 HS 模式之前,由发送端在链路上发一段特殊的校准脉冲,接收端利用这段脉冲测量出 C/D 通道之间的时间偏差。如果偏差超过接收端允许的范围(通常是各级别的高速率都有要求),接收端会认为链路没有准备好,主动丢弃数据或者强制把链路带回 LP 状态。

我们用矢量网络分析仪测了 PCB 上 C 线、D0 线、D1 线各自的走线长度,发现 D1 比 C 长了差不多 7 毫米。你可能觉得 7mm 不算什么,但在 MIPI 高速模式下,信号速度约为 6 mil/picosecond,7mm 折合下来大约 118ps 的延迟差。ST7701S 在这种速率下要求 C/D 之间的偏差小于 100ps。就是这么点差距,突破了规格边界,才导致了偶发的花屏。

处理方式是先在软件端把修复尝试做一遍:调整 D-PHY 的 Deskew 自动校准开关,尝试增加 PLL 的速率抖动窗口。软件调整在一定程度上缓解了问题,但没有根治。最终还是要硬件层面解决。

硬件修改方案很直接但也不轻松:把 D1 线的走线重新绕一绕,缩短差距。把 D1 线在 C 线附近绕了几圈蛇形线,让两条路的延迟差降到 3 毫米以内,同时加严了差分对的间距约束。改版回来之后,同样的逻辑分析仪再抓,中间的非法 LP-11 中断消失,花屏也不再出现。

3.4 关键经验:LP 中断不等于“休眠”,而是保护机制

这次排查让我印象最深的一点是:LP-11 状态本身是好的,没有任何问题。问题是它出现在不该出现的 HS 传输中段。它其实是接收端在检测到链路质量不合格时,主动执行保护动作的结果。

所以以后再遇到类似花屏,别第一时间去硬调 IC 寄存器,先用逻辑分析仪看一遍 LP 状态机的完整时序,确认是不是链路层的保护被触发了。如果是,那根源大概率在 PCB 走线、FPC 排线、连接器接触,或者 PHY 的电平配置,而不是驱动软件。

4. 从 RK3588 到 FPGA:LP 状态机的实现与注意事项

4.1 RK3588 设备树里如何正确配置 MIPI DSI

RK3588 在嵌入式 Linux 生态里用得越来越多,适配 MIPI 屏也是基本操作。在设备树里,除了常规的compatible、reg、clocks、pinctrl之外,有几个跟 LP/CD 通道强相关的关键属性:

lane-polarities:数据手册里明确要求如果 P/N 接反必须在这里修正。很多拿到现成方案的人在移植时直接沿用别人板子的配置,结果换了 FPC 之后点不亮,查了很久才发现是这里没改。

lane-cnt/>&dsi0 { status = "okay"; rockchip,lane-rate = <0>; rockchip,deskew-cal; panel@0 { compatible = "st7701s,panel"; reg = <0>; enable-gpios = <&gpio1 8 GPIO_ACTIVE_HIGH>; reset-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; panel_in_dsi0: endpoint { remote-endpoint = <&dsi0_out>; >reg [1:0] lp_state; localparam LP_11 = 2'b11; localparam LP_10 = 2'b10; localparam LP_00 = 2'b00; localparam LP_01 = 2'b01; wire lp_tx_en = (ctrl_mode == HS_MODE) ? 1'b0 : 1'b1; wire [1:0] lp_tx_pair = (ctrl_mode == HS_MODE) ? {clk_state, data_state} : {clk_lp, data_lp}; always @(posedge lane_clk or negedge rst_n) begin if(!rst_n) begin clk_lp <= 1'b1; data_lp <= 1'b1; lp_state <= LP_11; end else begin case (ctrl_mode) ENTER_HS: begin // sequence: LP-11 -> LP-10 -> LP-00 -> HS-Zero clk_lp <= 1'b0; data_lp <= 1'b0; end EXIT_HS: begin // sequence: LP-00 -> LP-10 -> LP-11 clk_lp <= 1'b1; data_lp <= 1'b1; end default: begin clk_lp <= 1'b1; data_lp <= 1'b1; lp_state <= LP_11; end endcase end end

这个代码只是一个方向性的说明,真正的 D-PHY PHY 实现还需要关心差分的 P/N 输出电平时序、毛刺滤波、超时设置。在 FPGA 里的模拟延迟和 PCB 走线延迟叠加后,要留足够的死区时间,否则你会看到高低温下握手偶发失败。

4.3 工业级场景中的“低功耗”误区

说回“LP”这个词,在很多嵌入式工业设备里面,LP 的含义从纯粹的电气低功耗,慢慢被引申为“屏幕常亮但系统空闲”的状态。这在电池设备(比如手持扫码器、便携医疗设备)上非常常见。

你可能会想:既然屏幕只是停止刷新,那就把 MIPI 数据通道挂起来,保持 LP-111 状态,让屏幕显示最后一帧画面,这不就是最简单的低功耗吗?

理论上是这样,但实际上没有那么容易做好。很多 LCD 驱动 IC 在长时间处于 LP 模式时会自动进入片内自刷新模式,如果它检测不到 MIPI 信号的周期性活动,内部的帧缓冲可能会计算出错误的行同步信号。结果是,低功耗唤醒之后,屏幕出现持续的横向色滚条纹。解决方法是:在进入低功耗之前,先把主控的 DSI 控制器切换到“command mode”,同时周期性地发送一条刷新命令(比如MIPI_DCS_WRITE_MEMORY_START),让它有规律地“醒一下”。设置一个 20ms~100ms 的软定时器,没想象中那么复杂,但一定要做。

5. 拓展思考:C-PHY 逐渐流行,LP-CD 的经验还适用吗?

5.1 C-PHY 没有传统意义上的 C/D 差分对

热词里频繁出现mipi c-phy s参数,说明很多人开始接触 C-PHY 了。C-PHY 与 D-PHY 最大的不同在于:没有独立的时钟通道。它采用三线交织编码(比如 A、B、C 三根线),通过任意两根线之间的电压差来表示符号,时钟信息内嵌在符号流本身。

从这个角度看,C-PHY 确实没有“CD”这个物理区分了。但你注意,C-PHY 依然定义了类似 LP 的状态机制。在 C-PHY 的物理层中,也存在 Line State(LS)的概念,比如待机时三条线全部拉到高电平,传输前也会有类似“Handshake”的过程。所以,如果你已经理解了 D-PHY 里“CD 在 LP 模式下如何工作”,理解 C-PHY 只是在逻辑层面多了一层编码,电气上依然是单端低电压驱动,对“低速状态”的关注是相通的。

5.2 S 参数在 MIPI 调试中的意义

“S 参数”这个词,其实同时适用于 D-PHY 和 C-PHY。我建议有条件的团队在出样之前,把 MIPI 通道的插入损耗和回波损耗测一遍。一般来说,MIPI D-PHY 的 HS 速率在 1.5Gbps 到 2.5Gbps 之间,这已经属于高频微波范畴了。

用网络分析仪扫一下 C/D 通道的 S 参数,能提前发现连接器、过孔、参考平面断裂带来的不连续反射。LP 模式虽然是慢信号,但 LP 的电平切换会产生宽频噪声,如果通道本身有严重的谐振点,这个谐振点可能恰好落在 LP 信号的关键频段,造成握手逻辑的不稳定。

实际做法就是在画完 PCB 后,板厂回来先上 VNA,跑一遍 100MHz 到 5GHz 的扫描。重点看差分 S 参数在 Nyquist 频率处的损耗,还有SDD21是不是超过了 -3dB。同时也要测量单端的SDD11,看反射是否过大。如果反射过大,哪怕 HS 测试勉强通过,LP 的上升沿也会带来难以解释的抖动。

一个亲测有效的技巧是,在 C/D 差分线靠近接收端一个较小空间(约 3~5 mil)的参考层开挖,把连接器的 Stub 效应减下去。很多人不敢玩这个操作,怕阻抗飞出规格,但只要挖空面积不大,实测阻抗变化通常在 ±5Ω 以内,却能显著改善 LP 噪声和 HS 回损。

小结

回看这次对“MIPI LP CD”的深度折腾,我的体会是:MIPI 协议虽然名义上是个串行总线,但真正值钱的地方全在物理层的那点细节里。LP 模式不是简单的省电开关,它是整个链路能够高速稳定传输的前提;CD 通道也不只是“时钟和数据”,它们的极性、长度差、端接和挖空,直接影响屏幕亮不亮、花不花。

这篇内容虽然是从一个 ST7701S 花屏案例展开的,但里面的排查思路和状态机验证方法,同样适用于 RK3588 平台,甚至用 FPGA 参考实现的场景。遇到 MIPI 相关的问题,建议先抛开“疑神疑鬼查驱动”的惯性,沉下心来把 C/D 通道的 LP 时序从头到尾测一遍,很多隐形问题走到这一步都会原形毕露。

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

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

立即咨询