上周帮一个做RK3568方案的兄弟排查MIPI屏点不亮的问题现象非常典型驱动加载正常背光也亮了但画面要么上半部分花屏要么整个灰蒙蒙示波器挂在时钟lane上看波形幅度和沿倒是没大问题可数据lane上总有一种“说不上来的不干净”。折腾了两天最后定位到两个“藏在底层”的原因一个是PHY的calibration没有真正跑出来外部参考电阻虚焊导致阻抗校准码偏得离谱另一个是发送端开了scramble而接收端的驱动IC初始化时序里压根没做对应同步两侧LFSR状态一直没对齐。这两个问题在协议栈里都属于物理层的东西平时不太会被关注可真出了事排查链路往往比一个DMA配置错误要长得多。做MIPI调试的人大多数时候会关注lane数、像素格式、时钟频率、上电时序这些“看得见”的参数而calibration和scramble是协议里存在的、却容易被忽略的两个机制。这篇文章就是想把这两件事彻底讲透它们各自解决什么问题、在物理链路上怎么工作、在FPGA或RK这类SoC平台上应该如何配置和排查。如果你刚接手MIPI屏或MIPI摄像头调试这篇文章应该能帮你省掉不少翻spec和试错的时间。1. 高速突发传输里的两个底层开关校准与加扰在MIPI链路中的位置1.1 MIPI不是普通串口它靠“突发”挤带宽MIPI D-PHY和C-PHY这类接口跟UART、SPI最大的区别在于数据并不是持续不断地在线上流。DSI接口在显示一帧图像时只有在一行的有效像素数据窗口内才会进入高速HS模式到了消隐区就切回低功耗LP模式。CSI摄像头接口也类似只在行有效期间发数据。这种突发式传输的好处是省电坏处是接收端必须一遍遍重新同步。我们平时在示波器上看到的MIPI波形就是一段一段的HS差分信号夹着LP电平。每个HS burst开始的时候接收端都要重新做两件事把采样时钟恢复到正确的相位把端接阻抗和均衡参数调整到当前链路的实际状态。这两个动作本质上就是calibration要做的事。1.2 校准负责“让链路匹配”加扰负责“让频谱好看”从拆解的角度看calibration和scramble解决的完全是两个维度的工程问题。Calibration校准让发射端的驱动强度、输出共模/差分摆幅接收端的终端电阻、均衡抽头系数和实际PCB走线、连接器、芯片工艺偏差对上。MIPI高速信号的摆幅只有200mV级别一个阻抗失配就有可能让眼图眼高缩掉一半。Scramble加扰把数据流里的重复图案打散成伪随机序列从而削低功率频谱上的尖峰。图像数据里经常有大片同色像素全0或全1的重复数据会在特定频率上形成很高的EMI能量加扰就是不让这种情况出现。用个不严谨但好理解的类比calibration相当于音响系统里功放和喇叭的阻抗匹配匹配不好声音发闷、功率出不来scramble相当于给一个过于规律的声波做“扩频”让它不集中在某个频段上激起房间共振。1.3 两者独立存在但调试时互相牵制虽然calibration和scramble在协议上是两个独立功能实际项目里它们经常会互相影响。比如某些PHY IP在启用scramble后接收端的CDR锁定条件会发生变化因为加扰后的数据翻转密度比原始数据更均匀而均匀的翻转率反而有利于CDR收敛。反过来如果calibration没做好眼图睁开度本身就差这时候加不加scramble其实都救不回来反而可能因为加扰引入的随机性让误码看起来更“随机”而难查。所以遇到MIPI显示异常的案子我一般建议先把scramble关掉专心把calibration调对再开scramble验证EMI效果。一上来两个开关都打开一旦出问题变量太多很难定位。2. Calibration在D-PHY里校准什么阻抗、摆幅与CDR训练2.1 静态校准上电时给驱动器和终端电阻“定标”MIPI D-PHY的发射端是一个可控的电流源型驱动器差分输出摆幅需要通过内部电压/电流基准加上外部参考电阻来精确设定。很多SoC的PHY都会有一个专门的校准引脚比如CALIB_R外部接一颗200Ω或者150Ω的高精度电阻。PHY内部有一个比较器持续比较内部产生的参考电流在外部电阻上的压降和内部基准电压生成一组数字校准码用来微调驱动管的尺寸或者电流源大小。这个校准通常在上电后、进入HS模式之前由PHY自动完成也可以通过驱动里的寄存器强制触发。这里有个最常见的坑**外部校准电阻的精度和焊盘设计直接影响校准结果。**我见过一块板子在打样时把校准电阻旁边铺了一整片地阻抗特性变了校准出来的驱动强度明显偏低高速lane的差分摆幅只有正常值的六成表现就是花屏加信号边沿明显变缓。后来把铺铜挖掉、重新校了一次才正常。接收端也有类似校准主要是内部100Ω差分终端电阻的精度。接收端校准一般没有外部引脚靠芯片内部的bandgap基准来做。如果接收端校准偏差大反射会变严重长走线场景下特别明显。2.2 动态校准每次HS突发前的CDR与均衡训练静态校准解决的是“直流电平准不准”的问题而高速信号真正难的是“采样的相位对不对”。D-PHY没有独立的时钟通道C-PHY更是连时钟lane都省了接收端必须从数据边沿里恢复出采样时钟。这就是CDR时钟数据恢复。CDR需要数据流里有足够多的跳变沿来持续跟踪相位而MIPI是突发传输每次HS启动后接收端必须在很短的时间内锁定相位。所以D-PHY协议里设计了高速训练序列HS-Training在正式数据之前发送端会先发一串已知图案比如交替的0101或者特定的伪随机序列让接收端用这段时间完成CDR收敛。如果数据速率比较高还需要同时调整接收端的均衡器系数。D-PHY规范里这类训练序列是可选设计的具体有没有、长度多少由SoC PHY和面板/摄像头接收端共同决定。在实际调试中当你用逻辑分析仪或者示波器解码MIPI时会发现在包头之前有一段不是数据的“乱码”那些往往就是训练序列。如果这段位置和双方约定不一致接收端就会认为同步失败表现为画面随机错位或者干脆不亮屏。2.3 在FPGA上实现MIPI时校准逻辑是怎么落地的FPGA做MIPI发送或接收最绕不开的就是PHY层逻辑。如果直接用普通GPIO去做HS差分输出速率上到几百Mbps非常吃力一般会借助GTP/GTY这类高速收发器或者买第三方MIPI PHY IP。使用FPGA实现MIPI时需要自己控制的状态机里除了要处理HS进入/退出时序还要注意两点发送端按照训练序列的要求在HS burst开头预留足够长的同步图案窗口再进入payload。具体长度要参考接收端IP的要求不能照抄参考设计。接收端CDR锁定后要等训练序列结束标志出现再开始解包。很多FPGA开发者在调试CSI摄像头时发现图像偶尔有撕裂就是因为训练序列长度设置偏短CDR还没彻底稳定就开始采数据。另外一个容易被忽略的细节FPGA的高速收发器内部可能自带加扰/解扰功能这和MIPI协议里的scramble并不是同一个概念。如果你误开了收发器的加扰MIPI接收端会因为解扰不同步而完全无法解析数据现象和配置了错误的scramble模式一模一样。2.4 校准失败的表现与快速检查点我把平时遇到过的校准相关故障症状整理成了一张表排查时可以对着看症状可能原因快速检查点完全无显示数据lane无HS波形PHY校准未完成驱动未使能HS检查PHY寄存器中校准完成标志位花屏/画面上部撕裂训练序列太短CDR未锁定发送端training长度加长接收端检查lock状态差分摆幅明显偏低150mV外部校准电阻异常或驱动强度码不正确量校准电阻两端电压读PHY阻抗校准码高速信号反射严重、回沟深接收端终端电阻校准失效检查接收端PHY配置重新校准只有低速模式正常HS一进就复位发射端和接收端对HS训练机制不一致确认双方PHY版本和配置项是否匹配这些检查点往往需要读寄存器不同SoC的PHY寄存器定义千差万别但思路是通用的。先确认“校准完成标志”置位再确认训练序列匹配最后看眼图这个顺序能覆盖大部分问题。3. Scramble加扰到底在做什么从LFSR到频谱重塑3.1 不加扰的话MIPI信号会把能量集中在几个频点上图像数据并不是真正随机的。拿一个典型的桌面画面来说大部分区域是接近纯色或者渐变同一行、相邻行之间的像素值高度相似。这在数据流上的体现就是长串的重复bit比如8位颜色0x00对应连续多个0。重复图案在频域上会形成尖锐的谱峰这些谱峰一旦落在某些测试频段EMI就容易超标。有一种直观感受方法用频谱仪去测MIPI lane在显示纯色画面和显示彩色杂点画面时的频谱包络。显示纯色时频谱上能看到明显的离散尖峰而且尖峰位置会随画面的颜色变化显示杂点时频谱明显平坦很多。这些离散尖峰就是EMI测试中让人头疼的东西。加入scramble之后即使画面依然是纯色物理链路上的数据也变成了接近白噪声的伪随机序列频谱尖峰被打散EMI治理就容易得多。3.2 LFSR加扰一个简单的移位寄存器如何实现加扰的实现核心是线性反馈移位寄存器也就是LFSR。MIPI D-PHY里的scrambler通常基于16级的LFSR生成一个周期很长的伪随机序列然后把序列和数据bit做异或。整个系统里发送端和接收端必须使用相同的多项式、相同的初始种子并且在完全相同的时刻开始同步。很多工程师第一次接触加扰时会觉得它和加密是一回事这是个误解。加扰后的数据并没有变得更安全伪随机序列的生成方式在公开规范里写得很明白它唯一的目的就是改变数据流的统计特性。不同版本的MIPI规范里scrambler的多项式定义有细微差别最常见的做法是类似x^16 x^5 x^3 x^2 1这类的LFSR多项式设计。如果用FPGA自己实现可以通过一个16位的移位寄存器加异或反馈来搭出来// 典型的16位LFSR加扰示意具体多项式以MIPI规范为准 reg [15:0] lfsr; wire feedback lfsr[15] ^ lfsr[4] ^ lfsr[2] ^ lfsr[1]; // 对应多项式的抽头示意 always (posedge clk) begin if (scramble_reset) lfsr 16hFFFF; // 种子复位 else begin lfsr {lfsr[14:0], feedback}; end end assign scrambled_bit data_in ^ lfsr[0];当然在正规的SoC方案里这个逻辑已经被整合进PHY IP内部了软件能控制的主要是“要不要开”、“种子复位时序怎么对齐”。3.3 加扰的同步机制为什么两侧LFSR必须同时复位如果只是发送端把数据加扰接收端不知道每个bit加扰时LFSR处于什么状态就无法还原。所以协议里规定了同步机制在加扰模式下发送端会在HS burst的特定位置插入一个“加扰复位序列”接收端检测到这个序列后立即把自己的LFSR复位到初始种子然后开始解扰。这个机制在实际调试中非常考验时序设计。如果面板驱动IC和SoC之间对这个复位序列的约定不一致或者初始化代码里漏配了某个开scramble的寄存器位接收端就会一直用错误的LFSR状态解数据结果就是画面出现随机的花点、伪彩而且规律性不强特别难查。我在调试某一个项目的经验是**先强制把显示内容设置为纯红或者纯绿然后看数据波形是否有稳定的周期重复。**如果开了scramble但波形还是能明显看出每行的重复位置很可能scramble根本没生效如果波形完全看不出规律但画面花那多半是解扰不同步而不是scramble没生效。3.4 Retimer和其他中继器件如何受影响MIPI信号在长走线应用中常常会加入retimer芯片用来重新产生干净的信号。retimer内部也有CDR它本身不关心数据内容只要信号的跳变密度足够就能锁定。scramble因为让数据翻转更均匀通常对retimer是有益的——连续相同bit过长的情况减少了CDR失锁的风险反而降低。但需要注意如果链路中某个retimer是“协议感知”的比如它自己也实现了MIPI协议层解析那么它就必须完整支持scramble的同步和解扰流程。一些早期的retimer型号只做了物理层的透明中继遇到开启scramble的链路也能正常转发只是在长时间没有数据时LFSR复位事件可能会被它当成异常边沿处理。所以选型和验证阶段一定要把“使能scramble场景下的稳定性”作为一个单独的测试用例不要只在默认条件下测。4. RK平台点亮MIPI屏驱动配置、ST7701S初始化与横竖屏切换的实操4.1 DTS里的lane/format/hs_rate决定PHY以什么条件去校准在RK平台上点亮MIPI屏幕第一步永远是设备树。无论是RK3568还是RK3588mipi_dsi节点下的几个关键参数会直接影响PHY的校准lanes使用几条数据lane越多带宽越高但每条lane的收发端都要独立校准。format像素格式比如RGB888不同格式对应的数据位宽不同影响实际bit rate。hs_rate高速模式下的数据率这个值直接决定接收端均衡和CDR训练的参数。一个常见的经验值是4条lane的1080P屏幕像素时钟大概在70MHz左右每条lane的数据率通常在400~500Mbps。如果hs_rate设置得明显偏高比如超过面板规格接收端PHY就算做完全部动态校准眼图也无法满足要求画面会间歇性闪线。设备树里还有一个容易被忽略的rockchip,pixel_clk或者clock-frequency的配置它和hs_rate必须匹配。如果两者对不上PHY校准的参考时钟和实际数据率不一致校准结果自然不对。4.2 ST7701S这类驱动IC的初始化序列最容易藏“非标准”开关ST7701S是一颗很多国产平板和入门手机上常见的MIPI DSI转LVDS/TTL的驱动IC。它本身支持多种显示分辨率也内置了不少显示优化功能。在点屏时驱动代码里会有一段很长的初始化序列通常是一堆寄存器地址和值的数组屏厂会把PLL配置、电源时序、扫描方向、伽马曲线都写在这段数组里。Calibration相关的设置在这类驱动IC里通常不会直接叫“calibration”而是藏在“display quality”“driving ability”之类的寄存器里。比如ST7701S手册里有一类寄存器用于调整源极驱动器的充电能力、gamma运算放大器的增益这些参数本质上就是在做“端接强度和驱动能力”的匹配。抄初始化数组的时候不能只盯着“看起来和显示有关”的寄存器任何标着default 0xXX但你发现改不了的点都要回去找手册确认是不是校准相关的保护位。Scramble的开关在驱动IC侧也很关键。现代驱动IC大多在物理层支持scramble功能但它默认是否打开是屏厂出厂配置说了算。如果SoC侧设备树或者驱动里没有显式开启scramble而面板端初始化序列里却打开了两边对接不上就会出现“偶发花屏频率不高但一直存在”的怪问题。反过来如果SoC开启了scramble而面板端不支持那基本就会完全无显示或者只有裸眼能看到的严重噪点。4.3 竖屏改横屏不只是改个旋转角度那么简单热搜里“mipi dsi drm竖屏改横屏显示”是个高频词很多人在RK平台把竖屏的屏幕改成横屏显示时只是在DRM panel里把mode的hdisplay和vdisplay对调然后在userspace里设一个rotation。这种做法在某些屏上生效但在另一些屏上会出现取模方向不对、画面倒置或者闪烁。根本原因在于横竖屏切换会改变一行的有效像素数和帧率进而改变DSI接口的实际数据流量。流量一变像素时钟就要调整hs_rate也得跟着变PHY的校准参数自然要重新匹配。很多SoC的DRM驱动支持在运行时热切换hs_rate但前提是设备树里通过link-frequencies把可用的频率范围都声明了。如果只留了一组频率DRM在换分辨率时就会强制复用原频率导致带宽不足或者过量画质和稳定性都会受影响。另外部分驱动IC的扫描方向和竖屏时的定义是绑定的。比较稳妥的做法是在panel初始化序列里找到扫描方向控制寄存器ST7701S这类IC通常有0xB0之后的扩展命令来配置。根据目标横屏的RGB扫屏方向一开始就把扫描方向设对而不是依赖DRM的rotation。在DRM mode里只做左旋或右旋的旋转不要同时叠加镜像。这样处理之后数据率不会因为旋转而在驱动层产生额外开销PHY的校准条件也更容易保持稳定。4.4 长走线、线束连接和Retimer场景下的校准余量MIPI接口引脚定义图里每组lane都是差分对Pin脚位置往往紧邻着电源和地。很多工程师在画板时为了走线方便会让某一对差分线穿过多个过孔或者跨越分割的地平面这在消费级板子上可能勉强能跑但接上长线束或者经过连接器转接后链路的回波损耗明显变差。如果项目中使用了MIPI retimer布局上要注意retimer芯片两端的差分走线都要按100Ω阻抗控制并且retimer的参考时钟要干净。调试时可以把retimer厂家推荐的寄存器配置和SoC PHY的calibration配置一起核对。我遇到过的情况是retimer已经正常锁定但因为SoC侧开启scramble后retimer和SoC两侧的LFSR复位事件没有完美对齐导致每帧开始阶段有几十微秒的错误数据输出。这种问题用示波器看HS burst的起始段才能发现光看画面稳定性很难定位。5. 用示波器和频谱仪判断校准与加扰是否正常工作5.1 挂示波器的第一眼先看HS burst的“入场”阶段判断MIPI链路是否健康不是把示波器接上然后盯着满屏波形看。MIPI是突发的你需要触发在LP转HS的边沿上然后把时基放大到每个HS burst的起始段。重点关注三件事HS差分幅度D-PHY要求的典型差分摆幅在200mV左右如果探头隔直后看到的单端幅度只有几十毫伏说明发送端驱动强度校准有问题。LP到HS切换是否干脆切换过程不应有明显的台阶、回沟或振铃。如果切换点附近出现一大团过冲往往说明端接阻抗没有校准到位。训练序列和正式数据的边界能看到一个稳定重复的固定pattern后才进入随机数据说明训练序列在正常工作。如果直接就是杂乱数据或者训练序列长度异常就要去检查动态校准配置。MIPI时钟波形总是比数据lane更规律因为时钟lane在HS burst期间会持续翻转数据lane则是随内容变化。有时候不能只看时钟正常就断定整个链路没问题数据lane的眼图和幅度才是更直接的判断依据。5.2 怎么验证scramble是真的开了还是“假开”开了scramble之后数据波形会失去肉眼可见的规律性。但要验证它真的生效不能只凭眼睛看。两个相对可靠的方法固定画面看重复性让屏幕显示纯色或者固定测试图案用示波器连续抓取同一时刻的数据波形。如果scramble没生效两帧相同位置的数据波形是高度一致的如果scramble生效LFSR的初始种子相同、复位时机一致理论上相同位置的波形也应该一致但帧与帧之间的数据内容会有变化。更准确的办法是直接看不同行同样颜色区域的数据波形是否还在重复。没加扰时会重复加扰后不会。频谱仪扫包络用近场探头靠近MIPI数据lane观察1GHz以下的频谱包络。没加扰时频谱上有明显的离散尖峰而且尖峰频率会随显示图案变化加扰后离散尖峰会明显变矮频谱整体更平坦。这个方法尤其在EMI整改阶段非常实用。如果确认scramble已经生效但画面仍花基本可以断定是接收端解扰同步问题。这时候回去翻面板IC的初始化序列看看里面是否有一块专门关于scramble的配置和SoC驱动对应上就好。5.3 一个高效的排查固定流程遇到MIPI显示异常我自己习惯按下面这个顺序走一遍能省不少时间先关scramble保留显示内容为纯色块用示波器看HS burst幅度和切换边沿确认calibration链路基本正常。调整PHY的training长度和均衡配置确保在关scramble状态下画面连续稳定、无闪烁。打开scramble用频谱仪或近场探头观察EMI改善效果同时持续跑半天以上的压力测试确认没有随机花屏。如果打开scramble后出问题立刻关掉回退到第2步检查两端对scramble同步事件的定义是否一致。若涉及长走线或外接屏把retimer或线束因素单独隔离用短测试线替代真实线束做对比实验。这套流程虽然看起来偏保守但它在项目里帮我规避过很多“伪随机故障”。MIPI调试最怕的不是问题难而是变量多。校准和加扰本质上都是影响全局的底层开关一动就是整个链路的变化控制变量永远是第一原则。最后再说一点个人体会。MIPI看起来是一堆寄存器配置和波形参数但真正吃透协议里calibration和scramble这两个机制之后很多所谓“疑难杂症”其实是可推理的。你看到一个画面问题如果能判断出它发生在“物理层校准”还是“数据层解扰”排查方向一下子就清晰了。我这几年做显示和摄像头调试最大的感受是不要急着改参数先在协议栈里给问题定位。定位准了手里的示波器、寄存器手册和面板初始化序列才能真的帮上忙。