MIPI D-PHY HS TX调试全攻略:从物理层到FPGA实现
做了一年多的工业显示模块我发现自己绝大部分的加班时间都耗在MIPI屏的调试上。特别是HS TX这几个字——高速发送端听起来就是FPGA或者SoC配置一下寄存器、拉几根差分线的事可实际踩过坑之后才会明白从D-PHY物理层、协议时序、屏端初始化到PCB走线任何一个环节没理顺结局都一样不是全黑没信号就是横向花屏。这篇文章就把我在MIPI HS TX这条链路里摸出来的经验完整梳理一遍覆盖底层原理、FPGA实现、屏端调试、信号完整性和接口选型希望能帮正在调MIPI屏或者准备自己搭发送链路的工程师少走几天弯路。1. D-PHY高速发送端到底在做什么HS与LP的切换是理解的起点1.1 HS模式不是简单的高速差分信号很多人第一次接触MIPI D-PHY时会下意识把它和LVDS归为一类都是差分对都是高速串行。这话只对了一半。MIPI D-PHY的HSHigh Speed模式确实是差分信号但它本质上是一个电流模式驱动器不是电压模式驱动器。HS发送端内部是一个电流源电流源驱动100Ω的差分负载产生的差分电压大约在200mV到300mV之间典型摆幅是250mV左右。这个电流驱动的特性直接决定了两件事接收端必须接100Ω差分端接电阻否则你测到的摆幅就不对要么偏小要么反射严重。HS的共模电压(V_{CMTX})大约在200mV左右比LVDS的1.2V共模低得多所以把MIPI线接到LVDS接收设备上电平上就不兼容。另外还有个容易忽略的点MIPI D-PHY的数据是**DDRDouble Data Rate**传输也就是说在时钟Lane的上升沿和下降沿各采样一次数据。这把每个数据Lane的有效传输速率翻了一倍也让接收端的时钟恢复和对齐压力变大。调试时如果示波器发现数据波形很漂亮但屏就是没反应要学会把注意力从单bit波形转向clock-data关系。1.2 HS Entry与EoT时序示波器上最容易忽略的细节D-PHY的Lane有两个工作状态LPLow Power和HSHigh Speed。LP状态是单端信号电平在0到1.2V左右用来传控制命令、总线仲裁、进入/退出HS状态HS状态才是高速传输数据的状态。关键的是从LP切换到HS必须走一套固定的时序序列总线在空闲时处于LP-11两条线都被拉高状态。发送端先把其中一条线拉低进入LP-01。再拉低另一条进入LP-00。在LP-00维持一段时间后发送端打开HS电流驱动总线进入HS-0状态。接收端正是通过LP-00 → HS-0的这个跳变才确认一个HS burst开始了。HS burst开始之后发送端不能直接丢数据要先发一段物理层同步序列SoTStart of Transmission接收端靠这段固定的翻转模式来完成时钟恢复和数据对齐。传输结束时的EoTEnd of Transmission也必须按照规范规定的时序从HS状态回到LP-11没有正确的EoT接收端下一次进入HS时可能就无法正常同步。这条时序链在调试中极其重要。我遇过不止一次的情况是HS数据波形明明有但屏幕没信号最后用示波器单端探头去量LP引脚发现状态机压根没有执行LP-01 → LP-00 → HS-0控制器直接跳到了HS驱动接收端自然不认。抓HS TX波形时建议用差分探头测量同时把触发设置在LP-11下降沿上这样可以看到完整的HS Entry过程而不是只看到一堆貌合神离的高速翻转。1.3 D-PHY和C-PHY两条不同的高速物理层路线MIPI物理层不止D-PHY一种还有C-PHY。热词里能看到mipi c-phy s参数这种关注点说明不少人已经在接触C-PHY了。简单对比一下项目D-PHYC-PHY线数每通道2根差分线每通道3根线时钟独立时钟Lane无独立时钟嵌入式时钟编码二进制差分三相三线编码典型速率每Lane约2.5GbpsD-PHY v1.2每通道约3.5Gbps以上适用场景DSI、CSI-2最常见对EMI和引脚数敏感的高端屏/摄像头C-PHY没有独立的时钟Lane时钟信息嵌入在三线之间的电平转换里所以它对信号完整性的敏感度更高S参数评估也更复杂。对于绝大多数嵌入式设备和FPGA开发来说D-PHY仍然是主流选择。这篇文章后面提到的内容如无特别说明都基于D-PHY。2. 自己搭一条HS TX链路FPGA实现路径与平台取舍2.1 为什么生产实践中绕不开FPGA方案如果你用的是RK3588、全志、瑞芯微这类带MIPI控制器的SoC那HS TX这个活已经被芯片内部硬件包了你只需要配寄存器。但在很多工业设备里情况不是这样非标分辨率或非标扫描时序SoC自带MIPI控制器的约束不够灵活。需要FPGA做图像预处理、格式转换转换完的数据直接发给屏或摄像头传感器。需要多路视频拼接、多路显示只有FPGA能灵活扩展发送通道。替代即将停产的专用视频桥接芯片时FPGA是最稳妥的可迁移方案。在这些场景下你必须在FPGA里自己产生MIPI HS TX信号。这不是一个简单的把并行数据并联转串行的问题还需要解决物理层电平、LP/HS切换时序和协议打包所以值得专门规划。2.2 三种可落地的实现路径对比根据项目约束搭HS TX通常有三条路径路径优势风险适用项目厂商IP核开发快、时序可靠、有官方支持授权成本高、固定器件型号、配置不灵活量产产品器件选型固定手搭OSERDES灵活、可控性强、不依赖特定IP需要深入理解D-PHY调试周期长验证平台、特殊需求、FPGA原型验证外接D-PHY桥接芯片把FPGA并行信号转成标准MIPI信号完整性强增加BOM、封装和布线成本高端屏、长线传输、多Lane场景Xilinx在Vivado里有MIPI D-PHY相关IP紫光同创等国产FPGA厂商也提供MIPI发送/接收参考设计如果你使用的是带硬核MIPI D-PHY的FPGA比如Lattice CrossLink系列那直接用硬核当然是最省心的。但很多7系列FPGA或国产FPGA没有硬核手搭OSERDES仍然是最常见的做法。2.3 手搭方案的核心模块与配置参数手搭一套MIPI D-PHY HS TX至少要包含这几个模块PLL产生bit clock比如4-Lane、1080p60、RGB888估算出来每Lane数据率约1.05Gbps左右实际可以按分辨率算。PLL频率要精确误差不能太大否则接收端时钟恢复会崩。OSERDES用于把并行数据转成高速串行输出。因为MIPI是DDR时钟频率是bit rate的一半OSERDES也配置成DDR模式。IO电平与约束把FPGA引脚的电平标准配置为LVDS或类似差分标准然后在约束文件里加上例如set_property IOSTANDARD LVDS [get_ports mipi_tx_dp[*]] set_property PACKAGE_PIN xxx [get_ports mipi_tx_dp[0]]需要特别提醒的是LVDS电平和MIPI HS电平并不完全等价很多开发板用LVDS IO直接连MIPI屏能点亮是因为屏本身对LP时序容忍度较高不保证所有屏都能正常工作。手搭方案用于原型验证完全没问题但进入量产前建议加专门的D-PHY驱动/收发芯片来保证电气参数达标。LP/HS状态机这是手搭方案最容易被低估的部分。HS Entry的LP-11 → LP-01 → LP-00时序需要精确控制一般用一个小状态机配合IO三态和上下拉来实现。用Verilog写一个最小化的数据输出结构大致是这样的思路// 伪代码D-PHY HS 数据输出 wire [7:0] txd_parallel; // 来自上层协议的并行数据 wire bit_clk; // bit clock wire ddr_clk; // 半频时钟 OSERDESE2 #( .DATA_RATE_OQ(DDR), .DATA_WIDTH(8) ) osd_data ( .OQ(mipi_tx_dp_serial), .CLK(bit_clk), .CLKDIV(ddr_clk), .D1(txd_parallel[0]), .D2(txd_parallel[1]), // ... D3-D8 .OCE(1b1), .RST(1b0) );这只是串行输出部分实际工程里还有打包模块把像素数据转成DSI/CSI-2字节流和LP状态机。调这块的耐心比调逻辑更考验人因为问题往往不出现逻辑仿真里而是出现在物理层时序里。3. 屏端调试实录没信号、横向花屏的完整排查思路3.1 MIPI屏的初始化流程上电、Reset、DCS命令无论是ST7701S还是其他常见屏驱动ICMIPI DSI屏点亮之前都需要一套严格的初始化流程。步骤大致是供电先给屏的VCC和I/O供电很多屏规定I/O电源要先于主电源或同时上电。ResetRESET引脚拉低至少几个毫秒再拉高然后等待稳定时间。这个延时经常被写错导致屏幕完全无反应。LP-11状态MIPI所有Lane保持LP-11空闲态让屏侧控制器检测到总线状态。发送初始化命令一般先发送0x11Sleep Out退出睡眠模式延时后再发送0x29Display On。这期间通常还要配合厂商的扩展命令做电压、时序、伽马调整。ST7701S这类IC的初始化序列通常以 0xB0 扩展命令开头后续跟一串厂商定义的参数而且每块屏的初始化序列都是屏厂定制好的灯板调试时可以直接找屏厂要但不能把网上demo板的初始化码直接盲抄分辨率不同、屏体不同寄存器配置差异很大。3.2 完全没信号的排查顺序从Lane方向到波形抓取屏完全不亮逻辑分析仪一看MIPI总线上也没数据很多人第一反应是初始化代码没配对。但我的排查经验里概率排序其实是反过来的建议按这个顺序查Lane方向和连接关系MIPI发送端必须接接收端也就是TX对RX差分P/N不能互换。转接板、软排线很容易在这出错。时钟Lane是否有连续时钟DSI的时钟Lane默认是连续时钟模式示波器抓时钟Lane应该能看到稳定的差分时钟如果看不到先检查发送端配置是不是意外设成了非连续时钟。LP时序是否存在用示波器看Lane的LP引脚确认有LP-11 → LP-01 → LP-00 → HS Entry的过程。这一步能筛掉一大半FPGA逻辑看起来对但物理上没切换的问题。HS电平是否正确差分摆幅应该在200mV到300mV之间共模电压在150mV到250mV之间。如果摆幅太低查端接电阻和IO驱动强度。初始化时序有没有卡住Sleep Out之后必须延时足够很多IC在睡眠模式下不接受Display On命令。电源/Reset电压示波器量一下RESET波形很多屏要求Reset低电平宽度不得少于10msRESET没到位后续一切归零。用示波器抓MIPI时特别建议用差分探头如果只有单端探头至少要把探头地线接得足够短否则测出来的波形会叠加大量噪声极易误判。3.3 横向花屏的根因分类时序参数、Lane数、像素格式横向花屏和完全没有信号不一样说明总线里已经有数据了只是屏侧解析出来的图像不对。根据我的实战经验横向花屏问题可以按下面这个表对号入座现象特征最可能根因检查点整个画面横向错位、左侧有残影行时序参数HSA/HBP/HFP配置错误检查初始化序列里的分辨率与时序参数图像被拉宽/拉窄颜色错乱Lane数配置错误确认屏是4-Lane还是2-Lane发送侧是否配成一致固定位置出现横向彩条数据包长度或像素格式错误检查RGB888/RGB666打包格式确认像素时钟图像闪烁、伴随随机噪点信号完整性问题检查差分走线阻抗、端接、线长匹配整屏规律性花屏时钟频率与数据率不匹配用示波器测PLL输出频率是否稳定有个很有代表性的案例用RK3588驱动一块ST7701S的屏画面固定每隔一段就出现一条横向错位。排查到最后发现初始化代码里HACT多配了10个像素导致控制器认为一行比实际多10个像素后续所有行的起始位置都往后挪了10个像素。这个错误在并口RGB屏调试时不太容易犯但在MIPI屏上因为时序参数都被打包在寄存器里极容易写错。3.4 一个1080i输入的边缘场景提醒热词里出现rk3588 mipi 输入1080i信号这个场景值得单独提醒一句。MIPI CSI-2和DSI协议本质上都是逐行传输的它不理解隔行1080i信号。如果你想把隔行视频源通过MIPI送进RK3588不能直接把1080i塞给MIPI控制器——要么在外面用桥接芯片把1080i解隔行成1080p要么在FPGA里做去隔行处理转成逐行后再打包进MIPI。很多人一开始没意识到这一点抓了很久的信号完整性结果问题在协议层就不成立。4. 信号完整性让HS TX从能出波形到稳定传输4.1 阻抗设计与同层挖空的边界MIPI差分对的目标阻抗是100Ω差分阻抗。这个值是整个信号完整性的地基。在多层板设计中一个容易被忽略的操作就是同层挖空也有人叫挖铜、掏空。同层挖空到底什么时候用我的理解是它主要用于两种情况参考层过近导致阻抗偏低高密度叠层中走线离参考平面很近即使线宽已经很细阻抗依然低于100Ω。这时在差分走线下方的参考层挖掉一块铜皮增大走线到参考平面的等效距离从而提高差分阻抗。软排线、转接板、LCM驱动模组里最常见。控制回流路径当差分线跨越某个电源/地层分割缝隙时回流路径被切断挖空处理可以人为引导回流路径避免跨缝产生的阻抗剧变。实际操作中有几个边界要注意挖空宽度不是越宽越好。挖得太宽差分对失去参考平面对外辐射和抗干扰能力都下降阻抗也容易超出目标范围。挖空的边沿要尽量远离差分走线至少保证走线两侧的参考铜皮距离对称。挖空区域不能延伸到连接器、过孔附近否则会引起局部阻抗不连续。具体挖多宽取决于介质厚度和叠层结构。经验数值上挖空宽度至少是走线与参考层厚度的3到5倍起步但最终一定要通过阻抗计算工具Polar Si9000这类验证不能拍脑袋。4.2 用S参数定位问题在发送端能做什么S参数是高速链路设计的基本语言。对于MIPI HS TX来说最关心两个差分S参数Sdd21差分插入损耗反映信号从发送端传到接收端损失了多少。如果目标速率下Sdd21掉得太狠眼图必然闭合。Sdd11差分回波损耗反映链路阻抗不连续的程度。反射越大码间干扰越严重。一个很实用的排查思路是如果Sdd21曲线在某个频率附近出现一个明显的下陷而其他频段都正常那大概率是链路中间有一处集中的不连续点——比如连接器引脚太长、过孔残桩太长、焊盘阻抗失配。逐个排除时可以分段仿真把PCB走线、连接器、软排线分别建模定位到底哪一段引入的损耗最大。4.3 眼图测试与端接检查调试HS TX最直接的验证手段是测眼图。操作上把差分探头跨接在屏端连接器附近触发源选择时钟Lane观察数据Lane的眼图。重点关注三个参数眼图高度对应差分电压摆幅低于规范值大多和端接电阻、驱动电流有关。眼图宽度对应时序抖动若宽度明显不足多半出在PLL相位噪声或PCB走线不等长上。过冲/下冲过冲过大说明阻抗失配通常能在TDR测试里看到明显的阻抗突变点。量产前还有一件事容易忽略MIPI的连接器端接。有些屏的FPC连接器本身质量一般接触阻抗不稳定眼图会时好时坏。这种问题再多的PCB仿真也没用直接换连接器型号或者压紧结构才是解法。5. 从HS TX的角度看接口选型MIPI、LVDS、DVP和USB小封装芯片5.1 三张表看懂接口定位嵌入式设备选显示/摄像头接口时DVP、LVDS、MIPI这三种接口经常要被摆在一起对比。接口信号类型引脚数典型带宽低功耗模式DVP并行同步信号10~12几十Mbps到百Mbps无LVDS串行差分4~8几百Mbps到1Gbps无MIPI D-PHY串行差分2~5每通道数百Mbps~Gbps级有LP模式DVP的优点是协议简单、调试直观老工程师人手一套逻辑分析仪就能搞定缺点是并行总线占引脚、速率受限而且没有标准的低功耗机制。LVDS在差分传输上很稳但它一直是通电就全速跑没有MIPI那种灵活的低速控制状态。MIPI则靠LP/HS切换既能在低功耗时传控制命令又能在需要时把带宽拉到Gbps级别这也是它成为摄像头和显示屏主流接口的根本原因。工业嵌入式设备近几年全面转向MIPI本质上不是为了追新而是因为MIPI在引脚数量、PCB面积、功耗、带宽四个维度上同时占优。小封装、高集成度的视频芯片往往只提供MIPI接口这也在倒逼设计者向MIPI生态靠拢。5.2 USB接口的小封装芯片在MIPI链路中的角色支持USB接口的小封装芯片有哪些这个问题在MIPI相关项目里之所以热门是因为USB在MIPI链路里扮演的是一个非常实用的周边角色。调试阶段用USB接口芯片配合抓图工具可以把MIPI摄像头的数据以UVC方式传给上位机省去写大量驱动。固件升级很多MIPI转接板会集成USB口用于更新屏参或固件避免每次改初始化序列都拆机刷线。主控扩展某些MCU没有MIPI控制器但又想驱动MIPI屏可以选用内置USB转MIPI DSI的桥接芯片让MCU只通过USB接口发送显示数据。选这类小封装芯片时我会重点关注三个指标USB接口带宽是否超出实际视频流的码率、桥接芯片本身有没有内置MIPI PHY、以及它是否支持你用的屏的Lane数和分辨率。带宽估算方法很简单分辨率乘刷新率乘比特数再除以有效载荷率如果结果超过USB实际吞吐量就需要降低刷新率或者换压缩方案。别只看芯片封装小就忽略了链路瓶颈。USB→MIPI、MIPI→USB这种桥接方案在原型验证阶段尤其好用但产品化的时候最好还是评估直连SoC或FPGA原生MIPI控制器的方案毕竟每一层转换都会引入延迟和故障点。最后分享一点个人体会如果你现在正准备做一块带MIPI屏幕的产品开发前期花点时间把HS TX链路从物理层到协议层完整捋一遍是绝对值得的。不要觉得初始化代码是屏厂给的就可以跳过理解也不要觉得示波器能看到波形就代表链路合格。真正到了量产测试阶段你会发现那些在实验室里偶发的花屏、闪屏、没信号几乎全部源于当初没搞透的细节。先吃透D-PHY再动手画板写逻辑这条路我走过确实是最快的路。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →