
1. MIPI LP RX 到底在解决什么问题1.1 从一条“没信号”的调试日志说起如果你调过 MIPI 屏大概率见过这种场景上电、复位、初始化序列全发完了示波器上 CLK 有波形但 DATA 线上就是不动或者干脆连 LP 状态都进不去。日志里翻来覆去就一句话——“mipi屏调试没信号”。这时候很多人第一反应是去查屏的初始化代码改时序、改延时、换屏参折腾一圈发现没用。真正的问题往往出在LP RX这一侧接收端根本没有正确识别到发送端发出的低功耗状态信号。MIPI LP RX拆开看就是MIPI 低功耗接收模式。MIPI D-PHY 的物理层把链路分成两种工作状态HSHigh Speed高速和 LPLow Power低功耗。HS 用来传像素数据、命令参数这些大流量内容LP 则负责控制、同步、进入退出 HS 的握手。LP RX 就是接收端在 LP 模式下对差分线电平状态的采样与解码逻辑。它不传图像但它是图像能不能传的前提。这个内容适合谁看三类人一是做嵌入式工业设备、用 FPGA 或 SoC 接 MIPI 屏的驱动工程师二是调试 MIPI 摄像头、DVP 摄像头转 MIPI 链路的硬件工程师三是刚接触 MIPI 协议、被 LP/HS 切换搞得一头雾水的初学者。它解决的问题很具体让接收端正确识别 LP 状态从而完成 HS 进入握手最终点亮屏幕或拿到图像数据。1.2 LP 模式不是“慢速版 HS”很多人有个误解觉得 LP 就是 HS 降速。完全不是。LP 和 HS 在电气特性上是两套东西。HS 是差分小信号共模电压低摆幅大概 100mV 到 300mV终端匹配 100 欧姆。LP 则是单端大信号0 到 1.2V 逻辑电平两条线各自独立判断高低不靠差分。也就是说LP RX 的输入级和 HS RX 的输入级在硬件上就是分开的切换靠的是内部的状态机。这就解释了为什么“CLK 有波形但 DATA 不动”——你看到的可能是 HS 时钟但 LP 状态机没走完DATA 线还锁在 LP-11 或者卡在某个中间态。LP RX 要做的就是持续监测 Dp 和 Dn 两条线的单端电平组合出 LP-00、LP-01、LP-10、LP-11 四种状态再根据状态跳变序列判断发送端想干什么。提示LP 四种状态里LP-11 是空闲态LP-00 是进入 HS 的起点LP-01 和 LP-10 用于总线翻转和双向通信。接收端如果分不清这四个状态后面全免谈。1.3 为什么现在 LP RX 越来越受关注翻一下最近的搜索热词就明白了mipi c-phy s参数、st7701s mipi、rk3588 mipi 输入1080i信号、紫光同创fpga驱动mipi、mipi和lvds。这些词背后是同一个趋势——MIPI 正在从手机屏往工业、车载、FPGA 方案里渗透。以前 MIPI 是手机 SoC 的专属屏厂和主控厂把 LP/HS 时序都调好了驱动工程师不用管物理层。现在不一样了工业设备要用 FPGA 直接驱动 MIPI 屏或者用 RK3588 这类芯片接非标准 MIPI 信号源LP RX 就得自己实现或者自己调。FPGA 实现 MIPI 尤其典型。FPGA 的 IO 标准里没有现成的 MIPI D-PHY 硬核LP 接收要靠普通 LVCMOS 输入加过采样逻辑来做。这时候 LP RX 的设计质量直接决定链路能不能建起来。我见过不少项目HS 数据通路用 SelectIO 或者专用 IP 跑得挺好结果卡在 LP 状态识别上屏就是不出图。2. LP RX 的核心机制与状态机拆解2.1 D-PHY 的 LP 状态编码与跳变规则LP RX 的核心是一张状态跳变图。Dp 和 Dn 两条线每条线有高1和低0两种电平组合起来就是四种状态DpDn状态名含义11LP-11空闲链路停止01LP-01准备进入 HS 或总线翻转10LP-10准备进入 HS 或总线翻转00LP-00HS 进入序列的起点发送端要进入 HS标准流程是LP-11 → LP-01 → LP-00 → HS-0差分 0→ HS 同步序列。接收端 LP RX 必须按顺序识别到 LP-11、LP-01、LP-00然后在 LP-00 之后把接收通路切到 HS 模式。如果中间任何一个状态识别错了或者跳变顺序不对状态机就进不去 HS。这里有个容易踩的坑LP-01 和 LP-10 的顺序不能反。有些实现里为了省事把 LP-01 和 LP-10 都当成“准备态”不区分先后。短距离、理想信号下可能能用但一旦线长超过 10cm 或者有干扰顺序识别错误就会导致误触发。我建议严格按规范来该先 LP-01 就先 LP-01。2.2 接收端采样时钟从哪来LP RX 有个很实际的问题HS 有专门的 DDR 时钟随路传输LP 没有。LP 状态的持续时间是不固定的发送端想停多久停多久。接收端怎么采样常见做法是过采样。用一个比 LP 状态最小持续时间高得多的时钟去采 Dp 和 Dn比如 LP 状态最短可能 50ns那就用 200MHz 甚至 400MHz 去采每个 LP 状态能采到 10 到 20 个点再做多数表决或者边沿检测。FPGA 里用 IDDR 或者普通寄存器打拍都能做关键是采样时钟要足够快且稳定。另一个做法是异步状态机加去抖。把 Dp/Dn 当异步信号先打两拍同步到本地时钟域再用计数器做去抖连续 N 个采样点一致才认这个状态。N 取多少要看你的采样率和现场噪声。我一般取 4 到 8太小了容易误判太大了会漏掉快速跳变。注意过采样时钟的抖动要控制好。如果采样时钟本身抖动大LP 状态边沿位置飘状态机就可能采到中间态。用 FPGA 的全局时钟资源别用普通 IO 分频出来的时钟。2.3 LP RX 与 HS RX 的切换时机LP RX 识别到 LP-00 之后不能立刻切 HS。规范里要求发送端在 LP-00 之后拉出 HS-0 差分信号接收端要等一段时间T HS-SETTLE再使能 HS 接收。这个时间典型值是 85ns 到 100ns 左右具体看数据率。切早了HS 接收器还没稳定采到的是垃圾切晚了HS 同步序列的前几个 bit 丢了后面字节对齐就错。FPGA 实现的时候这个切换通常用一个延时计数器来做。LP 状态机输出一个“进入 HS”的脉冲计数器开始数数到设定值再打开 HS 接收通路。计数器时钟就是你的采样时钟所以延时值 计数目标 × 采样周期。比如 200MHz 采样要 100ns 延时计数目标就是 20。这里有个经验延时值留一点余量。规范给的是最小值实际链路因为线损、连接器、ESD 器件HS 信号建立时间可能更长。我一般会在规范值基础上加 20% 到 30%。如果发现 HS 数据偶尔错一两个 bit先别怀疑数据通路把 LP 到 HS 的切换延时加大试试。3. FPGA 实现 LP RX 的完整实操3.1 硬件连接与 IO 标准选择用 FPGA 接 MIPI 屏或者 MIPI 信号源第一步是 IO 怎么接。MIPI 的 LP 信号是 0 到 1.2V 单端HS 是差分低压。FPGA 的普通 bank 如果 VCCO 是 1.2V 或者 1.8VLP 信号可以直接进。但 HS 差分信号需要专门的差分输入对而且共模电压要匹配。紫光同创、Xilinx、Altera 的 FPGA 都有支持 MIPI 电平的 IO 标准比如 Xilinx 的 HP bank 可以设成 MIPI_DPHY 标准但那个主要是给 HS 用的。LP 接收我一般用普通 LVCMOS12 或者 LVCMOS18看 VCCO 电压。如果 VCCO 是 1.8V而 LP 信号是 1.2V直接接可能高电平识别不到需要加电平转换或者用带施密特触发的输入。实际接线时Dp 和 Dn 各接一个 FPGA 引脚这两个引脚最好在同一个 IO bank走线等长。LP 信号速率不高等长要求不严但 HS 对走线很敏感所以 PCB 上 LP 和 HS 是同一对差分线只是接收端分两路进 FPGA。提示如果 FPGA bank 电压和 MIPI LP 电平不匹配优先考虑换 bank 电压或者加电平转换芯片别指望内部上拉能解决。我见过用 3.3V bank 直接接 1.2V LP 信号的结果 LP-11 被识别成 LP-00状态机直接跑飞。3.2 LP 状态机的 Verilog 实现下面是一个简化的 LP RX 状态机核心代码用 200MHz 采样去抖计数 4。这段代码可以直接在普通 FPGA 上跑不需要特殊 IP。module lp_rx ( input wire clk, // 200MHz 采样时钟 input wire rst_n, input wire dp, // Dp 单端输入 input wire dn, // Dn 单端输入 output reg lp11, output reg lp01, output reg lp10, output reg lp00, output reg enter_hs // 进入 HS 请求 ); // 同步打拍 reg dp_r1, dp_r2, dn_r1, dn_r2; always (posedge clk or negedge rst_n) begin if (!rst_n) begin dp_r1 1b1; dp_r2 1b1; dn_r1 1b1; dn_r2 1b1; end else begin dp_r1 dp; dp_r2 dp_r1; dn_r1 dn; dn_r2 dn_r1; end end // 去抖计数 reg [2:0] cnt; reg dp_stable, dn_stable; always (posedge clk or negedge rst_n) begin if (!rst_n) begin cnt 3d0; dp_stable 1b1; dn_stable 1b1; end else if (dp_r2 ! dp_stable || dn_r2 ! dn_stable) begin if (cnt 3d3) begin dp_stable dp_r2; dn_stable dn_r2; cnt 3d0; end else begin cnt cnt 1b1; end end else begin cnt 3d0; end end // 状态译码 always (posedge clk or negedge rst_n) begin if (!rst_n) begin lp11 1b1; lp01 1b0; lp10 1b0; lp00 1b0; enter_hs 1b0; end else begin lp11 dp_stable dn_stable; lp01 ~dp_stable dn_stable; lp10 dp_stable ~dn_stable; lp00 ~dp_stable ~dn_stable; // LP-00 之后请求进入 HS enter_hs (~dp_stable ~dn_stable); end end endmodule这段代码的逻辑很直白先同步再去抖最后译码。去抖计数 4 意味着连续 4 个采样点一致才更新状态200MHz 下就是 20ns 的滤波窗口。对于大多数 MIPI 链路LP 状态最短也有 50ns20ns 窗口不会漏掉。3.3 从 LP 到 HS 的切换电路LP 状态机输出enter_hs之后需要延时一段时间再打开 HS 接收。下面是一个延时切换的示例module hs_switch ( input wire clk, input wire rst_n, input wire enter_hs, output reg hs_en ); reg [7:0] delay_cnt; parameter DELAY_TARGET 8d24; // 200MHz 下约 120ns always (posedge clk or negedge rst_n) begin if (!rst_n) begin delay_cnt 8d0; hs_en 1b0; end else if (enter_hs) begin if (delay_cnt DELAY_TARGET) begin hs_en 1b1; delay_cnt delay_cnt; end else begin delay_cnt delay_cnt 1b1; end end else begin delay_cnt 8d0; hs_en 1b0; end end endmoduleDELAY_TARGET取 24200MHz 下就是 120ns。规范要求 T HS-SETTLE 最小 85ns120ns 留了约 40% 余量。如果链路比较长或者经过连接器可以加到 32 甚至 40。但也不能太大太大了 HS 同步序列可能已经开始了会丢前导码。3.4 实测波形与状态跳变记录调 LP RX 的时候光看代码没用必须抓波形。我用逻辑分析仪抓过一组典型的进入 HS 序列Dp/Dn 的跳变顺序是LP-11 持续约 200nsLP-01 持续约 60nsLP-00 持续约 80nsHS-0 差分信号开始约 100ns 后 HS 同步序列出现对应到状态机输出lp11、lp01、lp00依次拉高enter_hs在 LP-00 期间拉高hs_en在 LP-00 结束后约 120ns 拉高。如果hs_en拉高时 HS 同步序列已经过了前几个 bit说明延时太小如果hs_en拉高后很久才看到 HS 数据说明延时太大。注意逻辑分析仪的采样率要足够高。LP 状态最短可能 50ns采样率至少 500MSa/s 才能看清。用 100MSa/s 的便宜分析仪LP-01 可能只采到一两个点根本看不出顺序。4. 常见问题与排查技巧实录4.1 LP 状态识别错误导致“没信号”这是最典型的问题。现象是 HS 时钟有但 DATA 不动或者屏完全没反应。排查步骤先用示波器或者逻辑分析仪看 Dp/Dn 在复位后有没有 LP-11。如果没有说明发送端没发或者线路断了。如果有 LP-11看进入 HS 前有没有 LP-01 和 LP-00。顺序对不对。如果顺序对看enter_hs有没有拉高。没拉高就是状态机去抖参数或者采样时钟有问题。如果enter_hs拉高了但 HS 没数据看hs_en的延时。加大延时试试。我遇到过一种情况LP-01 和 LP-00 之间只有 30ns去抖计数 4 在 200MHz 下是 20ns理论上够但实际因为信号边沿缓状态机在 LP-01 只停留了 15ns 就跳到 LP-00结果 LP-01 没被识别到。后来把去抖计数降到 2问题解决。所以去抖参数不是越大越好要看实际 LP 状态的最短持续时间。4.2 横向花屏与 LP RX 的关系搜索热词里有“mipi 液晶屏 横向 花屏”这个现象和 LP RX 也有关系。横向花屏通常是 HS 数据字节对齐错了而字节对齐的起点是由 LP 到 HS 的切换时刻决定的。如果hs_en拉高太早HS 同步序列的前几个 bit 被当成数据拉高太晚同步序列丢了接收端找不到字节边界。两种情况都会导致花屏但表现不同太早通常是整屏偏移几个像素太晚可能是随机花屏或者完全不出图。调这个问题的技巧先把hs_en延时设成规范值然后以 4 个采样时钟为步进上下各调 3 档看哪一档花屏消失。找到最佳值后再在这个值上下各留 2 档作为余量。如果最佳值范围很窄说明链路信号质量差要查线长、连接器、终端匹配。4.3 FPGA 实现 LP RX 的常见坑问题现象可能原因排查方法解决措施LP-11 识别不到IO 电平不匹配量 Dp/Dn 静态电压换 bank 电压或加电平转换LP-01/LP-00 顺序错去抖参数太大抓 LP 状态持续时间减小去抖计数进入 HS 后无数据hs_en 延时不对抓 hs_en 和 HS 同步序列调整 DELAY_TARGET偶尔花屏采样时钟抖动大查时钟源和约束用全局时钟加时序约束状态机跑飞异步信号未同步查同步打拍级数至少打两拍加去抖还有一个坑是LP 和 HS 的引脚复用。有些 FPGA 方案为了省引脚LP 和 HS 共用一对差分输入靠内部模拟开关切换。这种方案对开关的切换速度要求很高切慢了会丢 HS 前导码切快了会引入毛刺。如果非要用复用方案建议 LP 和 HS 分别用独立的 FPGA 引脚PCB 上从同一对差分线分叉出来虽然多用了引脚但省心得多。4.4 与 RK3588、ST7701S 等具体平台的配合RK3588 的 MIPI 输入支持 1080i 信号这个场景下 LP RX 的挑战在于隔行信号的行同步。1080i 的 MIPI 包里每行数据量不固定LP 状态出现的频率和位置跟逐行不一样。如果 LP RX 状态机对 LP 状态的持续时间假设太死可能会在隔行信号里误判。解决办法是让去抖参数自适应或者用更快的采样时钟把去抖窗口做小。ST7701S 是常见的 MIPI 屏驱动 IC它的初始化序列里有很多 LP 模式下的命令传输。如果 LP RX 识别不到命令屏就不会出图。调 ST7701S 的时候我一般先用示波器确认 LP 命令有没有发出来再看 FPGA 的 LP RX 状态机有没有正确译码。很多时候问题不在屏的初始化代码而在 LP RX 的采样和去抖。紫光同创 FPGA 驱动 MIPI 的案例里LP RX 通常用普通 IO 加过采样实现。紫光同创的 IO 延迟和 Xilinx 不太一样同样的去抖参数可能表现不同。建议在紫光同创上先把采样时钟降到 100MHz去抖计数设 2确认能识别 LP 状态后再逐步提高采样率。5. LP RX 调试的独家经验与参数速查5.1 采样率与去抖参数的搭配采样率和去抖计数是一对需要一起调的参数。采样率越高每个 LP 状态采到的点越多去抖计数可以适当加大抗噪能力更强。但采样率太高FPGA 时序压力大功耗也高。我一般按 LP 状态最短持续时间的 1/10 来选采样周期。比如 LP 状态最短 50ns采样周期就选 5ns对应 200MHz。去抖计数取 4滤波窗口 20ns占 LP 状态的 40%既能滤掉毛刺又不会漏掉状态。如果 LP 状态最短只有 30ns200MHz 采样只能采到 6 个点去抖计数最多取 3。再大就可能漏状态。这时候要么提高采样率到 400MHz要么降低去抖计数。我倾向于提高采样率因为去抖计数太小抗噪能力差。5.2 用眼图辅助判断 LP 信号质量LP 信号虽然是单端大信号但边沿质量同样重要。如果 LP 信号的上升沿和下降沿太缓状态机在边沿附近采到的值不确定去抖计数再大也没用。用示波器看 LP 信号的眼图重点看边沿的单调性和过冲。如果边沿有回沟或者振铃说明阻抗不匹配要在发送端加串阻或者接收端加端接。LP 信号的摆幅也要看。规范要求 LP 高电平至少 0.88V低电平最多 0.3V。如果实测高电平只有 0.7V可能是驱动能力不够或者线太长。FPGA 接收端如果 VCCO 是 1.8V0.7V 可能识别不到高电平需要加施密特触发或者换 1.2V bank。5.3 常见 MIPI 数据率下的 LP 参数参考MIPI 数据率HS 时钟频率LP 状态最短典型值推荐采样率推荐去抖计数推荐 hs_en 延时500Mbps/lane250MHz50ns200MHz4120ns1Gbps/lane500MHz40ns300MHz3100ns1.5Gbps/lane750MHz35ns400MHz390ns2Gbps/lane1GHz30ns500MHz285ns这个表是我根据实际项目整理的不是规范原文。不同发送端和不同线长会有差异建议以实测为准。但大方向是数据率越高LP 状态越短采样率要越高去抖计数要越小hs_en 延时也要越小。5.4 一个容易被忽略的细节LP 状态机的复位LP RX 状态机在上电或者链路断开后需要复位到 LP-11 空闲态。如果复位没做好状态机可能停在某个中间态导致后续无法进入 HS。我的做法是用一个超时计数器如果连续 1ms 没有检测到任何 LP 状态跳变就强制复位状态机到 LP-11。这个超时值要大于最长的 LP-11 空闲时间但小于链路重新初始化的时间。1ms 是个比较安全的经验值。另外复位信号要同步到采样时钟域。异步复位直接释放可能导致状态机在释放瞬间采到亚稳态。用两级同步器把复位同步到采样时钟再释放。5.5 从 LP RX 延伸到整个 MIPI 链路的调试思路LP RX 只是 MIPI 链路的第一关。过了这一关后面还有 HS 数据对齐、字节解析、包解码。但 LP RX 调通了后面的问题就好定位了。我的调试顺序是先确保 LP 状态识别正确再确保 HS 进入时序正确然后看 HS 数据有没有、对不对最后看包解析和图像输出。如果 LP RX 都没调通别急着去改 HS 数据通路或者屏的初始化代码。先把 LP 状态抓出来确认状态机工作正常。很多时候LP RX 调好了屏就亮了后面的问题根本不存在。提示调试 LP RX 时建议在 FPGA 里加一个状态计数器记录 LP-11、LP-01、LP-00 各出现了多少次。如果 LP-11 计数正常但 LP-01 和 LP-00 计数为 0说明发送端没发进入 HS 的序列问题在发送端或者线路。如果 LP-01 有计数但 LP-00 没有说明状态机在 LP-01 卡住了去抖参数或者采样时钟有问题。我在实际项目里踩过最深的坑是 LP RX 状态机在低温下失效。常温下一切正常零下 20 度就识别不到 LP-01。后来查出来是 FPGA 的 IO 输入缓冲在低温下阈值漂移LP 信号的边沿又比较缓导致采样点落在阈值附近。解决办法是在 PCB 上给 LP 信号加了施密特触发缓冲器问题解决。所以如果你的设备要在宽温下工作LP RX 的输入级要特别关注。