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总线配置。说白了,就是往芯片内部的寄存器写值,告诉它「你要怎么工作」。配置流程大致分三步:
- 上电复位——芯片上电后,先等它稳定,大概10ms左右。
- 初始化序列——写入一组预定义的寄存器值,让芯片进入工作状态。
- 动态调整——根据输入信号特性,实时调整一些参数,比如均衡器、色彩空间等。
我记得第一次调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寄存器读写都是基本功。先把页式管理搞明白,再谈其他高级功能。初始化序列一定要逐条验证,别指望一次成功。
这张图把整个流程串起来了。从选型开始,到I2C配置,再到功能验证,每一步都有坑。你想想看,如果选型时没考虑色彩深度,后面调出来画面偏色,那得多折腾。
最后说一句,做硬件开发,文档就是圣经。数据手册里每个寄存器的默认值、每个bit的含义,都要仔细看。我见过太多人因为「大概看了一下」就动手,结果在同一个坑里摔好几次。