ADV7611 HDMI采集芯片调试指南:从PC信号接入到FPGA处理
开门见山这次聊一个很多人都会被卡住的活儿用ADV7611这颗HDMI采集芯片把电脑主机输出的画面实时抓进来送给FPGA做处理或者显示。具体项目背景是“ADV7611采集PC数据调试”说白了就是搞一块带HDMI输入的板卡让PC当信号源ADV7611负责把HDMI的TMDS差分信号变成并行视频数据流。这颗芯片在视频采集、会议系统、工业相机、医疗影像领域用得非常多和同门的ADV7604、ADV7612比起来它支持单链路HDMI 1.4a最高能到1080p60Hz而且价格相对友好SoC和FPGA项目里经常拿它做“眼睛”。这篇文章适合硬件工程师、嵌入式软件工程师、以及所有想自己调通HDMI采集链路的人内容会覆盖硬件设计、寄存器初始化、PC端识别流程还有我踩过的各种坑。1. 先把方案讲清楚为什么选ADV7611做PC画面采集1.1 这套系统整体长什么样我在这个项目里要做的其实是一块图像采集板卡。PC的显卡HDMI输出口通过一根标准HDMI线连到板卡的HDMI座子上信号进入ADV7611后经过内部均衡、解码、色彩空间转换最终从并口输出YCrCb或者RGB数据同时输出像素时钟、行同步、场同步和数据有效信号。板卡后端接的是一个FPGAFPGA拿到这些并行数据和同步信号之后可以去做边缘检测、目标识别、缩放、叠加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 ClockDDC通道SCL和SDA走I2C协议用来读取显示器的EDID数据HPDHot Plug Detect第19脚热插拔检测PC通过检测这个引脚的电平来判断显示器是否连接5V电源、CEC、Utility等辅助引脚我在画板子的时候TMDS差分对的走线会特别小心。HDMI信号速率在1080p60Hz下大约是1.5Gbps左右虽然不算特别夸张但差分阻抗、等长、回流路径都必须控制好。差分阻抗控制在100欧姆对内等长尽量控制在5mil以内对间等长则允许放宽到50mil—100mil。走线尽量少打过孔如果必须换层最好成对打孔并在旁边补一个接地过孔保证回流路径完整。另外ESD防护一定不能省。HDMI座子是裸露在外的接口经常热插拔静电打进来芯片会直接挂掉。我在每个TMDS通道和DDC、HPD引脚上都加了专用的HDMI ESD保护阵列钳位电压要够低响应时间够快。之前有块板子因为没有加ESD调试的时候插拔了几次ADV7611的DDC接口就出现随机性的读写失败最后换芯片才恢复。2.2 供电、时钟、I2C与HPD/EDID相关电路ADV7611的电源系统相对复杂我整理了一下实际项目中用到的供电轨电源轨电压主要用途AVDD1.8V模拟核心供电敏感DVDD1.8V数字核心供电PVDD1.8VPLL供电IOVDD3.3VIO接口供电这组供电最好都用LDO单独供电不要直接共用一颗DC-DC的输出然后并联串联因为模拟部分对纹波特别敏感。1.8V的模拟电源如果纹波超过30mVTMDS时钟恢复就可能会抖动表现出来就是图像偶尔闪一下或者颜色偏淡。我在每个电源引脚旁边都放了0.1uF和10uF的电容组合并且尽量靠近引脚放置效果实测下来比较稳。时钟方面ADV7611需要一颗25MHz的晶振作为参考时钟我习惯用有源晶振精度高一些起振也快。晶振负载电容要按datasheet选型不要随手挂两个15pF上去否则频率误差偏大HDMI锁相会不稳定。I2C接口需要拉电阻一般用2.2k到4.7k欧姆如果I2C总线上挂了多个器件上拉阻值还要根据总电容调整。ADV7611的I2C地址可以通过ALSB引脚配置我的板子把ALSB接地主映射地址是0x988位寻址调试的时候记得读出来的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 MapHDMI 相关映射。每个映射都有一个独立的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侧把输出分辨率固定为1920x108060Hz然后逐步降低到1280x720再测试其他分辨率这样排查问题时会清晰很多。3.3 用示波器和逻辑分析仪确认识别状态刚开始调通ADV7611的时候不要急着去接HDMI线看图像先观察信号链路各个节点的波形。这样定位问题效率最高。第一步测量TMDS时钟通道。用示波器接HDMI座子靠近芯片的一端应该在1080p60Hz下看到大约148.5MHz的时钟频率。如果这个频率没有或者偏差太大说明PC根本没有输出信号问题在HPD或者EDID上。第二步看ADV7611输出端的像素时钟。这个时钟应该是输入TMDS时钟经过分频处理后的结果通常是74.25MHz对应1080p。如果这个时钟没有大概率是寄存器没配好或者PLL没锁定。第三步用逻辑分析仪抓输出端的DE数据有效、HS行同步、VS场同步信号。正常的时序下DE在高电平期间输出有效像素数据HS和VS分别代表行和场消隐。抓不出来的话可以回去查IO Map的输入状态寄存器确认前端是否锁定。我自己调试时最常用的组合是示波器加逻辑分析仪示波器看模拟域和时钟逻辑分析仪看数字时序。把这些信号都确认正常了再去看颜色和分辨率是否正确基本就是顺手的事。4. 排查实录PC端黑屏、花屏、锁不住信号的解决方法4.1 问题1PC认不到显示器这个是我遇到最多的问题表现形式是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画面抓进自己的系统里。