MIPI花屏、黑屏调试分享
在调试之前我们需要知道mipi 传输有两个模式一个是lp低功耗另外是高速在200MHZ的示波器很难抓到高速的波形在lp传输阶段时钟线是单一高电平数据线有变化。此外我们还能看到clk从1.2v 切换到 200mv的从lp 阶段切换高速模式的部分。另外需要注意的是初始化只能在lp或alp模式此阶段的频率比较低完全可以使用200mhz带宽的逻辑分析仪抓获我们需要调整逻辑分析仪的cmos电压阈值以识别信号。首先调试之前需要我们检查代码中的初始化命令序列需要注意的是有个别IC的参数是16进制的需要在参数后面补上0x00和前后肩以及pixel_clock参数。接着插上屏幕尝试点亮如果不亮从以下方面排除1.屏幕不亮解决1按压插口或者调整姿势打开mipi的读取函数查看是否能在lp阶段读取屏幕信息2查看硬件线序是否是正确的line数查看计算的PHY_Clock频率是否满足最小频率要求3.改reset到其他引脚用手动改变电平的方式查看有无反应4.查看供电比如1.8v以及其他电源是否在lp阶段之前5.屏幕损坏查看温度更换屏幕如果点亮就尝试进入BIST模式排查以下问题1.整体能点亮但是大部分是不正常条纹查看ic资料和原厂给的代码是否存在需要16位的情况还可以接上逻辑分析仪分析lp的波形2.花屏检查硬件电源纹波发现BIST不花就可以进入mipi的video模式调试查看是否有以下异常1.花屏1.mipi阻抗匹配问题驱动能力问题常见的几种显示异常鱼鳞屏我有一次调试rk628f转接芯片的时候发现鱼鳞屏幕在使用其自测功能后把错误锁定到了主机发送的hdmi和转接过程最后发现rk628f自己会在scaler前反转行同步以及列同步的机型需要我们手动再转换回来。详细展开纠偏颜色格式不匹配常见主控 RK3576 输出的是 24-bit 的 RGB888每个像素 3 字节但 RK628F 或屏幕被配置为接收 16-bit 的 RGB565每个像素 2 字节。此时第一行的多余字节会“溢出”挤到第二行第二行的溢出会挤到第三行。因为溢出的字节数通常不是整行宽度的公约数所以画面会产生斜向的、规律的撕裂和错位。相位漂移你之前遇到的极性反转这是另一种错位。当 HSYNC 极性错误时Scaler 抓取 DE数据有效使能窗口的时间点偏了几个时钟周期。它抓到了一部分消隐区Blanking的无效数据又丢了一部分真实像素在换行时这种偏差不断累积或截断也会形成极度类似“鱼鳞”的视觉效果。注如果是 DSI Lane 的物理线序接反了通常是直接点不亮无法握手或者出现左右半屏割裂很少是整齐的鱼鳞。黑屏/不同色彩屏修改rgb颜色格式横纹/撕裂详细展开纠偏VBP/VFP 如果配错了会怎样画面通常是整体平移的。比如 VBP 太大画面会整体往下掉屏幕顶部留下一条黑边如果大到超过限制画面底部会被截断甚至从顶部卷绕出来Rolling。它不会在画面中间形成一条突兀的断裂线。真正产生撕裂的原因读写不同步屏幕本身有一个刷新率比如 60Hz它内部有一个指针在从上往下扫描显示。同时主控RK3576也在往屏幕的显存GRAM里写数据。如果主控写的速度和屏幕读的速度不一样主控刚写完上半屏新画面还没来得及写下半屏屏幕的扫描指针就扫过去了。结果就是上半屏显示的是第 N 帧下半屏显示的是第 N-1 帧。怎么解决1.使用TE引脚MIPI 屏幕通常会提供一个TE (Tearing Effect) 引脚或者通过 MIPI 总线发送 TE 信号。主控必须等到收到 TE 脉冲说明屏幕刚扫完一帧正处于 V-Blanking 休息区才开始下发新的一帧。2.关闭video使用non-continuous模式软件层面上能够有类似于应答准备的模式等ic准备好之后就一次性快速刷入3.修改参数让画面往下降遮住割裂画面只针对显示转接方案竖线 / 黑条详细展开HBPHorizontal Back Porch水平后肩决定了一行开始后等待多久才开始送真正的 RGB 数据。如果 HBP 给少了数据送早了画面就会向左平移右边空出来一条黑竖线。DSI Burst Mode 带来的竖线在 MIPI 传输中数据是一包一包Burst发的。如果驱动里配置的H_ACTIVE有效像素宽度与打包的 Payload 长度没对齐行的末尾会填充垃圾数据这会在屏幕的右侧边缘形成一条彩色的花屏竖条。雪花 / 噪点 — 信号质量只是其一还要警惕 FIFO 崩溃详细展开物理层信号完整性 (SI)如你所说如果 FPC 排线太长、没有做 100 欧姆差分阻抗匹配、或者附近有大电感干扰MIPI 高速差分信号的眼图就会闭合。接收端解码时会出现大量误码Bit Flip屏幕上就会闪烁随机的彩色雪花噪点。桥接芯片特有的元凶FIFO Under-run/Over-runRK628F 是一颗桥接芯片它前端吃进 HDMI 时钟后端吐出 MIPI 时钟。如果这两个时钟域匹配得不好比如 HDMI 进来的数据太快MIPI 吐出的太慢RK628F 内部的缓存 FIFO 就会爆满Over-run反之就会被掏空Under-run。一旦 FIFO 异常它吐给屏幕的数据全是错乱的表现出来就是满屏静态或动态的细密噪点。特别注意用逻辑分析仪器的时候一定要和电源En使能脚还有数据时钟一起看因为之前项目出现过电源使能脚被其他功能i2s拉低或者调用函数在初始化序列之后的问题。附录阻抗匹配知识附录1. 核心物理概念波的反射与“眼图闭合”当 MIPI 信号电磁波在 100Ω 的通道里高速飞行时如果突然遇到一段 80Ω 的排线或者 120Ω 的过孔多出来的能量无法顺畅通过。根据传输线理论这部分能量会原路反弹。反弹回来的波与后续正常发送的波叠加就会在信号的波峰和波谷产生剧烈的震荡也就是我们常说的振铃Ringing。在示波器上原本应该方方正正、张得很大的“眼图”会被这些震荡杂波填满导致“眼睛闭合”。一旦眼图闭合RK3576 的物理层解码器就无法分清 0 和 1最直观的表现就是花屏或画面闪烁。2. PCB 走线不仅是线宽和线距硬件工程师画板子时差分阻抗主要由四个变量决定线宽W、线距S、铜厚T和到参考地的距离H。在实际排查中极其容易踩以下三个坑致命的“跨分割”差分信号向前传输时其下方的地平面GND是它的信号回流路径。如果底层地平面被其他电源线或信号线切断了形成了一条沟MIPI 信号的回流路径就被迫绕大弯。这会导致该区域的阻抗瞬间飙升不仅引起严重反射还会向外辐射强大的 EMI 干扰。过孔残桩Via Stub假设主板是 8 层板MIPI 信号从表层第 1 层打过孔穿越到第 3 层走线。那么这个过孔从第 3 层延伸到第 8 层的部分里面虽然没有信号流过但它就像一根悬空的“废天线”Stub。在超高频下这根天线会产生极大的寄生电容严重拉低局部阻抗。高速设计中通常需要采用“背钻”工艺把这段残桩挖掉。出线区域的拥挤在 RK3576 芯片的 BGA 焊盘下方走线往往非常密集线宽和线距为了妥协空间经常被压缩这是主板上阻抗最容易失控的“重灾区”。3. FPC 排线最容易翻车的“玄学”区域FPC 柔性板的阻抗控制比硬板FR4困难得多主要原因在于材质和形变。网格地Hatched GND陷阱FPC 为了保持柔软和抗弯折其参考地平面通常不会铺整块实心铜而是铺成“渔网状”的网格铜。网格的疏密镂空比例直接决定了阻抗大小。如果 FPC 厂家没有针对网格地进行专门的阻抗建模算出来的 100Ω 往往是错的。动态形变导致阻抗变化FPC 在弯折安装后绝缘介质层会被挤压或拉伸导致差分线到参考地的距离H发生变化。很多时候平摊在桌子上测阻抗是完美的塞进机器里一弯折就花屏。覆盖膜Coverlay的影响FPC 表面的黄色覆盖膜不仅是绝缘用的它的介电常数Dk也会影响阻抗。如果膜贴得不均匀或有气泡阻抗就会出现波动。4. 连接器 (Connector)天然的阻抗绊脚石高频信号经过板对板连接器或 ZIF 座子时金属弹片会产生寄生电感和电容这在物理上就是一个无法消除的阻抗突变点。引脚排布Pin Assignment为了将连接器的阻抗突变降到最低引脚必须严格按照GND - Signal() - Signal(-) - GND的顺序排布。如果两个高速差分对之间没有 GND 引脚隔离它们之间就会产生严重的串扰Crosstalk。接触不良与氧化测试治具用久了或者连接器弹片氧化会导致接触电阻变大直接削弱高频信号的幅度。5. ESD 与 EMI 器件无形的高频杀手为了防静电和过认证工程师会在 MIPI 线上并联 ESD 二极管串联共模电感。选型稍微失误屏幕必花无疑。ESD 结电容低通滤波效应为什么严苛要求 ESD 的结电容 $ 0.3\text{pF}$根据公式 $Z_c \frac{1}{2\pi f C}$在极高的频率下电容会表现出很低的阻抗。如果结电容过大MIPI 信号的高频分量就会直接通过 ESD 泄漏到地。这等同于在高速通道上加了一个“低通滤波器”把原本陡峭的方波边缘给“磨平”了上升沿和下降沿变缓。在眼图上表现为眼睛的左右两端严重变窄。共模电感差模插入损耗共模电感本来是为了滤除共模噪声的但如果不小心选到了高频差模损耗较大的型号它会无差别地把 MIPI 正常的差分信号也一起削弱导致到达屏幕端的信号幅度不够。总结如何真正落地排查理论讲完实战中如果你怀疑是阻抗问题只需要做两件事打 TDR时域反射计断开屏幕从主板 TX 端打入 TDR 测试信号示波器会直接画出整条链路的阻抗曲线。哪里偏离了 100Ω偏离了多少一目了然比如曲线在连接器处突然掉到了 85Ω。测眼图Eye Diagram跑到屏幕端用高带宽示波器探头点测 RX 接收端的波形。这是最终的“判决书”眼图只要能张开碰到标准模板硬件链路就没有问题。附录MIPI 命令表一MIPI DCS (Display Command Set) 標準顯示指令表這些是真正發送給螢幕 IC例如 ST77916去執行的動作。無論是哪家廠商的螢幕只要符合 MIPI DCS 規範這些基本指令的定義都是全球統一的。指令 (Hex)縮寫/名稱參數數量功能描述與常見應用場景0x01SWRESET0軟體復位。通常在硬體拉高 Reset 腳位後發送確保 IC 內部暫存器狀態清空。0x10SLPIN0進入休眠模式 (Sleep In)。關閉顯示並停止內部振盪器進入最低功耗狀態。0x11SLPOUT0退出休眠模式 (Sleep Out)。喚醒螢幕內部電路如電荷泵起振。注意發送後通常需強迫延時 120ms等待電壓穩定。0x12PTLON0局部顯示模式開啟 (Partial Mode)。只點亮螢幕的某個特定區塊。0x13NORON0正常顯示模式開啟 (Normal Display)。恢復全螢幕顯示狀態。0x20INVOFF0反相顯示關閉 (Display Inversion Off)。0x21INVON0反相顯示開啟 (Display Inversion On)。如果發現螢幕點亮後「黑色變白色紅色變青色」通常補發此指令即可修正。0x28DISPOFF0關閉顯示 (Display Off)。畫面變黑但不會清空顯存 (GRAM) 裡的數據。0x29DISPON0開啟顯示 (Display On)。初始化序列的最後一步正式將顯存內容輸出到玻璃面板上。0x2ACASET4設定列地址 (Column Address Set)。設定畫面刷新的 X 軸起點與終點座標決定顯示視窗的水平寬度。0x2BPASET4設定行地址 (Page/Row Address Set)。設定畫面刷新的 Y 軸起點與終點座標決定顯示視窗的垂直高度。0x2CRAMWR多個顯存寫入 (Memory Write)。緊接在 2A/2B 之後發送隨後跟著的就是真正的 RGB 像素資料。0x35TEON1開啟防撕裂訊號 (Tearing Effect Line On)。告知螢幕在垂直空白區輸出 TE 脈衝給主板用來同步刷新率。0x36MADCTL1顯存資料訪問控制。非常常用用來控制畫面的旋轉0/90/180/270度、鏡像翻轉以及 RGB/BGR 像素排列順序。0x3ACOLMOD1色彩格式設定 (Interface Pixel Format)。設定主板與螢幕之間的色彩深度例如0x55代表 16-bit RGB5650x77代表 24-bit RGB888。0x51WRDISBV1寫入顯示亮度 (Write Display Brightness)。調節螢幕背光或 OLED 發光亮度 (0~255)。表二MIPI DSI Data Type (DT) 封包類型表這些數值會出現在你 U-Boot 或 Linux 驅動底層例如panel_cmd_init_seq結構體的每一行資料的第一個位元組。它用來告訴 DSI 控制器這包資料該怎麼打包、要不要加校驗碼。Data Type (Hex)名稱意義與打包規則0x05DCS Short Write, no parameters無參數的短包。專門用來發送不需要帶參數的 DCS 指令。例如{ 0x05, 0x00, 0x01, 0x11 }(發送 Sleep Out) 或0x29(Display On)。0x15DCS Short Write, 1 parameter帶 1 個參數的短包。封包內包含 1 Byte 命令 1 Byte 參數。標準螢幕初始化最常用的格式。0x39DCS Long Write標準長包。用來發送帶有 2 個或更多參數的標準命令。例如發送0x2A座標設定時因為後面跟著 4 個座標位元組所以必須用0x39打包。0x23Generic Short Write, 2 parameters通用短包帶 2 個參數。不走標準 DCS 通道而是走廠商私有通道適合發送底層硬體暫存器配置。0x29Generic Long Write通用長包。這是特殊螢幕如 ST77916的救星。當廠商強制要求參數必須是 16-bit塞入大量0x00Dummy 數據導致普通短包無法裝載且又不想被標準 DCS 協議攔截時就會強制走這個通用長包通道直達底層。0x06DCS Read, no parameters讀取指令。向螢幕請求回傳資料例如讀取螢幕 ID 或除錯用的 BIST 狀態這時 MIPI 的 Data 0 通道會反向將資料從螢幕傳回主控。