AUDIO DAC ========================================= 开发者在阅读本章节之前,建议先阅读AUDIO公共章节了解其工作模式和相关依赖":ref:`AUDIO公共`" AD24N内置应用于语音场合的APA和模拟DAC,两者均支持16bit精度,单声道。 同时AD24N支持最多3路DAC解码输出。 玩具AD系列各芯片支持的AUDIO DAC采样率如下: =========== ================== ============== ======== ======== ============ ============ DAC采样率 AD24N(APA&模拟DAC) AD14N/AC104N AD15N AD17N AD18N(APA) AD18N(RDAC) =========== ================== ============== ======== ======== ============ ============ 8000 √ √ √ 不支持 不支持 √ 11025 √ 不支持 不支持 不支持 不支持 不支持 12000 √ √ √ 不支持 不支持 √ 16000 √ √ √ 不支持 不支持 √ 22050 √ 不支持 不支持 不支持 不支持 不支持 24000 √ √ √ 不支持 不支持 √ 32000 √ √ √ √ √ √ 44100 √ 不支持 不支持 √ √ √ 48000 √ 不支持 不支持 √ √ √ 64000 √ 不支持 不支持 不支持 不支持 不支持 88200 √ 不支持 不支持 不支持 不支持 不支持 96000 √ 不支持 不支持 不支持 不支持 不支持 =========== ================== ============== ======== ======== ============ ============ | 本章介绍DAC相关的依赖、配置、结构体以及接口。 | Audio DAC涉及相关文件,分别是app/lib/dac_api.c和include_lib/audio/dac_api.h以及include_lib/audio/dac.h。 Audio DAC有以下结构体: :: typedef struct _DAC_MANAGE { sound_out_obj *sound[DAC_CHANNEL_NUMBER]; void (*kick[DAC_CHANNEL_NUMBER])(void *); //kick函数 u8 ch; //解码通道数 u16 vol_phy; //模拟音量 u8 vol; //数字音量 u8 flag; //标志位 } DAC_MANAGE; Audio DAC主要有以下函数接口: :: void dac_mode_init(u16 vol, void \*phy_vol_set_func); void dac_init_api(u32 sr, bool delay_flag); void dac_sr_api(u32 sr); void dac_off_api(void); bool dac_mute(bool mute); bool regist_dac_channel(void *psound, void *kick); bool unregist_dac_channel(void *psound); u8 dac_vol(char set, u8 vol); void fill_dac_fill(u8 *buf, u32 len); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AUDIO DAC工作模式 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ AD24N的DAC输出方式分为 **APA** 和 **模拟DAC** 两种,下面将介绍如何配置两者的工作依赖以及工作模式。 APA的工作依赖与工作模式配置 --------------------------------------- APA的工作依赖 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 在开启APA之前,需要确保其工作依赖的常量置1,以保证其工作时依赖的模块开启。 audio.c文件中,audio各个模块依赖的const常量如下,因此在开启APA模块时,需要把其依赖的常量置1。按照下表,需要把au_const_apa_en和au_const_dac_digital_en置1。 +----------------------------+--------------+--------------+--------------+ | AD24N AUDIO & APA 工作依赖常量 | +============================+==============+==============+==============+ | | Audio DAC | Audio ADC | Audio APA | +----------------------------+--------------+--------------+--------------+ | au_const_apa_en | × | × | √ | +----------------------------+--------------+--------------+--------------+ | au_const_dac_digital_en | √ | × | √ | +----------------------------+--------------+--------------+--------------+ | au_const_dac_analog_en | √ | × | × | +----------------------------+--------------+--------------+--------------+ | au_const_adda_common_en | √ | √ | × | +----------------------------+--------------+--------------+--------------+ APA的工作模式配置 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ APA的工作模式在audio_apa_cpu.h文件中的 **APA_PWM_MODE** 来选择:支持 =================== ========================================== APA工作模式 工作模式特点 =================== ========================================== APA0_DIFF_SNR 支持差分,差分输出SNR优于APA0_DIFF_THD APA0_DIFF_THD 支持差分,性能更注重THD =================== ========================================== APA工作模式对应的驱动方式: 1. 差分直推喇叭(使用APA0_DIFF_SNR或者APA0_DIFF_THD) 该驱动方式对应APA0_DIFF_SNR、APA0_DIFF_THD模式,通过APAP和APAN引脚输出,内置功放。 .. image:: ad17_diff.png :alt: "差分直推喇叭示意图“ :align: center .. centered:: 差分直推喇叭示意图 .. image:: apa_diff_cfg.png :alt: "差分直推模式配置“ :align: center .. centered:: 差分直推模式配置 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 模拟DAC的工作依赖与工作模式配置 --------------------------------------------------------- 模拟DAC的工作依赖 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 在开启模拟DAC之前,需要确保其工作依赖的常量置1,以保证其工作时依赖的模块开启。 audio.c文件中,audio各个模块依赖的const常量如下,因此在开启APA模块时,需要把其依赖的常量置1。按照下表,需要把au_const_dac_digital_en、au_const_dac_analog_en和au_const_adda_common_en置1。 +----------------------------+--------------+--------------+--------------+ | AD24N AUDIO & APA 工作依赖常量 | +============================+==============+==============+==============+ | | Audio DAC | Audio ADC | Audio APA | +----------------------------+--------------+--------------+--------------+ | au_const_apa_en | × | × | √ | +----------------------------+--------------+--------------+--------------+ | au_const_dac_digital_en | √ | × | √ | +----------------------------+--------------+--------------+--------------+ | au_const_dac_analog_en | √ | × | × | +----------------------------+--------------+--------------+--------------+ | au_const_adda_common_en | √ | √ | × | +----------------------------+--------------+--------------+--------------+ 模拟DAC的工作方式 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 模拟DAC支持的工作方式只有一种。 1. 单端隔直推功放 | 该驱动方式通过DAC脚(AD24N使用PB0)输出,需要外接功放芯片。 | *注:部分封装没有引出DAC引脚,不可使用RDAC功能!* .. image:: ad18n_rdac.png :alt: "单端隔直推功放示意图“ :align: center .. centered:: dac单端隔直推功放示意图 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AUDIO DAC其他配置 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ AD24N的AUDIO DAC其他配置在 **audio_dac_cpu.h** 。可配置项如下 SR_DEFAULT:开机时DAC的采样率 AUDIO DAC接口介绍 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 函数void dac_mode_init(u16 vol, void \*phy_vol_set_func) ---------------------------------------------------------------------------- 此函数实现对DAC管理结构体和相关解码参数进行初始化,开机初始化调用一次即可。其中参数 函数void dac_init_api(u32 sr, bool delay_flag) ---------------------------------------------------------------------------- 此函数实现对DAC硬件资源和相关寄存器进行初始化,此处会根据dac.h文件中宏定义DAC_CURR_MODE的值来选择开启DAC工作模式,开机初始化调用一次即可,其中参数: :: 1、sr:采样率,默认选择为32000; 2、delay_flag:该参数无用; 函数void dac_off_api(void) ---------------------------------------------------------------------------- 此函数实现关闭所有DAC模块。 函数bool dac_mute(bool mute) ---------------------------------------------------------------------------- 此函数实现对DAC的软件mute,其中参数: :: 1、mute:mute值; ① 1,设置mute状态; ② 0,解除mute状态; 函数u8 dac_vol(char set, u8 vol) ---------------------------------------------------------------------------- 此函数实现设置DAC的数字音量,其中参数: :: 1、set: ① ‘+’, 增大一格数字音量; ② ‘-’, 减小一个数字音量; ③ ‘r’, 返回当前数字音量; ④ 0, 传入0,直接将数字音量设置另一参数vol的值; 2、vol:0-31,当set为0时,直接设置为此音量,最大值为31; 3、返回值:当前设置的数字音量值; 函数bool regist_dac_channel(void \*psound, void \*kick) ---------------------------------------------------------------------------- 此函数实现将sound_out_obj注册到DAC中,AD140中一共有3路DAC,其中参数: :: 1、psound:sound_out_obj指向的sound结构体; 2、kick:kick函数; 3、返回值: 成功 true; 失败 false; 函数bool unregist_dac_channel(void \*psound) ---------------------------------------------------------------------------- 此函数实现将DAC注册列表中指定的sound_out_obj删除,其中参数: :: 1、psound:sound_out_obj指向的sound结构体; 2、返回值: 成功 true; 失败 false; 函数void fill_dac_fill_phy(u8 \*buf, u32 len) ---------------------------------------------------------------------------- 此函数实现将解码后的音频样点数据经过处理后推给DAC的缓存buf使DAC进行转换,其中参数: :: 1、buf:DAC即将要进行转换的解码样点数据缓存buf; 2、len:该buf的大小; 该接口实现将解码后的样点数据(存放于dac_mge.sound[i]->p_obuf中)经过处理后输出至DAC。DAC支持16bit精度,一个样点为2个byte。其具体操作如下: :: ① DAC转换一次后,会在转换结束后调用该接口将新的数据样点传给DAC; ② 该接口首先会找到正在解码播放的通道,并读取该解码器解码出来的样点buf; ③ rptr[i]是解码读出的一个原始样点数据,可以读取该数组获得数据; ④ sp_buf[sp_cnt]是经过音量处理后的样点数据,可以读取该数组获得数据; ⑤ sp_buf[sp_cnt]中的数据为最终DAC进行转换的样点数据; ⑥ 待buf中的样点数据全部处理完后,启动kick继续进行下一轮DAC转换;