4、HDMI协议架构:物理层、数据链路层、应用层三层结构、数据包类型概览
好,咱们今天聊聊HDMI的协议架构。很多工程师一上来就盯着电气参数测,其实我觉得,先把协议分层搞明白,后面调试才能事半功倍。
HDMI协议,说白了就是三层:物理层、数据链路层、应用层。嗯,跟OSI七层模型比,它精简了不少。但每一层都有它的脾气,咱们一层一层剥开看。
4.1 物理层:信号能跑多快,全看它
物理层是HDMI的基石。它负责把0和1变成电信号,在TMDS通道上飞。我个人习惯,先看物理层,因为它决定了你的设计能不能过EMI测试。
物理层主要管三件事:
- TMDS差分信号:四对差分线,三对数据,一对时钟。电压摆幅在400mV到600mV之间。
- 预加重与去加重:高频信号衰减严重,发射端加预加重,接收端做均衡。我在项目中遇到过,预加重设太大,反而把低频信号压没了,眼图直接闭了。
- 阻抗匹配:单端50Ω,差分100Ω。这个必须准,否则反射会让你怀疑人生。
核心参数速查表
| 参数 | HDMI 1.4 | HDMI 2.0 | HDMI 2.1 |
|---|---|---|---|
| 最大速率 | 3.4 Gbps/通道 | 6.0 Gbps/通道 | 12 Gbps/通道 |
| 时钟频率 | 340 MHz | 600 MHz | 1200 MHz |
| 编码方式 | TMDS 8b/10b | TMDS 8b/10b | FRL 16b/18b |
你想想看,HDMI 2.1的速率到了12Gbps,信号上升沿已经快到皮秒级了。PCB走线稍微拐个直角,反射就够你喝一壶的。我曾经因为一个过孔没处理好,导致4K@60Hz死活上不去,最后发现是过孔残桩太长。
4.2 数据链路层:数据怎么打包,怎么纠错
数据链路层,负责把物理层的比特流组织成有意义的数据包。它定义了数据包的格式、同步机制和错误检测。
这里有几个关键概念:
- 数据岛周期:传输音频和辅助数据。它发生在消隐区,不影响视频。
- 视频数据周期:传输像素数据。每个像素被编码成10位TMDS字符。
- 控制周期:传输控制信号,比如HSYNC、VSYNC。
数据链路层还负责BCH纠错码。HDMI 2.1引入了FEC(前向纠错),这在长距离传输时特别有用。我记得有一次调试一个15米的HDMI线,画面偶尔闪一下,打开FEC后,问题就消失了。
调试小技巧:用示波器抓TMDS时钟通道,看时钟是否连续。如果时钟有毛刺或抖动过大,大概率是物理层的问题,别急着查数据链路层。
4.3 应用层:EDID、HDCP、CEC,这些你都得懂
应用层是离用户最近的一层。它定义了设备之间怎么握手、怎么协商、怎么保护内容。
应用层主要包含:
- EDID:显示器告诉源端,我能支持什么分辨率、什么色深。我建议,调试时先读EDID,很多兼容性问题都是EDID写错了。
- HDCP:内容保护协议。HDCP 2.2和2.3的握手流程不一样,2.3多了个RSA认证。我曾经遇到一个机顶盒,HDCP 2.2能过,2.3就过不了,最后发现是接收端的密钥存储有问题。
- CEC:消费电子控制。一个遥控器控制所有设备。CEC的调试很烦,因为它走的是低速单线总线,干扰多。
应用层还有一个容易被忽略的东西——InfoFrame。它携带了视频格式、色彩空间、动态范围等信息。如果画面颜色不对,先查AVI InfoFrame里的色彩空间字段。
4.4 数据包类型概览:你看到的每一帧,都是包
HDMI的数据传输,本质上就是各种数据包的组合。我整理了一下,主要的数据包类型有这些:
| 包类型 | 用途 | 传输周期 |
|---|---|---|
| 视频数据包 | 传输像素数据 | 视频数据周期 |
| 音频数据包 | 传输音频样本 | 数据岛周期 |
| InfoFrame包 | 传输元数据 | 数据岛周期 |
| 控制包 | 传输HSYNC/VSYNC | 控制周期 |
| 辅助数据包 | 传输厂商自定义数据 | 数据岛周期 |
每个数据包都有固定的包头和包体。包头里包含了包类型和版本号。接收端根据包头决定怎么解析后面的数据。
注意:HDMI 2.1的FRL模式下,数据包结构变了。它不再用TMDS字符,而是用16b/18b编码。如果你还在用老方法解析,肯定出问题。
4.5 三层架构的关系:一张图看懂
说了这么多,咱们用一张图把三层架构串起来。这张图是我自己画的,你一看就明白。
这张图很直观。应用层生成数据,交给数据链路层打包,最后物理层发出去。接收端反过来,物理层收信号,数据链路层解包,应用层解析。
嗯,这里要注意。三层之间不是完全独立的。比如HDCP的握手,既涉及应用层的密钥交换,也涉及数据链路层的包封装。调试时,如果HDCP过不去,别只盯着应用层,数据链路层的包格式也可能有问题。
4.6 避坑指南:我踩过的那些坑
最后,分享几个我实际项目中遇到的坑,希望能帮你少走弯路。
- EDID读取失败:我曾经遇到一个显示器,EDID的校验和算错了。源端读不到正确EDID,直接输出640x480。解决办法:用I2C工具手动读EDID,重新计算校验和。
- HDCP 2.2握手超时:接收端回复太慢,源端等不及就放弃了。我建议,在HDCP握手期间,不要做其他I2C操作,避免总线冲突。
- CEC干扰:CEC线跟其他信号线走得太近,导致误触发。解决办法:CEC线单独走,加一个上拉电阻到3.3V。
- TMDS时钟抖动:电源纹波太大,导致PLL锁不住。我建议,给HDMI芯片单独供电,加LC滤波。
总结一下:HDMI协议三层架构,物理层管信号,数据链路层管包,应用层管内容。调试时,从物理层开始,一层一层往上查。别跳层,否则你会绕很多弯路。
可可精品资料库