在调试之前,我们需要知道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.修改参数,让画面往下降,遮住割裂画面(只针对显示转接方案)
竖线 / 黑条
详细展开:
HBP(Horizontal Back Porch,水平后肩)决定了一行开始后,等待多久才开始送真正的 RGB 数据。如果 HBP 给少了,数据送早了,画面就会向左平移,右边空出来一条黑竖线。
DSI Burst Mode 带来的竖线:在 MIPI 传输中,数据是一包一包(Burst)发的。如果驱动里配置的
H_ACTIVE(有效像素宽度)与打包的 Payload 长度没对齐,行的末尾会填充垃圾数据,这会在屏幕的右侧边缘形成一条彩色的花屏竖条。
雪花 / 噪点 — 信号质量只是其一,还要警惕 FIFO 崩溃
详细展开:
物理层信号完整性 (SI):如你所说,如果 FPC 排线太长、没有做 100 欧姆差分阻抗匹配、或者附近有大电感干扰,MIPI 高速差分信号的眼图就会闭合。接收端解码时会出现大量误码(Bit Flip),屏幕上就会闪烁随机的彩色雪花噪点。
桥接芯片特有的元凶(FIFO Under-run/Over-run):RK628F 是一颗桥接芯片,它前端吃进 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) | 縮寫/名稱 | 參數數量 | 功能描述與常見應用場景 |
0x01 | SWRESET | 0 | 軟體復位。通常在硬體拉高 Reset 腳位後發送,確保 IC 內部暫存器狀態清空。 |
0x10 | SLPIN | 0 | 進入休眠模式 (Sleep In)。關閉顯示並停止內部振盪器,進入最低功耗狀態。 |
0x11 | SLPOUT | 0 | 退出休眠模式 (Sleep Out)。喚醒螢幕內部電路(如電荷泵起振)。注意:發送後通常需強迫延時 120ms,等待電壓穩定。 |
0x12 | PTLON | 0 | 局部顯示模式開啟 (Partial Mode)。只點亮螢幕的某個特定區塊。 |
0x13 | NORON | 0 | 正常顯示模式開啟 (Normal Display)。恢復全螢幕顯示狀態。 |
0x20 | INVOFF | 0 | 反相顯示關閉 (Display Inversion Off)。 |
0x21 | INVON | 0 | 反相顯示開啟 (Display Inversion On)。如果發現螢幕點亮後「黑色變白色,紅色變青色」,通常補發此指令即可修正。 |
0x28 | DISPOFF | 0 | 關閉顯示 (Display Off)。畫面變黑,但不會清空顯存 (GRAM) 裡的數據。 |
0x29 | DISPON | 0 | 開啟顯示 (Display On)。初始化序列的最後一步,正式將顯存內容輸出到玻璃面板上。 |
0x2A | CASET | 4 | 設定列地址 (Column Address Set)。設定畫面刷新的 X 軸起點與終點座標(決定顯示視窗的水平寬度)。 |
0x2B | PASET | 4 | 設定行地址 (Page/Row Address Set)。設定畫面刷新的 Y 軸起點與終點座標(決定顯示視窗的垂直高度)。 |
0x2C | RAMWR | 多個 | 顯存寫入 (Memory Write)。緊接在 2A/2B 之後發送,隨後跟著的就是真正的 RGB 像素資料。 |
0x35 | TEON | 1 | 開啟防撕裂訊號 (Tearing Effect Line On)。告知螢幕在垂直空白區輸出 TE 脈衝給主板,用來同步刷新率。 |
0x36 | MADCTL | 1 | 顯存資料訪問控制。非常常用!用來控制畫面的旋轉(0/90/180/270度)、鏡像翻轉以及 RGB/BGR 像素排列順序。 |
0x3A | COLMOD | 1 | 色彩格式設定 (Interface Pixel Format)。設定主板與螢幕之間的色彩深度(例如0x55代表 16-bit RGB565,0x77代表 24-bit RGB888)。 |
0x51 | WRDISBV | 1 | 寫入顯示亮度 (Write Display Brightness)。調節螢幕背光或 OLED 發光亮度 (0~255)。 |
表二:MIPI DSI Data Type (DT) 封包類型表
這些數值會出現在你 U-Boot 或 Linux 驅動底層(例如panel_cmd_init_seq結構體)的每一行資料的第一個位元組。它用來告訴 DSI 控制器,這包資料該怎麼打包、要不要加校驗碼。
| Data Type (Hex) | 名稱 | 意義與打包規則 |
0x05 | DCS Short Write, no parameters | 無參數的短包。專門用來發送不需要帶參數的 DCS 指令。例如:{ 0x05, 0x00, 0x01, 0x11 }(發送 Sleep Out) 或0x29(Display On)。 |
0x15 | DCS Short Write, 1 parameter | 帶 1 個參數的短包。封包內包含 1 Byte 命令 + 1 Byte 參數。標準螢幕初始化最常用的格式。 |
0x39 | DCS Long Write | 標準長包。用來發送帶有 2 個或更多參數的標準命令。例如發送0x2A座標設定時,因為後面跟著 4 個座標位元組,所以必須用0x39打包。 |
0x23 | Generic Short Write, 2 parameters | 通用短包(帶 2 個參數)。不走標準 DCS 通道,而是走廠商私有通道,適合發送底層硬體暫存器配置。 |
0x29 | Generic Long Write | 通用長包。這是特殊螢幕(如 ST77916)的救星。當廠商強制要求參數必須是 16-bit(塞入大量0x00Dummy 數據),導致普通短包無法裝載,且又不想被標準 DCS 協議攔截時,就會強制走這個通用長包通道直達底層。 |
0x06 | DCS Read, no parameters | 讀取指令。向螢幕請求回傳資料(例如讀取螢幕 ID 或除錯用的 BIST 狀態),這時 MIPI 的 Data 0 通道會反向將資料從螢幕傳回主控。 |