.. _AUDIO DAC: AUDIO DAC ========================================= AD14N / AD15N / AC104N / AD17N / AD18N内置应用于语音场合的DAC,此DAC支持16bit精度,单声道。 各芯片音频性能对比如下: =================== ============ ============ ================ ================ 芯片APA差分性能对比 AD14N(PWM) AD15N(PWM) AD17N(MODE2) AD18N(MODE2) =================== ============ ============ ================ ================ Output Swing(空载) 2.3Vrms 2.3Vrms 2.2Vrms 2.2Vrms THD -33dB -33dB -70+dB -66+dB =================== ============ ============ ================ ================ =================== ================== ============ ============ 芯片RDAC性能对比 AC104N AD16N AD18N =================== ================== ============ ============ Output Swing(空载) 430mVrms 760mVrms 807mVrms SNR 83dB 97dB 84dB DR 82dB 96dB 84dB THD -70dB -82dB -75dB Noise Floor 30uVrms 11uVrms 50uVrms =================== ================== ============ ============ 同时AD14N / AC104N支持最多3路DAC解码输出,AD15N / AD17N最多支持2路DAC解码输出。 各芯片支持的AUDIO DAC采样率如下: ==================== ============== ======== ======== ============ =========== DAC采样率 AD14N/AC104N AD15N AD17N AD18N(APA) AD18N(RDAC) ==================== ============== ======== ======== ============ =========== 8000 √ √ 不支持 不支持 √ 12000 √ √ 不支持 不支持 √ 16000 √ √ 不支持 不支持 √ 24000 √ √ 不支持 不支持 √ 32000 √ √ √ √ √ 44100 不支持 不支持 √ √ √ 48000 不支持 不支持 √ √ √ ==================== ============== ======== ======== ============ =========== 本章介绍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(void); void dac_init_api(u32 sr); void dac_power_on(u32 sr, bool delay_flag); 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配置参数 ########################################################## AD14N / AD15N / AC104N DAC驱动模式介绍 ************************************************************************** AD14N / AC104N支持的DAC驱动模式模式在dac_cpu.h文件中可以进行选择,其中: ================ ==================== ===================================== ============================ ======================== 芯片DAC工作模式 DAC_PWM DAC_DSM2 DAC_DSM3 & DAC_DSM11 DAC_DSM7 工作模式特点 差分推,功耗较低 差分/单端推,音质好,功耗较高 差分推,音质好、功耗高 输出模拟信号,音质好 ================ ==================== ===================================== ============================ ======================== AD14N / AC104N 支持 仅C版芯片支持 仅C版芯片支持 支持单端推 AD15N 支持 支持 仅C版芯片支持 不支持 ================ ==================== ===================================== ============================ ======================== .. image:: dac_mode.png :alt: "dac模式设置示意图“ :align: center .. centered:: dac工作模式设置示意图 DAC的驱动方式介绍: 1)Class-D直接驱动喇叭(DAC_PWM、DAC_DSM2/3/11模式) 该驱动方式通过DACP和DACN引脚输出,内置功放。 .. image:: 1-class-D.png :alt: "ClassD直接驱动喇叭示意图“ :align: center .. centered:: ClassD直接驱动喇叭示意图 2)单端输出驱动单端功放(DAC_DSM7模式) 该驱动方式在AD14N / AC104N通过PB0输出,需要外接功放芯片。(AD15N不支持该驱动方式) .. image:: mode-5-a.png :alt: "dac单端输出模式示意图“ :align: center .. centered:: dac单端输出模式示意图 .. 3)APA单端输出驱动单端功放(DAC_DSM2模式单端输出) 该驱动方式在AD15N可通过APAP或者APAN输出,并将另一个IO口作为功放MUTE使用。 .. image:: ad15_single_apa.png :alt: "AD15N DSM2单端输出参考原理图“ :align: center .. centered:: AD15N DSM2单端输出参考原理图 在 dac_cpu.c文件中配置输出脚和MUTE脚,并选择开机MUTE脚的状态(根据功放MUTE电平来选择)防止开机po声; .. image:: ad15_single_apa_01.png :alt: "AD15N DSM2单端输出配置“ :align: center .. centered:: AD15N DSM2单端输出配置 .. _AD17N APA驱动模式介绍: AD17N APA驱动模式介绍 ************************************************************************** AD17N支持的APA工作模式在dac_cpu.h文件中可以进行选择,其中: =================== ================================ AD17N APA工作模式 工作模式特点 =================== ================================ MODE1 支持单端,单端输出性能好 MODE2 支持差分,差分输出性能好 MODE3 暂不支持 =================== ================================ APA的驱动方式有: 1. 差分直推喇叭(推荐使用MODE2) 该驱动方式对应MODE1、MODE2模式,通过APAP和APAN引脚输出,内置功放。 .. image:: ad17_diff.png :alt: "差分直推喇叭示意图“ :align: center .. centered:: 差分直推喇叭示意图 .. image:: ad17_diff_select.png :alt: "差分直推模式配置“ :align: center .. centered:: 差分直推模式配置 2. 单端隔直推功放(推荐使用MODE1) 该驱动方式对应MODE1模式,通过APAP、APAN引脚输出推功放(不支持立体声)。 .. image:: ad17_single_apa.png :alt: "单端隔直推功放原理图“ :align: center .. centered:: 单端隔直推功放原理图 .. image:: ad17_single_btl_select.png :alt: "单端隔直推模式配置“ :align: center .. centered:: 单端隔直推模式配置 .. 1. 并联推功放 该驱动方式对应MODE1的PBTL模式,通过APAP、APAN叠加输出(P端与N端同相位),可提高输出功率。 .. image:: ad17_single_pbtl_2.png :alt: "并联推功放示意图“ :align: center .. centered:: 并联推喇叭示意图 .. image:: ad17_single_pbtl_select.png :alt: "并联推模式配置“ :align: center .. centered:: 并联推模式配置 AD18N AUDIO驱动模式介绍 ************************************************************************** AD18N AUDIO支持Class-D功放的APA工作模式,以及16bit单声道模拟DAC输出的RDAC模式;可在dac_cpu.h文件中可以进行选择,其中: .. image:: ad18n_audio_select.png :alt: "AD18N 音频输出方式选择“ :align: center .. centered:: AD18N 音频输出方式选择 其中APA配置如下: =================== ================================ AD18N APA工作模式 工作模式特点 =================== ================================ MODE1 支持单端,单端输出性能好 MODE2 支持差分,差分输出性能好 MODE3 暂不支持 =================== ================================ APA的驱动方式有: 1. 差分直推喇叭(推荐使用MODE2) 该驱动方式对应MODE1、MODE2模式,通过APAP和APAN引脚输出,内置功放。 .. image:: ad17_diff.png :alt: "差分直推喇叭示意图“ :align: center .. centered:: 差分直推喇叭示意图 .. image:: ad18_diff_select.png :alt: "差分直推模式配置“ :align: center .. centered:: 差分直推模式配置 2. 单端隔直推功放(推荐使用MODE1) 该驱动方式对应MODE1模式,通过APAP、APAN引脚输出推功放(不支持立体声)。 .. image:: ad17_single_apa.png :alt: "单端隔直推功放原理图“ :align: center .. centered:: 单端隔直推功放原理图 .. image:: ad18_single_btl_select.png :alt: "单端隔直推模式配置“ :align: center .. centered:: 单端隔直推模式配置 RDAC的驱动方式有: 1. 单端隔直推功放 该驱动方式在AD18N通过DAC脚输出,需要外接功放芯片。 *注:部分封装没有引出DAC引脚,不可使用RDAC功能!* .. image:: ad18n_rdac.png :alt: "单端隔直推功放原理图“ :align: center .. centered:: dac单端隔直推功放原理图 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AUDIO DAC接口介绍 ########################################################## 函数void dac_mode_init(void) ************************************************************************** 此函数实现对DAC管理结构体和相关解码参数进行初始化,开机初始化调用一次即可。 函数void dac_init_api(u32 sr) ************************************************************************** 此函数实现对DAC硬件资源和相关寄存器进行初始化,此处会根据dac.h文件中宏定义DAC_CURR_MODE的值来选择开启DAC工作模式,开机初始化调用一次即可,其中参数: :: 1、sr:采样率,默认选择为32000; ① 8000; ② 12000; ③ 16000; ④ 24000; ⑤ 32000; ⑥ 44100; ⑦ 48000; 函数void dac_power_on(u32 sr, bool delay_flag) ************************************************************************** 此函数实现所有DAC模块的初始化,其中参数: :: 1、sr:采样率,默认选择为32000; ① 8000; ② 12000; ③ 16000; ④ 24000; ⑤ 32000; ⑤ 44100; ⑤ 48000; 2、delay_flag:延迟标志,上电时初始化dac需要延迟至少1.2ms,运行后不需要; ① 0,不延迟; ② 1,延迟; 函数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(u8 \*buf, u32 len) ************************************************************************** 此函数实现将解码后的音频样点数据经过处理后推给DAC的缓存buf使DAC进行转换,其中参数: :: 1、buf:DAC即将要进行转换的解码样点数据缓存buf; 2、len:该buf的大小,默认为1k个byte,存有512个样点; 该接口实现将解码后的样点数据(存放于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进行转换的样点数据; ⑥ 待512个样点数据全部处理完后,启动kick继续进行下一轮DAC转换; .. image:: fill_dac_fill.png :alt: "函数fill_dac_fill示意图“ :align: center .. centered:: 图4 fill_dac_fill()调用示意图 函数void single_apa_startup_mute_cb(void) ************************************************************************** 此函数在audio初始化时由audio库回调,使用APA引脚MUTE住功放防止po声。**仅AD15N/AD17N单端输出时使用**。 函数void single_apa_mute(u8 mute) ************************************************************************** 此函数控制APA 作功放MUTE的IO引脚。**仅AD15N/AD17N单端输出时使用**,其中参数: :: 1、mute: 1:mute住功放; 0:解mute;