作者的话
ADAU1467是现阶段ADI支持最多通道的ADAU音频DSP,他配合外部的AD/DA,可以实现最多32路音频通道,我在这颗DSP上做过很多项目,就硬件来讲,有4进8出的,12进20出的,20进10出的,8进16出的,各种需求组合。
DSP的开发不是终点,我们做好DSP的音频算法框架后,需要和外界真实世界互联互动,怎么理解这句话?用物理的按钮、旋钮去调音量、静音、EQ参数?用手机APP去控制DSP调音?用自己做的电脑上位机去控制DSP调音,用手持设备去控制DSP调音,这些才是真实世界。怎么去实现,我抛砖引玉,用一块ADAU1467的评估板,和一个MCU控制卡来说一说原理。
硬件准备
ADAU1467EVB开发板
产品链接:https://item.taobao.com/item.htm?id=592748709835&spm=a1z10.5-c.w4002-5192690539.13.2a171c74h8TMLM
USBI仿真器
产品链接:https://item.taobao.com/item.htm?id=38242936768&spm=a1z10.5-c.w4002-5192690539.11.2a9f2dbdbWwG2u
MCU控制卡
产品链接:https://item.taobao.com/item.htm?id=593710434788&spm=a1z10.5-c.w4002-5192690539.17.3839629cZ0XcH8
MCU 控制 DSP 的原理
控制程序源码都提供了,大家直接看就可以。但是我觉得还是要简单说一下 MCU 控制 DSP的原理,让大家能更快的理解。
之前我也反复讲到,从大原理上讲,是 MCU 模拟 USBi 的指令来控制 SS 软件里的模块,但是具体怎么做的呢?
- 控制 SigmaDSP 需要用到 SIGMA_WRITE_REGISTER_BLOCK( )和
SIGMA_SAFELOAD_WRITE_REGISTER( )两个接口函数。SIGMA_WRITE_REGISTER_BLOCK( ) 函数与启动 DSP 的接口函数是一样的,SIGMA_SAFELOAD_WRITE_REGISTER( )接口需要先写到 DSP 里面的 Buffer,然后再触发,参考示意图:
- 编译好 SigmaStudio 工程文件后,用鼠标在 SigmaStudio 界面调节一些参数,然后在下面的Capture window 中可以看到会有如下图的信息,每个鼠标动作都会在 Capture window 出现相应的一行/几行动作。Mode 列中显示的即是控制方式,有 Block Write 和 Safeload Write。
- Block Write 使用 SIGMA_WRITE_REGISTER_BLOCK( ) 函数
这个函数就是普通的 IIC 写操作函数,只要把参数跟底层的参数对应上就可以了。
- Safeload Write 控制方式用 SIGMA_SAFELOAD_WRITE_REGISTER( )函数实现。安全加载方式步骤参考 ADI 相关文档,安全加载地址可以通过数据手册中查找
- 写好 SIGMA_WRITE_REGISTER_BLOCK( )和 SIGMA_SAFELOAD_WRITE_REGISTER( )两个函数之后就要知道单片机程序程序如何关联 SS 的控件以及参数控制,首先单片机程序中要建立 SS控件列表,根据 SS 图中的控件数量来建立这个列表,控件列表在 MCU 工程中的 audio.c 中,
如下图代表建立了四个调音量模块、四个静音开关、两个 SWITCH。
其中 MOD_SINGLE1_GAIN1940ALGNS1_ADDR….这些宏定义在 adau1701_IC_1_PARAM.h 文件中
关联好之后就可以开始写 STM32 对 DSP 的具体控制了。
- 为什么一定要用 Safeload?因为 Safeload 机制可以避免更新 DSP 内核参数时产生噪声。