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画的,把行场时序的关系画清楚了。你看一眼就明白:
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 调试心得
最后分享几个我自己的调试经验:
- 先确认PCLK频率:用示波器量一下PCLK引脚,看频率对不对。频率不对,后面全白搭。
- 再确认极性:HSYNC和VSYNC的极性(高有效还是低有效)一定要和屏匹配。我见过有人配反了,画面直接上下颠倒。
- 最后调前后肩:如果画面有偏移或者边缘有黑边,大概率是前后肩没配对。
嗯,时序这东西,说白了就是「对的时间做对的事」。只要把每个信号该什么时候拉高、什么时候拉低搞清楚了,LCD驱动就成功了一大半。
公众号:蓝海资料掘金营,微信deep3321