ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MIPI LP RX握手失败排查:从电气参数到状态机实现

MIPI LP RX握手失败排查:从电气参数到状态机实现 1. 从没信号说起LP RX到底卡在哪一环调试MIPI屏的时候最让人抓狂的不是花屏也不是颜色偏而是上电之后屏幕一片漆黑示波器一量时钟和数据线上什么都没有。很多人第一反应是屏坏了或者驱动没写对但实际排查下来十有八九问题出在LPLow-Power状态机的握手上——也就是我今天要聊的MIPI LP RX。MIPI D-PHY的物理层把信号分成两种模式HSHigh-Speed高速模式和LPLow-Power低功耗模式。HS负责传像素数据速率动辄几百Mbps到几个GbpsLP则负责传控制命令、进入/退出HS的握手信号速率只有10Mbps左右。LP RX就是接收端对LP信号的解析逻辑它要能正确识别LP-00、LP-01、LP-10、LP-11这四种线路状态才能判断出对方发的是进入HS请求还是退出HS请求还是总线翻转。问题在于LP RX看起来简单实际上是最容易翻车的地方。因为它工作在低速、高阻、弱驱动的条件下对端接电阻、走线长度、电源域、上拉电压都极其敏感。我见过太多项目HS眼图漂亮得不行结果LP握手就是过不去最后卡在屏调试没信号这个状态上耗掉一两周。这篇内容适合谁看如果你是嵌入式工程师、FPGA开发者、或者正在用RK3588、紫光同创这类平台驱动MIPI屏的硬件/驱动人员尤其是第一次接触MIPI C-PHY/D-PHY底层协议、被LP RX握手折磨过的那这篇就是写给你的。我会从LP RX的状态机原理讲起拆到电气参数、时序窗口、常见误判再给出一套可复现的排查链路和实测经验。不堆协议原文只讲工程上真正用得上的东西。2. LP RX的状态机不是读电平那么简单2.1 四种LP状态与它们的物理含义MIPI D-PHY的每条lane有两根线Dp和Dn。LP模式下这两根线各自可以被驱动到0或1组合出四种状态状态DpDn含义LP-0000桥接态BridgeHS退出后的默认态LP-0101准备进入HS或发命令LP-1010反向用于总线翻转LP-1111停止态StopHS传输前的稳定态LP RX的核心任务就是持续采样Dp/Dn识别出状态序列然后判断出对应的协议事件。比如从LP-11 → LP-01 → LP-00这个序列代表HS进入请求HS Entry从LP-10 → LP-00代表总线翻转Turnaround。这里有个关键点很多人忽略LP RX不是简单地把两根线当GPIO读。因为LP信号在传输过程中会有过冲、振铃、慢边沿如果直接用电平比较器去读很容易在跳变瞬间读到错误组合。所以正规的LP RX实现里都会有一个去抖Debounce和状态确认机制——连续采样N次通常是3到5次结果一致才认为状态真的变了。2.2 为什么连续采样是必须的我拿一个实际案例说明。之前用某款FPGA做MIPI接收LP RX直接用组合逻辑判断电平结果HS进入握手时好时坏。后来用逻辑分析仪抓波形才发现在LP-01切到LP-00的瞬间Dn线因为走线反射出现了大约8ns的振铃导致状态机误判成LP-11握手直接失败。解决办法就是加采样窗口。具体做法是用一个比LP速率高得多的时钟比如LP是10Mbps那就用100MHz以上去采样连续采到相同值达到阈值才更新状态。这个阈值不能太小否则去抖无效也不能太大否则跟不上LP的时序要求。一般LP的UI是100ns采样时钟100MHz的话一个UI有10个采样点取3到5个点确认是比较稳妥的。注意采样时钟必须是LP时钟的整数倍且相位稳定否则会出现采样点漂移在边界上反复横跳。2.3 LP RX和HS RX的切换边界LP RX和HS RX不是两个独立模块它们共享同一对差分线靠一个模式切换开关来切换。这个开关的控制信号正是LP RX解析出来的。所以LP RX一旦误判HS RX就根本不会被使能表现出来就是HS没数据。这里有个隐蔽的坑切换开关本身有延迟和寄生电容。如果LP RX判断出该进HS了但开关还没完全切过去HS的第一批数据就会丢。MIPI协议里专门留了HS-Settle时间T_HS-SETTLE来规避这个问题但很多自研PHY为了省面积把这个时间做短了结果就是能握手但偶尔丢首字节。3. 电气参数LP RX翻车的真正元凶3.1 上拉电阻与驱动强度的匹配LP模式下发送端是弱驱动通常只有几mA接收端靠上拉电阻把线拉到高电平。这个上拉电阻的阻值直接决定了LP信号的上升时间和电平幅度。标准里推荐的上拉电阻是1.5kΩ到10kΩ之间但实际选型要看你的走线电容和速率。我做过一组实测对比上拉电阻上升时间(实测)LP-11电平握手成功率1.5kΩ12ns1.18V99.8%4.7kΩ35ns1.19V99.5%10kΩ78ns1.20V92%22kΩ160ns1.20V60%可以看到上拉电阻越大上升时间越长握手成功率越低。原因是LP的时序窗口是固定的上升太慢会导致状态确认采样点落在过渡区。但上拉电阻也不能太小太小会增加功耗而且和发送端的弱驱动形成分压可能拉不到规定的高电平。我的经验值是走线短5cm用4.7kΩ走线长10cm用2.2kΩ。如果板上有多路lane每路的上拉要独立不要共用。3.2 共模电压与地弹LP RX还有一个隐形杀手共模电压偏移。因为LP是单端信号Dp和Dn各自相对于地来判断高低。如果发送端和接收端的地电位不一致比如两地之间有几十mV的压差LP的高电平判决就会偏移。我遇到过一次特别典型的案例一块板子上MIPI屏怎么都不亮换了三块屏都一样。后来用万用表量发送端和接收端的地发现有45mV的压差原因是两地之间的地平面被一条大电流走线割裂了。把地平面补好之后LP握手立刻正常。所以LP RX调试时先量地再量信号。地不干净后面全是白费。3.3 端接与反射虽然LP速率低但如果走线没有端接反射依然会破坏状态判决。标准做法是在接收端加可选的端接电阻通常50Ω到100Ω但这个端接在HS模式下是要断开的否则会吃掉HS信号。实际工程里我一般建议LP走线尽量短、尽量直、避免过孔。如果实在要长走线就在接收端加一个由LP RX状态机控制的端接开关进HS时断开回LP时接通。这个开关的控制逻辑要和模式切换同步否则会在切换瞬间引入毛刺。4. 从波形到代码LP RX的排查链路4.1 第一步确认LP信号到底有没有出来很多人一上来就怀疑接收端其实应该先确认发送端。用示波器带宽至少100MHz探头电容10pF单端测量Dp和Dn看有没有LP-11的静态高电平。如果发送端上电后Dp/Dn一直是低那问题在发送端——可能是发送端没上电、没复位、或者配置寄存器没写对。这时候去查接收端是浪费时间。如果发送端有LP-11但接收端读不到那才进入下一步。4.2 第二步用逻辑分析仪抓状态序列示波器看单线可以但看状态序列不方便。我习惯用逻辑分析仪采样率至少200MS/s同时抓Dp和Dn然后手动解码成LP状态。抓的时候要注意触发条件设成Dp下降沿触发这样能抓到从LP-11进入握手的完整过程。抓到之后对照协议看序列对不对正常HS进入LP-11 → LP-01 → LP-00 → HS-0 → HS传输正常HS退出HS传输 → HS-0 → LP-11总线翻转LP-11 → LP-10 → LP-00 → LP-10 → LP-11如果序列里出现了协议里没有的组合比如LP-11直接跳到LP-00那就是电气问题导致的误判。4.3 第三步定位是电气还是逻辑这一步要分清楚是信号本身错了还是接收逻辑读错了。方法很简单把逻辑分析仪的探头直接搭在接收端芯片的引脚上不是发送端再抓一次。如果接收端引脚上的波形是干净的、序列是对的但LP RX还是握手失败那就是接收逻辑的问题采样时钟、去抖参数、状态机实现。如果接收端引脚上的波形本身就是脏的那就是电气问题上拉、端接、地。我统计过自己经手的案例大约70%的LP RX问题出在电气层30%出在逻辑层。所以先查电气性价比最高。4.4 第四步逻辑层的常见实现错误如果确认是逻辑层重点查这几个地方采样时钟频率不够LP UI是100ns采样时钟如果只有20MHz一个UI才2个点去抖根本没法做。建议至少100MHz。去抖阈值设错阈值太小去抖无效太大跟不上时序。一般3到5个采样点。状态机没有处理非法跳变比如从LP-11直接到LP-00正规实现应该报错并复位而不是硬着头皮往下走。模式切换开关控制信号有毛刺这个要用示波器看开关控制引脚确认切换时没有窄脉冲。5. 几个真实项目里的LP RX踩坑记录5.1 RK3588平台1080i信号下的LP握手抖动RK3588的MIPI输入支持1080i隔行信号这个场景下LP握手有个特殊问题场消隐期间会频繁进出LP。如果LP RX的去抖参数是按逐行信号调的在隔行信号下就会因为进出太频繁而误判。解决办法是把去抖阈值调小从5降到3同时提高采样时钟到200MHz。代价是抗噪能力下降所以必须保证电气层干净。这个案例说明LP RX的参数不是固定的要跟着应用场景调。5.2 紫光同创FPGA自研PHY的HS-Settle不足用紫光同创FPGA驱动MIPI屏时自研PHY的HS-Settle时间设得偏短导致LP握手成功后HS第一批数据丢失表现为屏幕能亮但顶部有几行花屏。后来把HS-Settle从默认值加大到协议推荐值问题消失。这个坑的隐蔽性在于LP握手是成功的所以你不会怀疑LP RX。但实际上LP RX解析出的进HS信号到HS RX真正使能之间需要留够切换时间。这个时间要算进LP RX的输出时序里。5.3 ST7701S屏上拉电压域不匹配ST7701S这类屏的LP上拉电压可能是1.8V而主控的LP RX判决门限是按1.2V设计的。如果直接对接主控会把1.8V的LP高电平判成过高有些实现甚至会触发保护。解决方法是加电平转换或者在主控侧把LP RX的判决门限配置成兼容1.8V。这个在选屏的时候就要确认不要等板子回来才发现。6. LP RX参数配置的实操建议6.1 采样时钟与去抖参数的确定方法不要拍脑袋定参数按这个流程来先测LP信号的实际UI。用示波器量LP-01到LP-00的跳变间隔正常应该是100ns左右。采样时钟取UI的10倍以上即≥100MHz。如果LP速率更高按比例提高。去抖阈值取采样时钟周期的3到5倍。比如100MHz采样阈值取3到5个点对应30到50ns的确认窗口。上板实测用逻辑分析仪抓握手过程看有没有误判。有误判就微调阈值。6.2 模式切换开关的时序约束LP RX输出进HS信号后到HS RX使能中间要留至少T_HS-SETTLE的时间。这个时间协议推荐值是100ns到200ns具体看你的PHY实现。在FPGA里可以用一个计数器来保证不要直接用组合逻辑。另外从HS退回LP时也要留T_HS-TRAIL时间让HS接收端先关闭再切回LP RX。这两个时间如果搞反了会出现HS数据没接收完就切回LP或者LP握手没完成就进HS的问题。6.3 多lane场景下的同步如果是多lane比如4 lane每条lane的LP RX是独立的但进HS的时机必须同步。实际实现里通常由lane 0的LP RX做主其他lane跟随。这里要注意如果某条lane的LP RX误判了会导致整组lane的时序错乱。我的做法是每条lane的LP RX都做去抖但状态机的主控权只给lane 0。其他lane只上报我准备好了由lane 0统一发进HS命令。这样即使某条lane有短暂误判也不会影响整体。7. 写在最后LP RX调试的心态LP RX这个东西说难不难说简单也不简单。它的难点不在于协议复杂而在于它把电气、时序、逻辑三层的坑都集中在了一个很小的模块里。你调HS眼图的时候问题往往很直观——眼图闭合就是闭合但调LP RX的时候问题经常是偶发的十次里错一次抓都抓不到。我自己的经验是LP RX的问题80%能在电气层解决剩下20%里有一半是参数没调对真正逻辑写错的很少。所以遇到屏调试没信号先别急着改代码拿示波器和逻辑分析仪把LP波形抓出来看把地量一量把上拉电阻算一算。这些基础工作做到位LP RX其实是个很听话的模块。最后分享一个我常用的快速验证方法在LP RX的状态机里加一个计数器统计每种状态的出现次数和非法跳变的次数。上板跑一段时间把计数器读出来。如果非法跳变次数不为零那一定是电气问题如果为零但握手还是失败那才是逻辑问题。这个计数器我每个项目都会加排查效率能提高一大截。
返回列表