AUDIO DAC ========================================= AD16N AUDIO_DAC支持立体声和单声道,此DAC支持16bit精度。 各芯片音频性能对比情况如下: =================== ================== ============ 芯片DAC性能对比 AC104N AD16N =================== ================== ============ Output Swing(空载) 430mVrms 760mVrms SNR 83dB 97dB DR 82dB 96dB THD -70dB -82dB Noise Floor 30uVrms 11uVrms =================== ================== ============ .. centered:: 表1 AUDIO_DAC性能对比 AD16N AUDIO_DAC采样率: +----------+---------------+ |AD16N AUDIO 采样率支持情况| +----------+---------------+ |采样率 |DAC | +==========+===============+ |8000 |yes | +----------+---------------+ |11025 |yes | +----------+---------------+ |12000 |yes | +----------+---------------+ |16000 |yes | +----------+---------------+ |22050 |yes | +----------+---------------+ |24000 |yes | +----------+---------------+ |32000 |yes | +----------+---------------+ |44100 |yes | +----------+---------------+ |48000 |yes | +----------+---------------+ |64000 |yes | +----------+---------------+ |88200 |yes | +----------+---------------+ |96000 |yes | +----------+---------------+ .. centered:: 表2 AUDIO_DAC采样率支持情况 AUDIO DAC 工作模式: +-----------+----------------+----------------+------------------+----------------+ |AD16N AUDIO 工作模式 | +===========+================+================+==================+================+ |DAC |立体声 |差分 |单声道单端DACL |单声道单端DACR | +-----------+----------------+----------------+------------------+----------------+ .. centered:: 表3 AUDIO_DAC工作模式 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 《app_config.c》中的开机默认配置 ################################################################ Audio公共部分和AUDIO DAC包含以下配置: :: 1.vcm外挂电容; 2.vcmo0/1电压; 3.dac 模拟增益; 4.左右声道输出; Audio公共部分 **************************************************************************************************** const bool config_vcm_cap_addon:vcm外挂电容配置; 软件默认不外挂电容; 如果软件选择了外挂电容,硬件却没有电容连接,会导致音频性能大幅降低; VCM正确挂载了电容的情况下,软件悬着外挂电容会比不外挂电容音频性能更好; AUDIO DAC 部分配置 **************************************************************************************************** VCMO0/1输出电压配置,正确配置后VCMO0/1能输出一个和DAC工作电压一样的电压; 这样在耳机方案应用中,使用VCOM0/1作为公共端,可以省掉DAC输出所需的隔直电容; - bool const audio_dac_vcmo0_enable:vcmo0是否输出电压; - bool const audio_dac_vcmo1_enable:vcmo1是否输出电压; - AUDIO_VCMO_VOLTAGE const audio_dac_vcmo0_voltage:vcmo0输出电压挡位,默认为1.2v; - AUDIO_VCMO_VOLTAGE const audio_dac_vcmo1_voltage:vcmo1输出电压挡位,默认为1.2v; - AUDIO_DAC_ANA_VOL const audio_dac_analog_vol_l:DAC模拟增益,可根据枚举变量选择; - AUDIO_DAC_ANA_VOL const audio_dac_analog_vol_r:DAC模拟增益,可根据枚举变量选择; - bool const audio_dac_lpf_lenable:左声道音频输出使能; - bool const audio_dac_lpf_renable:右声道音频输出使能; - bool const audio_dac_lpf_lmute:左声道静音使能,使能后开机初始化会默认mute住DACL; - bool const audio_dac_lpf_rmute:右声道静音使能,使能后开机初始化会默认mute住DACR; *注:VCOM0 / 1也可作为AUDIO_ADC的内置偏置I/O,DAC配置VCOM0 / 1时需要与ADC互斥!* *AUDIO_ADC内置偏置使用VCOM0配置:audio_adc_mic_bias_2_vcmo0* *AUDIO_ADC内置偏置使用VCOM1配置:audio_adc_mic_bias_2_vcmo1* .. image:: a-0-0-audio-config.png :alt: "图1.1 audio config“ :align: center .. centered:: 图1.1 audio config ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 《audio_dac.h》中的开机默认配置 ################################################################ 在audio_dac.h的宏定里面主要有以下: - 1、四种工作模式,一种立体声,三种单声道; - 2、AUDIO DAC样点的位宽; 工作模式 **************************************************************************************************** ============== ============================================================================= 模式 详解 ============== ============================================================================= A_DAC_MONO_L 此模式DAC会将左右声道的数据合并输出到左声道,软件中的数据流依旧是双声道的; A_DAC_MONO_R 此模式DAC会将左右声道的数据合并输出到右声道,软件中的数据流依旧是双声道的; A_DAC_STERO 标准立体声模式; A_DAC_DIEF 以差分方式输出信号; ============== ============================================================================= 工作模式可根据图2.1所示,在《audio_dac.h》文件中的 **AUDAC_OUTPUT_MODE** 来选择: 位宽 **************************************************************************************************** 目前芯片支持16位位宽和24位位宽,但是SDK只支持了16位位宽; .. image:: a-audio-bit_wide.png :alt: "图2.1 audio dac 位宽“ :align: center .. centered:: 图2.1 audio dac 位宽 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AUDIO DAC示例 ################################################################ 如图4,有audio dac使用的示例,实例中做了以下事情: - ① 初始化测试数据流,此数据流为DAC提供样点数据; - ② 初始化AUDIO 公共部分; - ③ 初始化AUDIO DAC模块,这一步完成之后audio dac就能起中断; - ④ 初始化数据流句柄; - ⑤ 注册数据流句柄; - ⑥ 循环将ADC采样获取的样点数据打印出来。 .. image:: ad-3-1-dac-demo.png :alt: "图3.1 audio dac demo“ :align: center .. centered:: 图3.1 audio dac demo 开打AUDIO DAC硬件 **************************************************************************************************** - ① 初始化AUDIO公共部分; - ② 初始化AUDIO DAC部分; .. image:: ad-3-2-dac-init.png :alt: "图3.2 audio dac 初始化“ :align: center .. centered:: 图3.2 audio dac 初始化 关闭AUDIO DAC硬件 **************************************************************************************************** - ① 关闭AUDIO DAC数字部分; - ② 关闭AUDIO DAC模拟部分; .. image:: ad-3-3-dac-off.png :alt: "图3.3 关闭audio dac“ :align: center .. centered:: 图3.3 关闭audio dac 关闭AUDIO DAC与AUDIO硬件 **************************************************************************************************** - ① 关闭AUDIO DAC数字部分; - ② 关闭AUDIO DAC模拟部分; - ③ 关闭AUDIO硬件的数字部分; - ④ 关闭AUDIO硬件的模拟部分; - ⑤ 关闭AUDIO的时钟; 注:从上面第③步开始关闭了AUDIO公共部分后,包含AUDIO DAC和AUDIO ADC在内的所有AUDIO部分将不能再工作! .. image:: ad-3-4-dac-all-off.png :alt: "图3.4 关闭audio dac & audio公共部分“ :align: center .. centered:: 图3.4 关闭audio dac & audio公共部分 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AUDIO 全关闭示例 ################################################################ - ① 关闭AUDIO DAC数字部分; - ② 关闭AUDIO DAC模拟部分; - ③ 关闭AUDIO ADC数字部分; - ④ 关闭AUDIO ADC模拟部分; - ⑤ 关闭AUDIO硬件的数字部分; - ⑥ 关闭AUDIO硬件的模拟部分; - ⑦ 关闭AUDIO的时钟; .. image:: a-audio-all-off.png :alt: "图4.1 全面audio“ :align: center .. centered:: 图4.1 全面audio ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AUDIO DAC管理架构 ################################ AD16N内置DAC,此DAC支持16/24bit精度,支持立体声和单声道,最高支持96k采样率;DAC固件管理框架同时支持最多2路DAC数据流输出。 AUDIO DAC相关的源代码文件: :: apps/app/bsp/common/audio/audio_dac_api.c apps/app/bsp/cpu/uc03/audio_dac_cpu.c apps/include_lib/audio/audio_dac_api.h apps/include_lib/cpu/uc03/audio_dac.h 下图是Audio DAC 管理框架对应的结构体。 .. image:: ad-5-1-dac-mag.png :alt: "图5.1 audio dac管理框架“ :align: center .. centered:: 图5.1 audio dac管理框架 AUDIO DAC主要有以下函数: :: void dac_mode_init(u16 vol) void dac_init_api(u32 sr) void dac_sr_api(u32 sr) void dac_off_api(void) void fifo_dac_fill(u8 *buf, u32 len, AUDIO_TYPE type) u8 stereo_dac_vol(char set, u8 vol_l, u8 vol_r) u8 dac_vol(char set, u8 vol) bool dac_mute(bool mute) bool regist_dac_channel(void *psound, void *kick) bool unregist_dac_channel(void *psound) bool dac_cbuff_active(void *sound_hld) void dac_kick(void *sound_hld, void *pkick) void audio_dac_analog_vol(AUDIO_DAC_ANA_VOL vol_l, AUDIO_DAC_ANA_VOL vol_r) void audio_amux_analog_vol(AUDIO_DAC_AUMX_VOL vol_l, AUDIO_DAC_AUMX_VOL vol_r) AUDIO DAC驱动模式 **************************************************************************************************** AUDIO DAC主要有下面几种驱动模式; 立体声 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. image:: ad-5-2-dac-st.png :alt: "图5.2 audio dac 立体声“ :align: center .. centered:: 图5.2 audio dac 立体声 差分单声道 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. image:: ad-5-3-dac-diff.png :alt: "图5.3 audio dac 差分输出“ :align: center .. centered:: 图5.3 audio dac 差分输出 单声道单端直推 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. image:: ad-5-4-dac-sig.png :alt: "图5.4 audio dac单端直推“ :align: center .. centered:: 图5.4 audio dac 单端直推 AUDIO DAC共VCM0模式 **************************************************************************************************** AC16N有VCMO0 和VCOM1引脚能输出一个和DAC工作电压一样的电压; 正确配置后VCMO0/1能输出一个和DAC工作电压一样的电压,这样在耳机方案应用中,使用VCOM0/1作为公共端,可以省掉DAC输出所需的隔直电容, 配置方法参考本章的配置章节的内容。 下图是利用VCMO做公共端时的连接方式。 .. image:: ad-5-5-dac-vcm0.png :alt: "图5.5 audio dac共 VCM0模式“ :align: center .. centered:: 图5.5 audio dac 共VCM0模式 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AUDIO DAC相关函数 ################################ 函数void dac_mode_init(void) **************************************************************************************************** 此函数实现对DAC管理结构体和相关解码参数进行初始化,开机初始化调用一次即可。 函数void dac_init_api(u32 sr) **************************************************************************************************** 此函数实现对DAC硬件资源和相关寄存器进行初始化,此处会根据dac.h文件中宏定义DAC_CURR_MODE的值来选择开启DAC工作模式,开机初始化调用一次即可,其中参数: :: 1、sr:采样率,具体传参,参考表本章表15.1; 函数dac_sr_api(u32 sr) **************************************************************************************************** 采样率设置函数: :: 1、sr:采样率,具体传参,参考表本章表15.1; 函数void dac_off_api(void) **************************************************************************************************** 关闭dac数字部分的函数。 函数u8 stereo_dac_vol(char set, u8 vol_l, u8 vol_r) **************************************************************************************************** 音量设置函数: :: 1、set: ① ‘+’,增大一格数字音量; ② ‘-’,减小一个数字音量; ③ ‘r’,返回当前数字音量; ④ 0,传入0,直接将数字音量设置另一参数vol的值; 2、vol_l:左声道音量,0-31,当set为0时,直接设置为此音量,最大值为31; 3、vol_r:右声道音量,0-31,当set为0时,直接设置为此音量,最大值为31; 4、返回值: 当前设置的数字音量值; 函数u8 dac_vol(char set, u8 vol) **************************************************************************************************** 音量设置函数: :: 1、set: ① ‘+’,增大一格数字音量; ② ‘-’,减小一个数字音量; ③ ‘r’,返回当前数字音量; ④ 0,传入0,直接将数字音量设置另一参数vol的值; 2、vol:0-31,当set为0时,直接设置为此音量,最大值为31; 3、返回值: 当前设置的数字音量值; 函数bool dac_mute(bool mute) **************************************************************************************************** 静音函数: :: 1、mute: ① 1,静音; ② 0,解除静音; 2、返回值: 暂无意义; 函数函数bool regist_dac_channel(void \*psound, void \*kick) **************************************************************************************************** 注册数据流到AUDIO DAC管理框架中: :: 1、psound:sound_out_obj指向的sound数据流; 2、kick: 触发函数; 3、返回值: 成功 true; 失败 false; 函数函数bool unregist_dac_channel(void \*psound) **************************************************************************************************** 将数据流从AUDIO DAC中注销掉: :: 1、psound:需要注销的sound_out_obj类型的数据流; 2、返回值: 成功 true; 失败 false; 函数void fifo_dac_fill(u8 \*buf, u32 len, AUDIO_TYPE type) **************************************************************************************************** 此函数实现将解码后的音频样点数据经过处理后推给DAC的缓存buf使DAC进行转换,其中参数: :: 1、buf:DAC即将要进行转换的解码样点数据缓存buf; 2、len:该buf的大小,默认为1k个byte,存有512个样点; 3、type: 数据流来源; 该接口实现将解码后的样点数据(存放于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进行转换的样点数据; - ⑥ 待样点数据全部处理完后,启动kick继续进行下一轮DAC转换; 函数void audio_dac_analog_vol(AUDIO_DAC_ANA_VOL vol_l, AUDIO_DAC_ANA_VOL vol_r) **************************************************************************************************** AUDIO DAC 模拟增益: :: 1、vol_l:左声道增益; 2、vol_r:右声道增益; 函数void audio_amux_analog_vol(AUDIO_DAC_AUMX_VOL vol_l, AUDIO_DAC_AUMX_VOL vol_r) **************************************************************************************************** AUDIO LINEIN模拟直通DAC的模拟增益: :: 1、vol_l:左声道增益; 2、vol_r:右声道增益;