前几天调一块10.4寸的工业LVDS屏,又走了一遍熟悉的花屏、偏色、无显示的全套流程。LVDS接口的时序问题确实容易绕晕:明明上一块屏这么配能亮,换个型号怎么就乱了?这篇想把LVDS接口这套东西彻底讲透——从底层原理开始,说明白LVDS是怎么把RGB并行数据串行丢到差分线上,像素时钟、LVDS时钟、串行码率怎么换算,VESA/JEIDA映射、极性、blanking参数分别影响什么。内容结合我在FPGA和SoC平台上点亮LVDS屏的实际案例,适合刚接触LVDS屏的驱动开发、硬件工程师,以及拿MIPI经验硬套LVDS结果越调越乱的同行。
1. 先搞清楚LVDS在物理层做了什么事:从并行RGB到串行差分
1.1 为什么显示链路非要改成串行差分不可
早期显示屏用的并行RGB接口,一根根信号线多到吓人。RGB888就是24根数据线,加上像素时钟、HSYNC、VSYNC、DE,轻松超过30根线。在PCB上布局非常痛苦,尤其是信号频率到了65MHz、85MHz之后,并行走线之间的串扰很难压下去,EMI测试也不容易过。还有个更现实的问题:并行总线做不了长距离传输,主控和屏只要相隔十几厘米,信号质量就开始恶化,这在工控设备、医疗设备里是硬伤。
LVDS的解决思路很直接:在发送端把并行的像素数据串行化,再用差分对传出去。接收端解串还原成并行RGB。这样一来,24位色深的屏幕只需要4对数据线和1对时钟线,总共10根线(按差分算),PCB面积、连接器pin数、EMI都大幅度下降。而且差分信号天生抗共模干扰,共模噪声在接收端通过减法被抵消,所以线材长一点也问题不大。
这里要理解一个关键点:LVDS不是一种"协议",它本质上是一种物理层传输技术。它不负责定义数据内容怎么组织,只负责把"0和1"可靠地搬过去。数据怎么摆到串行位里,由显示接口的映射规则决定,也就是后面要讲的VESA和JEIDA格式。
1.2 7:1串行化:一条差分通道里藏着7个bit
LVDS最核心的时序概念是7:1串行化。以8bit面板、单通道(Single Link)为例,每个像素时钟周期内要完成一个像素所有信息的传输:RGB888是24bit数据,加上DE、HSYNC、VSYNC这3个控制信号,一共27bit。但LVDS单通道物理上有4对数据线,每对数据线在每个时钟周期里串行发7个bit,那么4对线一共能发28bit。27bit刚好塞进28bit的帧里,还剩1个bit位,有的屏厂留空,有的用来传额外的状态信号,我们一般不用管它。
为什么是7而不是8?这和LVDS早期的芯片设计有关。当时3.5mA的恒流源驱动、低摆幅差分信号在几十MHz到一百多MHz的时钟下,每个bit的串行速率能做到像素时钟的7倍。比如像素时钟65MHz,每对差分线上的实际比特率就是455Mbps,这个速率在当时的CMOS工艺下容易实现,EMI控制也比较好。7:1这个比例一直沿用至今,成为LVDS接口的事实标准。
对应到6bit面板,RGB18bit加上DE、HSYNC、VSYNC正好21bit,所以只需要3对数据线加1对时钟线。这一点在实际调试中特别容易踩坑:6bit屏只接了3对数据线,主控却按4对线配置输出,结果必花屏。
1.3 电流环、100Ω终端和共模电压
LVDS的物理层是电流驱动。发送端是一个约3.5mA的恒流源,接收端在差分对之间并联一个100Ω电阻。电流流经电阻后产生约350mV的差分电压,这就是接收端能检测到的信号。差分线对地看,共模电压约为1.2V,因此单端测量时,每根线是在1.2V左右上下摆动约175mV。
这个设计有两个直接后果。第一,终端电阻必须尽量靠近接收端,否则反射会在数据眼图上砸出很大的振铃。第二,LVDS对阻抗匹配的要求比TTL严格,差分阻抗要控制在100Ω加减10%以内,也就是90到110Ω,PCB走线的时候要按差分阻抗计算宽度和间距。
实际调试中,如果终端电阻值不对,或者干脆没接,示波器上看到的信号幅度会变大甚至出现反射波形,但屏幕不一定完全不亮,而是会随机花屏、闪线,这种问题查起来最麻烦。我的习惯是拿到一块屏就先把规格书里的终端电阻要求看明白,再去排查其他时序参数。
2. 时序心法:像素时钟、LVDS时钟和串行码率的换算关系
2.1 从分辨率和刷新率反推像素时钟
LVDS的时序起点是像素时钟,也就是PCLK。PCLK不是简单等于分辨率乘刷新率,必须把blanking区域算进去。标准公式:
PCLK = H_Total × V_Total × Frame_Rate
其中H_Total是行总长度,等于行有效像素加HFP(行前肩)、HBP(行后肩)、HSYNC脉冲宽度;V_Total类似,等于列有效像素加VFP、VBP、VSYNC脉冲宽度。
以最常见的1024×768@60Hz为例,标准参数是:H_Active=1024,HFP=24,HBP=160,HSYNC=136,H_Total=1344;V_Active=768,VFP=3,VBP=29,VSYNC=6,V_Total=806。那么PCLK = 1344 × 806 × 60 ≈ 65.0MHz。
很多人在主控配时序时只填了hactive和vactive,没有把blanking填对,结果屏幕虽然能亮,但画面偏移、闪烁,或者刷新率实际不是60Hz。LVDS屏的时序参数其实和VGA时代一脉相承,blanking的作用很大,不要觉得它是可有可无的空白区域。
不同分辨率下的典型参考值:
| 分辨率 | 刷新率 | 典型PCLK | 单通道每lane串行速率 | 单通道是否够用 |
|---|---|---|---|---|
| 1024×768 | 60Hz | 65MHz | 455Mbps | 够用 |
| 1280×800 | 60Hz | 约71MHz | 约497Mbps | 够用 |
| 1366×768 | 60Hz | 约75MHz | 约525Mbps | 够用 |
| 1280×1024 | 60Hz | 约108MHz | 约756Mbps | 够用但余量开始吃紧 |
| 1920×1080 | 60Hz | 148.5MHz | 约1.04Gbps | 通常需要双通道或改用其他接口 |
注意,不同屏厂的blanking参数不完全相同,以上是典型值,最终必须以你手上那块屏规格书里的H_Total和V_Total为准。
2.2 LVDS时钟和像素时钟是1:1关系
LVDS链路里有一对独立的差分时钟,这对时钟的频率在绝大多数情况下就等于像素时钟PCLK。也就是说,PCLK=148.5MHz,LVDS时钟就是148.5MHz;PCLK=65MHz,LVDS时钟就是65MHz。有些平台上的LVDS时钟可以配置为上升沿采样或下降沿采样,但频率不会变。
串行数据速率则等于PCLK乘以7。单通道4对数据线,每对线的速率都是7×PCLK。例如PCLK=65MHz时,每对数据线跑455Mbps,4对线加起来的总串行比特率是1.82Gbps。这个比特率里包含24bit有效RGB数据和4bit控制/保留位,有效视频带宽是PCLK×24=1.56Gbps。
理解这个关系对排查问题很重要。如果PCLK配错,串行速率也会一起错,接收端的CDR(时钟数据恢复)一旦无法锁定,屏幕要么不出图,要么出现灾难性的花屏。
2.3 单通道、双通道和带宽余量
LVDS面板分为单通道和双通道两类。单通道就是前面说的4对数据线加1对时钟,适合PCLK不高的场合。当PCLK超过一定门限(常见老款LVDS Transmitter规格上限在112MHz到135MHz之间),单通道的每lane速率会逼近甚至超过芯片的I/O能力,这时就要用双通道。
双通道LVDS面板有8对数据线和2对时钟线(每个通道各4条数据+1条时钟)。双通道的数据组织方式不同厂家有差异,有的把奇数像素分给通道0、偶数像素分给通道1,有的采取上半个屏/下半个屏的划分。实际使用中,我们不需要在驱动层知道那么细,面板接收芯片会自己处理,驱动要做的就是把输出配成Dual Link模式,并把通道极性、时钟极性都按规格书设置好。
我的经验是,即使PCLK不高,如果主板到屏之间的距离比较远,或者线材质量一般,宁可选择支持双通道的屏或者用转接方案,给时序余量留足。LVDS这东西一旦跑到接近极限速率,走线长度稍有偏差就会眼睛图闭合,出现各种间歇性花屏。
3. VESA和JEIDA两种数据映射,选错就是花屏偏色
3.1 两套映射是怎么来的
LVDS只解决了物理传输问题,但没有规定RGB数据具体放在哪对差分线的哪个bit位。早期各家面板厂各自定义,后来慢慢收敛成两大主流:VESA格式和JEIDA格式。这两套格式在27bit有效信息里把RGB的bit位重新分配了一遍,对面板厂来说只是Flash里配置不同,对主控来说则是输出配置里一个非常关键的选项。
VESA格式通常也被称为Format 1,JEIDA格式被称为Format 2。很多LVDS Transmitter芯片比如THC63LVDM83R、DS90CF383同时支持两种格式,通过引脚或寄存器切换。面板端也同样支持,但出厂默认是哪一种,必须看规格书。
如果主控输出VESA格式,面板接收配置成JEIDA,那么每个像素的RGB位序全乱了,表现出来的现象一般是花屏里带着严重偏色,而不是简单的颜色不对。因为bit错位会导致色彩通道互相串,看起来像打翻颜料盘。
3.2 8bit VESA和JEIDA映射参考表
下面给出一份典型的8bit单通道映射参考。注意不同规格书里Lane编号可能叫TX0/TX1/TX2/TX3,也可能叫RX0/RX1/RX2/RX3,本质是一样的。
VESA格式(8bit,4 Lane):
| Lane编号 | Bit0 | Bit1 | Bit2 | Bit3 | Bit4 | Bit5 | Bit6 |
|---|---|---|---|---|---|---|---|
| Lane0 | R0 | R1 | R2 | R3 | R4 | R5 | G0 |
| Lane1 | B0 | B1 | B2 | B3 | B4 | B5 | G1 |
| Lane2 | G2 | G3 | G4 | G5 | B6 | B7 | DE |
| Lane3 | VSYNC | HSYNC | G6 | G7 | R6 | R7 | 保留 |
JEIDA格式(8bit,4 Lane):
| Lane编号 | Bit0 | Bit1 | Bit2 | Bit3 | Bit4 | Bit5 | Bit6 |
|---|---|---|---|---|---|---|---|
| Lane0 | R2 | R3 | R4 | R5 | R6 | R7 | G2 |
| Lane1 | B2 | B3 | B4 | B5 | B6 | B7 | G3 |
| Lane2 | G4 | G5 | G6 | G7 | B0 | B1 | DE |
| Lane3 | VSYNC | HSYNC | G0 | G1 | R0 | R1 | 保留 |
两套格式最大的差别在于RGB低位和高位的摆放。VESA格式把R0-R5放在Lane0,R6-R7放在Lane3;JEIDA则把R2-R7放在Lane0,R0-R1放在Lane3。这也解释了为什么选错后画面不仅偏色,还会出现类似彩色噪点的花屏效果。
6bit面板的映射类似,只是只有3对数据线,总bit数为21bit,恰好放下18bit RGB和DE、HS、VS三个控制信号。6bit也是VESA/JEIDA两套,选型逻辑和8bit一致,具体以面板规格书映射表为准。
3.3 怎么确认面板和主控的格式配置
拿到一块屏,第一件事是去屏规格书里搜"VESA"或"JEIDA"关键字。很多屏会把Data Mapping图画得很清楚。如果没有明确标注,可以查屏的型号后缀或者联系屏厂FAE,这是最稳妥的方式。
主控端设置VESA还是JEIDA,在Linux平台通常是设备树里的一个属性,比如"rockchip,lvds-format"或"panel,lvds-format",值为VESA或JEIDA。在FPGA平台则是配置寄存器或参数。实际测试中可以准备一张纯红色或纯绿色的测试图片,快速切换VESA/JEIDA,看颜色是否恢复正常。这个方法比看花屏位置猜效率高很多。
4. 点亮之前:屏规格书怎么读、主控参数怎么写
4.1 规格书里的关键时序参数清单
很多新手拿到一份LVDS屏规格书,头都是大的。其实需要关注的参数就那么几个,按优先级排列:
- 分辨率:比如1024×768,决定hactive和vactive。
- blanking参数:HFP/HBP/HSYNC、VFP/VBP/VSYNC,决定PCLK和画面位置。
- PCLK:规格书会给出典型值、最小最大值,配置时最好用典型值。
- 通道数:Single Link还是Dual Link,决定主控开几对数据线。
- 色深:6bit还是8bit,决定数据线对数是3对还是4对。
- LVDS格式:VESA还是JEIDA。
- 时钟极性:上升沿采样还是下降沿采样,对应规格书里Pixel Clock Polarity或LVDS Clock Polarity。
- DE极性:DE是高有效还是低有效,几乎所有LVDS屏都是高有效。
- 上电时序:VCC、逻辑信号、背光的先后关系和延时。
这些参数里,PCLK、通道数、色深、格式、极性,任何一个错了都可能导致点不亮。建议做一个Excel清单,每调一块屏就从头到尾核一遍,不要跳着看。
4.2 SoC平台设备树配置示例
拿RK平台举例,假设是一块1024×768、8bit、VESA格式、单通道LVDS屏,设备树的核心配置大概是这样的:
&lvds_ttl { status = "okay"; panel: panel-lvds { compatible = "simple-panel"; backlight = <&backlight>; power-supply = <&vcc_lcd>; enable-gpios = <&gpio0 RK_PB0 GPIO_ACTIVE_HIGH>; rockchip,lvds-format = "vesa-24"; >APaaS技术架构拆解:低代码与中台融为一体的元数据驱动方案
/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …
RealSense D455 ROS部署全指南:Ubuntu 20.04+Noetic深度相机启动与调优
/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …
mysql5.7安装配置
1 下载安装包。官网下载太慢,提供一个国内镜像地址阿里云镜像 压缩文件解压后在目录下新建data文件夹和my.ini文件 2 编辑my.ini文件,添加以下配置 [mysql]# 设置mysql客户端默认字符集 default-character-setutf8 [mysqld] #设置3306端口 port3306 …
Server 2012 离线装 .NET 3.5:DISM 与 sxs 源
/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …
UAF漏洞原理与实战:从内存管理到利用链构建
/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …
LSTM时间序列预测实战:从期末大作业到可复现Python源码
简介:这份资源面向高校学生与Python初学者,提供一套可直接运行的LSTM时间序列预测完整项目,适用于期末大作业、课程设计或入门深度学习实践。项目以空气质量等真实序列数据为样本,覆盖数据读取、预处理、模型搭建、训练与预测全流…