HDMI采集与DDR读写实战 - 第4节

HDMI接收芯片选型:ADV7611/ADV7612/SiI9134对比

做HDMI采集,第一关就是选芯片。说实话,市面上能用的HDMI接收芯片就那么几款,ADV7611、ADV7612和SiI9134算是老面孔了。我这些年做过的项目里,这三款都用过,各有各的脾气。

先说说它们的基本定位。ADV7611是单端口HDMI接收器,支持1080p@60Hz。ADV7612是双端口版本,可以同时接两路HDMI输入。SiI9134呢,是Silicon Image的老将,也支持1080p,但它的强项是兼容性——老设备、杂牌信号源,它往往能扛住。

核心参数对比

参数 ADV7611 ADV7612 SiI9134
输入端口数 1 2 1
最大分辨率 1080p@60Hz 1080p@60Hz 1080p@60Hz
色彩深度 8/10/12-bit 8/10/12-bit 8-bit
输出接口 24-bit RGB/YCbCr 24-bit RGB/YCbCr 24-bit RGB/YCbCr
I2C地址 0x4C (默认) 0x4C/0x4E 0x72 (默认)
工作温度 -40°C ~ +85°C -40°C ~ +85°C 0°C ~ +70°C

你看这个表格,ADV7611和ADV7612基本是兄弟关系,寄存器映射几乎一样。SiI9134的8-bit色彩深度是个硬伤,做专业采集卡的话,我建议直接跳过它。

我的建议:如果只做单路1080p采集,ADV7611性价比最高。需要双路输入就上ADV7612。SiI9134嘛,除非你手头有现成的库存,否则不推荐新项目用了。

芯片配置方式

这三款芯片都通过I2C总线配置。说白了,就是往芯片内部的寄存器写值,告诉它「你要怎么工作」。配置流程大致分三步:

  1. 上电复位——芯片上电后,先等它稳定,大概10ms左右。
  2. 初始化序列——写入一组预定义的寄存器值,让芯片进入工作状态。
  3. 动态调整——根据输入信号特性,实时调整一些参数,比如均衡器、色彩空间等。

我记得第一次调ADV7611时,照着数据手册的初始化序列写了一遍,结果输出全是雪花。后来发现是漏了一个复位寄存器——0x10地址的bit 6没置1。嗯,这种坑踩过一次就记住了。

ADV7611典型初始化代码

// ADV7611初始化序列(部分关键寄存器)
void adv7611_init(void) {
    // 复位芯片
    i2c_write(0x4C, 0x10, 0x80);  // 软件复位
    delay_ms(20);
    
    // 配置输入模式
    i2c_write(0x4C, 0x02, 0x00);  // 自动检测输入格式
    i2c_write(0x4C, 0x03, 0x60);  // 使能HDMI输入
    
    // 配置输出格式
    i2c_write(0x4C, 0x15, 0x00);  // 24-bit RGB输出
    i2c_write(0x4C, 0x16, 0x01);  // 使能输出时钟
    
    // 配置色彩空间
    i2c_write(0x4C, 0x18, 0x00);  // 自动色彩空间转换
}

小技巧:初始化序列不要一股脑全写进去。我习惯分步写,每写几个寄存器就读回来验证一下。这样出问题能快速定位到是哪一步错了。

I2C寄存器读写

I2C通信本身不复杂,但HDMI接收芯片的寄存器访问有个特点——很多寄存器是页式管理的。什么意思呢?就是芯片内部把寄存器分成多个页,每页256个地址。你要先写页选择寄存器,才能访问对应页里的寄存器。

拿ADV7611举例,它的页选择寄存器是0xFD和0xFE。0xFD选主页,0xFE选子页。读写流程是这样的:

// ADV7611 页式寄存器写入函数
void adv7611_write_reg(uint8_t page, uint8_t addr, uint8_t value) {
    // 先选择页
    i2c_write(0x4C, 0xFD, page);  // 设置主页
    delay_us(10);
    
    // 再写寄存器
    i2c_write(0x4C, addr, value);
}

// 读取函数类似
uint8_t adv7611_read_reg(uint8_t page, uint8_t addr) {
    i2c_write(0x4C, 0xFD, page);
    delay_us(10);
    return i2c_read(0x4C, addr);
}

注意:切换页之后,一定要加一点延时。我遇到过几次因为延时不够,读回来的数据全是0xFF的情况。10微秒通常够了,但如果你I2C时钟跑得很快,建议加到50微秒。

SiI9134的I2C差异

SiI9134的I2C地址是0x72,而且它没有页式管理。所有寄存器都在一个平面地址空间里,从0x00到0xFF。听起来简单对吧?但它的寄存器定义和ADV7611完全不同,不能直接套用。

我曾经在一个项目里,把ADV7611的初始化代码直接改了个I2C地址就烧给SiI9134用,结果画面颜色完全不对。后来查了半天,发现是色彩空间配置寄存器的位定义不一样。所以啊,换芯片一定要重新看数据手册,别偷懒。

实战中的选型建议

说了这么多,到底怎么选?我总结几条经验:

  • 成本敏感型项目——ADV7611,量大价优,货源稳定。
  • 多路输入需求——ADV7612,一颗顶两颗,省PCB面积。
  • 工业级温度要求——ADV7611/ADV7612,SiI9134只有商业级。
  • 老设备兼容性——SiI9134,虽然参数落后,但抗干扰能力强。

我个人习惯是,新设计一律用ADV7611。为什么?因为它的文档最全,社区支持最好,遇到问题能搜到一堆解决方案。SiI9134的文档我总觉得写得含糊,有些寄存器的描述模棱两可,得靠猜。

核心要点:不管选哪款芯片,I2C寄存器读写都是基本功。先把页式管理搞明白,再谈其他高级功能。初始化序列一定要逐条验证,别指望一次成功。

HDMI接收芯片选型与配置流程 选型决策 ADV7611 / ADV7612 / SiI9134 I2C寄存器配置 页式管理 / 初始化序列 功能验证 读回验证 / 调试 选型考虑因素 • 输入路数:1路 vs 2路 • 色彩深度:8-bit vs 10/12-bit • 工作温度:商业级 vs 工业级 配置关键步骤 1. 上电复位等待10ms 2. 写入初始化序列 3. 动态参数调整 常见问题 • 页切换延时不足 • 初始化序列遗漏 • I2C地址错误

这张图把整个流程串起来了。从选型开始,到I2C配置,再到功能验证,每一步都有坑。你想想看,如果选型时没考虑色彩深度,后面调出来画面偏色,那得多折腾。

最后说一句,做硬件开发,文档就是圣经。数据手册里每个寄存器的默认值、每个bit的含义,都要仔细看。我见过太多人因为「大概看了一下」就动手,结果在同一个坑里摔好几次。

可可精品资料库