开门见山,这次聊一个很多人都会被卡住的活儿:用ADV7611这颗HDMI采集芯片,把电脑主机输出的画面实时抓进来,送给FPGA做处理或者显示。具体项目背景是“ADV7611采集PC数据调试”,说白了就是搞一块带HDMI输入的板卡,让PC当信号源,ADV7611负责把HDMI的TMDS差分信号变成并行视频数据流。
这颗芯片在视频采集、会议系统、工业相机、医疗影像领域用得非常多,和同门的ADV7604、ADV7612比起来,它支持单链路HDMI 1.4a,最高能到1080p@60Hz,而且价格相对友好,SoC和FPGA项目里经常拿它做“眼睛”。这篇文章适合硬件工程师、嵌入式软件工程师、以及所有想自己调通HDMI采集链路的人,内容会覆盖硬件设计、寄存器初始化、PC端识别流程,还有我踩过的各种坑。
1. 先把方案讲清楚:为什么选ADV7611做PC画面采集
1.1 这套系统整体长什么样
我在这个项目里要做的,其实是一块图像采集板卡。PC的显卡HDMI输出口通过一根标准HDMI线连到板卡的HDMI座子上,信号进入ADV7611后,经过内部均衡、解码、色彩空间转换,最终从并口输出YCrCb或者RGB数据,同时输出像素时钟、行同步、场同步和数据有效信号。
板卡后端接的是一个FPGA,FPGA拿到这些并行数据和同步信号之后,可以去做边缘检测、目标识别、缩放、叠加OSD,也可以直接驱动LCD屏显示。整体链路就是:
PC显卡 -> HDMI线缆 -> HDMI连接器 -> ADV7611 -> 并行视频总线 -> FPGA -> 显示或算法处理
这个方案的好处是数据链路完全掌握在自己手里。比起直接买现成的HDMI转MIPI模块,用ADV7611加FPGA的方案更灵活,分辨率支持范围、输出位宽、色彩格式都能自己配,不受第三方模组限制。而且ADV7611内部带了HDCP解密引擎和EDID处理逻辑,PC端识别它的过程和识别一台普通显示器几乎一模一样,兼容性不用太操心。
1.2 ADV7611对比其他采集芯片的优势
做视频采集的可选芯片不少,除了ADI家的ADV7611,还有TI的TFP401、东芝的TC358749、Lattice的CrossLink系列,甚至可以用FPGA直接解HDMI的TMDS。但我在这类项目里最常用的是ADV7611,原因很直接:
一是输入范围宽。它支持HDMI 1.4a和DVI 1.0,兼容1080p、720p、1080i、720x576等等一票分辨率,市面上绝大部分PC输出都能覆盖。二是输出格式灵活。既能做成8位的BT.656格式,也能输出16位的YCbCr 4:2:2,甚至能做RGB输出,后端接MCU、DSP还是FPGA都行。三是自带HDCP解密,虽然解密之后能否输出还取决于你的HDCP license配置,但至少芯片层面不会直接卡死在加密流上。四是寄存器配置空间大,几乎每个子模块都能单独控制,排查问题的时候特别有用。
当然了,ADV7611的寄存器配置也被很多人吐槽——三个映射空间、几百个寄存器、还有一堆波特率和延迟参数,没有经验的人上手确实容易懵。这也是我写这篇文章的初衷,把关键的配置思路和调试顺序讲明白,比贴一份干巴巴的寄存器清单有用得多。
2. HDMI接口电路设计:最容易埋坑的环节
2.1 HDMI 19脚接口定义与差分走线要点
先看硬件。做HDMI接口电路,第一步是把连接器弄清楚。我遇到不少新手上来就问“为什么没图像”,结果拿万用表一量,HPD脚都没接对,或者DDC通道悬空——PC自然以为显示器不存在,HDMI口根本不会输出信号。
HDMI接口一共19个引脚,常用的可以分成四组:
- TMDS数据通道:Data0、Data1、Data2,这3对差分线,外加一对TMDS Clock
- DDC通道:SCL和SDA,走I2C协议,用来读取显示器的EDID数据
- HPD(Hot Plug Detect,第19脚):热插拔检测,PC通过检测这个引脚的电平来判断显示器是否连接
- 5V电源、CEC、Utility等辅助引脚
我在画板子的时候,TMDS差分对的走线会特别小心。HDMI信号速率在1080p@60Hz下大约是1.5Gbps左右,虽然不算特别夸张,但差分阻抗、等长、回流路径都必须控制好。差分阻抗控制在100欧姆,对内等长尽量控制在5mil以内,对间等长则允许放宽到50mil—100mil。走线尽量少打过孔,如果必须换层,最好成对打孔并在旁边补一个接地过孔,保证回流路径完整。
另外,ESD防护一定不能省。HDMI座子是裸露在外的接口,经常热插拔,静电打进来芯片会直接挂掉。我在每个TMDS通道和DDC、HPD引脚上都加了专用的HDMI ESD保护阵列,钳位电压要够低,响应时间够快。之前有块板子因为没有加ESD,调试的时候插拔了几次,ADV7611的DDC接口就出现随机性的读写失败,最后换芯片才恢复。
2.2 供电、时钟、I2C与HPD/EDID相关电路
ADV7611的电源系统相对复杂,我整理了一下实际项目中用到的供电轨:
| 电源轨 | 电压 | 主要用途 |
|---|---|---|
| AVDD | 1.8V | 模拟核心供电,敏感 |
| DVDD | 1.8V | 数字核心供电 |
| PVDD | 1.8V | PLL供电 |
| IOVDD | 3.3V | IO接口供电 |
这组供电最好都用LDO单独供电,不要直接共用一颗DC-DC的输出然后并联串联,因为模拟部分对纹波特别敏感。1.8V的模拟电源如果纹波超过30mV,TMDS时钟恢复就可能会抖动,表现出来就是图像偶尔闪一下或者颜色偏淡。我在每个电源引脚旁边都放了0.1uF和10uF的电容组合,并且尽量靠近引脚放置,效果实测下来比较稳。
时钟方面,ADV7611需要一颗25MHz的晶振作为参考时钟,我习惯用有源晶振,精度高一些,起振也快。晶振负载电容要按datasheet选型,不要随手挂两个15pF上去,否则频率误差偏大,HDMI锁相会不稳定。
I2C接口需要拉电阻,一般用2.2k到4.7k欧姆,如果I2C总线上挂了多个器件,上拉阻值还要根据总电容调整。ADV7611的I2C地址可以通过ALSB引脚配置,我的板子把ALSB接地,主映射地址是0x98(8位寻址),调试的时候记得读出来的ID要和这个对应上。
HPD和EDID这两条路绝对不能省。HPD引脚在ADV7611上是一个输出,用来告诉PC“这里有一个显示器”,实际上通常需要加一个三极管或MOS管做电平转换和驱动。EDID则更有意思——ADV7611内部没有EDID ROM,你必须外挂一颗EEPROM(比如AT24C02),把标准的1080p EDID数据写进去,通过DDC通道让PC去读。或者让FPGA去模拟这个I2C从机,动态提供EDID内容。这个环节决定了PC显卡是输出4K还是老老实实输出1080p,很多“锁不住信号”的故障根源就在EDID数据这里。
3. ADV7611寄存器初始化与PC信号接入调试
3.1 I2C地址映射和mdubus调试思路
ADV7611最大的特点之一就是寄存器分成三个映射空间:IO Map(主映射)、CP Map(色彩处理映射)、HDMI Map(HDMI 相关映射)。每个映射都有一个独立的I2C从机地址,默认情况下IO Map是0x98,另外两个的地址要查数据手册确认,一般是0xF2和0xF4附近。调试的时候我会先把这三个地址都写对,然后用任意一款USB转I2C工具连上去,配合MDUBUS调试助手就能直接读寄存器了。
MDUBUS是ADI官方出的一个I2C调试软件,和烧录器结合使用非常方便。它能直接填地址、填寄存器、写数据,也能连续读一段寄存器区间,还能保存配置脚本。我的习惯是先把初始化流程用MDUBUS手工跑一遍,确认每一组寄存器写入、读回没有问题,然后再把同样的配置固化到FPGA或者主控的代码里。这样能有效隔离硬件问题和软件问题。
刚开始调的时候,不要一上来就写一堆配置。先把I2C链路跑通,读一下芯片ID确认通信正常,再检查输入信号状态。ADV7611的IO Map里有一个状态寄存器,存放着输入信号锁定信息,没有接HDMI源时是0,接上PC并且TMDS时钟锁定后才会变成1。我每次调试都盯着这个寄存器看,能省下大量瞎猜的时间。
3.2 解锁HDMI与输出格式配置
ADV7611刚上电时,HDMI模块是处于“未解锁”状态的。它的HDMI map里面有一个专门的解锁寄存器,必须先写入正确的解锁码,才能修改HDMI相关的配置,否则你写什么它都无视。我记得第一次调试的时候在这个地方卡了整整一下午,寄存器怎么读都正常,但视频流就是出不来,最后翻数据手册才发现还有解锁这个操作。各位如果碰到写入寄存器后读回值没有变化的情况,可以优先检查是不是没解锁。
解锁完成之后,配置的重点就是输出格式。这里需要明确后端FPGA到底想要什么样的数据。我的项目里用的是8位BT.656格式,也就是说Y和CbCr数据分时复用同一条8位总线。对应的寄存器需要配置:
- 输出数据位宽:8位还是16位
- 输出时序格式:BT.656还是带同步信号的BT.1120
- 色度采样:4:2:2还是4:4:4
这些配置分散在IO Map和CP Map中,每个寄存器都有对应的位定义。不要想着一次全配好,我建议按“输入锁定 -> 输出数据有效 -> 颜色正确”三个阶段逐步验证。先从PC侧把输出分辨率固定为1920x1080@60Hz,然后逐步降低到1280x720,再测试其他分辨率,这样排查问题时会清晰很多。
3.3 用示波器和逻辑分析仪确认识别状态
刚开始调通ADV7611的时候,不要急着去接HDMI线看图像,先观察信号链路各个节点的波形。这样定位问题效率最高。
第一步,测量TMDS时钟通道。用示波器接HDMI座子靠近芯片的一端,应该在1080p@60Hz下看到大约148.5MHz的时钟频率。如果这个频率没有或者偏差太大,说明PC根本没有输出信号,问题在HPD或者EDID上。
第二步,看ADV7611输出端的像素时钟。这个时钟应该是输入TMDS时钟经过分频处理后的结果,通常是74.25MHz(对应1080p)。如果这个时钟没有,大概率是寄存器没配好或者PLL没锁定。
第三步,用逻辑分析仪抓输出端的DE(数据有效)、HS(行同步)、VS(场同步)信号。正常的时序下,DE在高电平期间输出有效像素数据,HS和VS分别代表行和场消隐。抓不出来的话,可以回去查IO Map的输入状态寄存器,确认前端是否锁定。
我自己调试时最常用的组合是示波器加逻辑分析仪,示波器看模拟域和时钟,逻辑分析仪看数字时序。把这些信号都确认正常了,再去看颜色和分辨率是否正确,基本就是顺手的事。
4. 排查实录:PC端黑屏、花屏、锁不住信号的解决方法
4.1 问题1:PC认不到显示器
这个是我遇到最多的问题,表现形式是PC在显示设置里找不到“第二块屏幕”,或者只有一个显示器图标。这种故障90%出在HPD或者EDID上。
先拿万用表量HPD电平,PC端的HDMI座子上HPD引脚应该在接入后变成高电平,这是PC判断“有显示器插上来了”的依据。如果HPD一直是低,PC宁可相信你插的是一根废弃的HDMI转接口,也不会输出信号。HPD电路检查点包括:ADV7611的HPD极性配置是否正确、外部驱动管是否工作、HDMI连接器第19脚是否焊接正常。
HPD正常但还是认不到显示器,就轮到EDID了。PC通过DDC通道读取EDID数据来决定输出什么分辨率,如果读不到EDID或者读到的数据校验失败,PC不会输出任何视频。我的排查方法是逻辑分析仪挂在DDC的SDA和SCL上,热插拔HDMI线的瞬间应该能看到一大串I2C读取动作。如果完全没有读写,说明DDC通道或者EEPROM有问题;如果有读写但PC依然不认,多半是EDID内容有误,可以用专用的EDID工具生成正确的1080p EDID数据重新烧录。
4.2 问题2:有HPD但始终出不了图
HPD和EDID都正常,PC也已经识别到了显示器,但ADV7611输出端就是没有信号。这种时候先读IO Map里的锁定状态寄存器,观察它是否能在接入HDMI后从0变成1。如果一直是0,说明TMDS时钟没有被成功恢复,问题大概率在输入通道。
我之前遇到过一个很诡异的案例:同样一块板子,在实验室里用低端显卡测完全正常,拿到客户现场接高性能显卡就锁不住信号。最后定位到是PCB上TMDS走线过孔太多,信号完整性衰减严重,低端显卡的驱动能力弱一些反而“老实”,高性能显卡输出摆幅大,反射信号反而把接收端搞乱了。解决方案是重新优化了走线,减少不必要的过孔,并且确保TMDS差分对周围不要走其他高频信号线。
如果锁定状态已经为1但是依然没有图像输出,那就检查输出格式配置。有些寄存器值在后端FPGA配置变化后会被覆盖,再次上电时写入顺序不对也会导致输出mute。最简单的验证方法是把输出端的数据线用排线引出来,接一个逻辑分析仪看有没有像素数据在跳变。只要有数据跳变,再把同步信号对齐,图像就出来了。
4.3 问题3:图像花屏或颜色不对
图像花屏和颜色不对属于两种问题,排查方向完全不同。
花屏,也就是画面撕裂、满屏噪点,一般是数据同步出了问题。可能的原因有:输出位宽和FPGA侧不匹配、像素时钟采样相位不对、行场同步极性配置反了。我的排查方法是先用逻辑分析仪确定DE、HS、VS的实际极性,然后去寄存器里把对应的极性标志位改对。对于像素时钟采样相位,ADV7611的datasheet里有一个时钟相位调整寄存器,可以按步进调整,直到画面不再斜纹闪烁为止。这一步说是调寄存器,其实更像玄学,每块板子最优相位都不太一样,只能慢慢试。
颜色不对,比如草地变成紫色、人的肤色发绿,通常是色彩空间转换配置错了。ADV7611支持YCbCr和RGB之间的转换,如果输入是RGB但输出配置成了YCbCr,颜色就会整体偏色。还有一种情况是色彩格式是4:2:2但后端当成4:4:4去处理,导致色度信息错位,画面看起来会有明显的彩色伪影。检查时先把输入信号类型固定,再参照PC端显卡输出格式和ADV7611的转换寄存器一一对照,一般不难定位。
4.4 疑难杂症与排查顺序建议
除了上面三个典型场景,还有一些不太容易一眼看穿的问题。HDCP加密就是其中之一。如果PC播放器输出的是受保护内容(比如蓝光原盘或者一些版权保护的流媒体),ADV7611的解密链路没走通,输出就是黑屏或者满屏雪花。调试时可以先关闭播放器里的硬件解码加速,或者换个普通桌面画面测试。关于HDCP还有一点要注意:解密专利授权和Key是另外申请烧录的,很多板子默认没有这个能力,如果项目确实要播放受保护内容,得提前搞清楚授权链路。
另外音频信号也容易被忽略。ADV7611内置了音频提取功能,可以从HDMI流里分离出I2S或SPDIF信号。如果你的项目还要做音频同步,记得检查HDMI map里的音频配置寄存器和输出引脚配置。我调过一块板子,视频完全正常,但音频死活没有输出,最后发现是音频输出引脚被配置成了GPIO模式,改回音频输出功能后就正常了。
最后总结一下我的排查顺序,初次调试时强烈建议按这个步骤走:
- I2C通信摸底,读芯片ID,确认地址和物理链路没问题
- 确认三个映射的解锁状态,尤其是HDMI map
- 接PC,测量HPD、EDID、TMDS时钟,确认HPD/EDID链路完整
- 看IO Map锁定状态,确认TMDS已经恢复
- 观察输出像素时钟、DE、HS、VS,确认时序配置正确
- 接逻辑分析仪,确认数据线上有有效像素输出
- 接FPGA或者屏幕,验证分辨率和颜色
每步都通过之后再往后走,出现异常时往回回溯,能比漫无目的地改寄存器高效得多。
这个项目调试下来,我个人最大的体会是:ADV7611本身并不复杂,复杂的是HDMI这套生态。PC端、线缆、连接器、供电、寄存器、FPGA时序,任何一个环节掉链子都会导致最终出不了图。很多人刚开始调不出画面,第一反应就是怀疑芯片坏了,其实多数时候是HPD、EDID或者输出格式这几个基础环节没做对。希望这篇文章能帮你少走点弯路,顺利把PC画面抓进自己的系统里。