4. LCD时序分析:行同步、场同步、数据使能、像素时钟、前后肩

各位同学,今天我们来啃一块硬骨头——LCD时序。说实话,我刚入行那会儿,看到时序图就头大。一堆信号线,一会儿高一会儿低,还有各种时间参数,看着就晕。但后来我发现,这东西其实没那么玄乎。

说白了,LCD时序就是告诉屏幕:什么时候该显示哪一行、哪一列像素。就像我们写文章,总得知道从哪开始写、写到哪换行、写到哪结束吧?LCD也是这个道理。

4.1 核心信号概览

先认识一下这几个关键信号,我习惯把它们分成两组:

信号 全称 作用
VSYNC Vertical Sync 场同步,告诉屏幕新的一帧开始了
HSYNC Horizontal Sync 行同步,告诉屏幕新的一行开始了
DE Data Enable 数据使能,告诉屏幕当前数据有效
PCLK Pixel Clock 像素时钟,每个时钟传输一个像素

嗯,这里要注意:有些屏用DE模式,有些用SYNC模式。DE模式更常见,我建议新手先从DE模式入手。

4.2 像素时钟(PCLK)

像素时钟是整个时序的节拍器。每个PCLK上升沿(或下降沿),就传输一个像素的数据。

怎么算PCLK频率?举个例子:

假设屏幕分辨率:1024×600
刷新率:60Hz
那么:PCLK = 1024 × 600 × 60 ≈ 36.86MHz

但实际中,这个值要更大。为什么?因为还有消隐区(Blanking Area)。我在项目中遇到过,有人直接用这个理论值去配时钟,结果屏幕显示错位。说白了,你还要把前后肩的时间也算进去。

实际计算公式:

PCLK = (H_Total) × (V_Total) × Refresh_Rate

其中H_Total = H_Active + H_Front_Porch + H_Sync_Width + H_Back_Porch

4.3 行同步(HSYNC)与前后肩

行同步信号,每扫描完一行就拉高(或拉低)一次。但这里有个坑——前后肩。

你想想看,屏幕扫描完一行后,电子枪(或者LCD的驱动电路)需要时间回到下一行的起点。这个时间就是行消隐期,由三部分组成:

  • 行同步脉冲(HSPW):同步信号本身的宽度
  • 行后肩(HBP):同步脉冲结束后,到有效数据开始前的等待时间
  • 行前肩(HFP):有效数据结束后,到下一个同步脉冲开始前的等待时间

我曾经调试一块7寸屏,怎么调都显示偏移。后来查手册才发现,HBP设成了2个时钟,但屏要求至少46个时钟。嗯,这种坑踩过一次就记住了。

4.4 场同步(VSYNC)与帧结构

场同步和行同步的逻辑类似,只不过它管的是帧。一帧就是一整幅画面。

场同步也有前后肩:

参数 说明 典型值(1024×600)
VSPW 场同步脉冲宽度 3行
VBP 场后肩 20行
VFP 场前肩 10行

注意,这里的单位是「行」,不是时钟周期。一行的长度就是H_Total个PCLK。

4.5 数据使能(DE)

DE信号是我个人最喜欢的信号,因为它简单粗暴。DE为高时,PCLK上的数据就是有效的像素数据;DE为低时,数据无效,屏幕忽略。

用DE模式的好处是:你不需要关心HSYNC和VSYNC的极性,只要把DE信号配对了,画面基本不会歪。我建议新手优先选择支持DE模式的屏。

小技巧:调试时,可以先让DE信号一直为高,看看屏幕有没有显示。如果全屏都有内容(虽然可能是乱的),说明PCLK和DE的极性对了。然后再调整前后肩参数。

4.6 时序关系图

下面这张图是我用SVG画的,把行场时序的关系画清楚了。你看一眼就明白:

LCD行场时序关系图 VSYNC VSPW VBP(场后肩) 有效帧数据(V_Active) VFP(场前肩) 一帧(V_Total) HSYNC HSPW HBP(行后肩) 有效行数据(H_Active) HFP(行前肩) 一行(H_Total) DE DE高电平期间,数据有效 PCLK 每个PCLK上升沿传输一个像素数据 VSYNC HSYNC DE PCLK 有效数据区

4.7 实际配置示例

拿我最近调的一块群创7寸屏(1024×600)为例,时序参数如下:

// 时钟配置
.pclk = 51200000,          // 51.2MHz

// 行时序
.h_active = 1024,          // 有效像素
.h_front_porch = 160,      // 行前肩
.h_sync_width = 4,         // 行同步宽度
.h_back_porch = 80,        // 行后肩
.h_total = 1024 + 160 + 4 + 80,  // 1268

// 场时序
.v_active = 600,           // 有效行数
.v_front_porch = 12,       // 场前肩
.v_sync_width = 2,         // 场同步宽度
.v_back_porch = 23,        // 场后肩
.v_total = 600 + 12 + 2 + 23,    // 637

警告:不同厂家的屏,前后肩的命名可能不同。有的叫HFP/HBP,有的叫H_Front_Porch/H_Back_Porch。还有的屏把HBP叫做「H_BLANKING」。一定要看数据手册的时序图,别只看参数表。

4.8 调试心得

最后分享几个我自己的调试经验:

  1. 先确认PCLK频率:用示波器量一下PCLK引脚,看频率对不对。频率不对,后面全白搭。
  2. 再确认极性:HSYNC和VSYNC的极性(高有效还是低有效)一定要和屏匹配。我见过有人配反了,画面直接上下颠倒。
  3. 最后调前后肩:如果画面有偏移或者边缘有黑边,大概率是前后肩没配对。

嗯,时序这东西,说白了就是「对的时间做对的事」。只要把每个信号该什么时候拉高、什么时候拉低搞清楚了,LCD驱动就成功了一大半。


公众号:蓝海资料掘金营,微信deep3321