- 积分
- 80
- 在线时间
- 143 小时
- 最后登录
- 2024-4-12
- 阅读权限
- 50
- 精华
- 0
- UID
- 240818
- 帖子
- 327
- 精华
- 0
- 经验
- 80 点
- 金钱
- 58 ¥
- 注册时间
- 2010-9-15
|
本帖最后由 lymmale 于 2023-4-14 13:34 编辑
最近做个DAC选用同轴接收芯片的时候,在WM8805和AK4118里面选,两者都号称是抖动性能在5PS,可以说是消费者级别的佼佼者了。但是看到AK4118的datasheet里说明它采用的是高精度的模拟PLL,对比起来,WM8805的反而是数字PLL,应该来说只要会使用软控的话,WM8805的性能比AK4118只会好不会差才对,况且价格还比AK4118要低。查了一下网上的烧友分享,发现没有人分享过实际的程序,所以在这里分享一下自己的编程心得,以供有需要的参考一下。
首先WM8805软控的话,需要PLL寄存器设置好才能正确接收相应的频率信号,在44.1至176的范围内都是用同一个参数就能正常接收的,但是一旦输入192K的信号但是参数又没有更改成正确的设置时,I2S口是没有信号输出的。
经过实际测试,WM8805唯一能够识别是否正确设置了PLL参数的寄存器就是它的UNLOCK位,在官方的数据表里就是寄存器R12(名称是SPDSTAT)的第6位UNLOCK,所以写程序的时候就在主循环里要循环扫描这个UNLOCK位,当它是0时表示正确锁定了信号,是1时表示未锁定。
下面贴出测试正常的程序,其中FLAG_1和FLAG_2是为了交替写入176K以下的参数和192K的参数,当写入参数后能锁定信号则不再写入,当写入参数后不能锁定信号则写入另一个,直到锁定信号。PLL参数按照默认12M晶振输入为例子,SPDIF_LOCK_TIME由定时器计数产生,500代表50MS,这样最多每50MS+固有锁定时长就可以锁定一次信号。读写由I2C方式进行,至于WM8805_R12.Bit.UNLOCK应该有编程基础的应该都能看明白吧,只能介绍这么多了
static _Bool FLAG_1, FLAG_2;
WM8805_R12.Byte=WM8805_READ(12);
if(SPDIF_LOCK_TIME>500 && WM8805_R12.Bit.UNLOCK && !FLAG_1)
{
SPDIF_LOCK_TIME=0;
WM8805_R12.Bit.UNLOCK=1;
FLAG_1=1;
FLAG_2=0;
WM8805_WRITE(3,0x21);
WM8805_WRITE(4,0xFD);
WM8805_WRITE(5,0x36);
WM8805_R6.Bit.PLL_N=7;
WM8805_WRITE(6,WM8805_R6.Byte);
}
if(SPDIF_LOCK_TIME>500 && WM8805_R12.Bit.UNLOCK && !FLAG_2)
{
SPDIF_LOCK_TIME=0;
WM8805_R12.Bit.UNLOCK=1;
FLAG_1=0;
FLAG_2=1;
WM8805_WRITE(3,0xBA);
WM8805_WRITE(4,0x49);
WM8805_WRITE(5,0x0C);
WM8805_R6.Bit.PLL_N=8;
WM8805_WRITE(6,WM8805_R6.Byte);
}
|
|