20

主题

0

好友

80

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
240818
帖子
327
精华
0
经验
80 点
金钱
58 ¥
注册时间
2010-9-15
发表于 2023-4-14 13:27 | 显示全部楼层
本帖最后由 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时表示未锁定。
1.png
下面贴出测试正常的程序,其中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);
                }

20

主题

0

好友

80

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
240818
帖子
327
精华
0
经验
80 点
金钱
58 ¥
注册时间
2010-9-15
 楼主| 发表于 2023-4-14 13:28 | 显示全部楼层
如有另外的应用心得也欢迎提出宝贵意见,共同学习进步

23

主题

0

好友

1556

积分

侠之大者 当前离线

Rank: 6Rank: 6

UID
282322
帖子
4596
精华
0
经验
1556 点
金钱
1508 ¥
注册时间
2011-1-13
发表于 2023-4-14 15:49 来自手机端 | 显示全部楼层
支持分享!点赞楼主

0

主题

0

好友

448

积分

业余侠客 当前离线

Rank: 4

UID
273745
帖子
511
精华
0
经验
448 点
金钱
416 ¥
注册时间
2010-12-19
发表于 2023-4-14 16:42 | 显示全部楼层

支持分享!

4

主题

0

好友

599

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
876741
帖子
574
精华
0
经验
599 点
金钱
571 ¥
注册时间
2020-4-27
发表于 2023-4-14 22:33 | 显示全部楼层
其实 WM8805 有一个 INT_N 的信号
可从 GPO 送到 MCU/DSP。
用中断比轮询更有利程序运行。 WM8805_page39-INT_N_2023-04-14 21-45-54.png

20

主题

0

好友

80

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
240818
帖子
327
精华
0
经验
80 点
金钱
58 ¥
注册时间
2010-9-15
 楼主| 发表于 2023-4-22 09:19 | 显示全部楼层
Upuops 发表于 2023-4-14 22:33
其实 WM8805 有一个 INT_N 的信号
可从 GPO 送到 MCU/DSP。
用中断比轮询更有利程序运行。

INT_N信号需要多走一根线,比不上轮询的设计方便,而且对于现在的单片机而言,几十毫秒轮询一次根本不是什么问题,I2C对时序要求又不高,总体来说查寄存器比检测信号更方便

237

主题

14

好友

1508

积分

侠之大者 当前离线

Rank: 6Rank: 6

UID
2616
帖子
3091
精华
0
经验
1508 点
金钱
1180 ¥
注册时间
2005-1-7
发表于 2023-5-4 20:39 | 显示全部楼层
http://bbs.hifidiy.net/forum.php ... d=668679&extra=

2012年玩的时候解决的办法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc.

返回顶部