2. 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
表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
表2 AUDIO_DAC采样率支持情况
- AUDIO DAC 工作模式:
AD16N AUDIO 工作模式
DAC
立体声
差分
单声道单端DACL
单声道单端DACR
表3 AUDIO_DAC工作模式
2.1. 《app_config.c》中的开机默认配置
Audio公共部分和AUDIO DAC包含以下配置:
1.vcm外挂电容; 2.vcmo0/1电压; 3.dac 模拟增益; 4.左右声道输出;
2.1.1. Audio公共部分
const bool config_vcm_cap_addon:vcm外挂电容配置;
软件默认不外挂电容;
如果软件选择了外挂电容,硬件却没有电容连接,会导致音频性能大幅降低;
VCM正确挂载了电容的情况下,软件悬着外挂电容会比不外挂电容音频性能更好;
2.1.2. 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
![]()
图1.1 audio config
2.2. 《audio_dac.h》中的开机默认配置
在audio_dac.h的宏定里面主要有以下:
1、四种工作模式,一种立体声,三种单声道;
2、AUDIO DAC样点的位宽;
2.2.1. 工作模式
模式 |
详解 |
---|---|
A_DAC_MONO_L |
此模式DAC会将左右声道的数据合并输出到左声道,软件中的数据流依旧是双声道的; |
A_DAC_MONO_R |
此模式DAC会将左右声道的数据合并输出到右声道,软件中的数据流依旧是双声道的; |
A_DAC_STERO |
标准立体声模式; |
A_DAC_DIEF |
以差分方式输出信号; |
工作模式可根据图2.1所示,在《audio_dac.h》文件中的 AUDAC_OUTPUT_MODE 来选择:
2.2.2. 位宽
目前芯片支持16位位宽和24位位宽,但是SDK只支持了16位位宽;
![]()
图2.1 audio dac 位宽
2.3. AUDIO DAC示例
如图4,有audio dac使用的示例,实例中做了以下事情:
① 初始化测试数据流,此数据流为DAC提供样点数据;
② 初始化AUDIO 公共部分;
③ 初始化AUDIO DAC模块,这一步完成之后audio dac就能起中断;
④ 初始化数据流句柄;
⑤ 注册数据流句柄;
⑥ 循环将ADC采样获取的样点数据打印出来。
![]()
图3.1 audio dac demo
2.3.1. 开打AUDIO DAC硬件
① 初始化AUDIO公共部分;
② 初始化AUDIO DAC部分;
![]()
图3.2 audio dac 初始化
2.3.2. 关闭AUDIO DAC硬件
① 关闭AUDIO DAC数字部分;
② 关闭AUDIO DAC模拟部分;
![]()
图3.3 关闭audio dac
2.3.3. 关闭AUDIO DAC与AUDIO硬件
① 关闭AUDIO DAC数字部分;
② 关闭AUDIO DAC模拟部分;
③ 关闭AUDIO硬件的数字部分;
④ 关闭AUDIO硬件的模拟部分;
⑤ 关闭AUDIO的时钟;
注:从上面第③步开始关闭了AUDIO公共部分后,包含AUDIO DAC和AUDIO ADC在内的所有AUDIO部分将不能再工作!
![]()
图3.4 关闭audio dac & audio公共部分
2.4. AUDIO 全关闭示例
① 关闭AUDIO DAC数字部分;
② 关闭AUDIO DAC模拟部分;
③ 关闭AUDIO ADC数字部分;
④ 关闭AUDIO ADC模拟部分;
⑤ 关闭AUDIO硬件的数字部分;
⑥ 关闭AUDIO硬件的模拟部分;
⑦ 关闭AUDIO的时钟;
![]()
图4.1 全面audio
2.5. 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 管理框架对应的结构体。
![]()
图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)
2.5.1. AUDIO DAC驱动模式
AUDIO DAC主要有下面几种驱动模式;
2.5.1.1. 立体声
![]()
图5.2 audio dac 立体声
2.5.1.2. 差分单声道
![]()
图5.3 audio dac 差分输出
2.5.1.3. 单声道单端直推
![]()
图5.4 audio dac 单端直推
2.5.2. AUDIO DAC共VCM0模式
AC16N有VCMO0 和VCOM1引脚能输出一个和DAC工作电压一样的电压;
正确配置后VCMO0/1能输出一个和DAC工作电压一样的电压,这样在耳机方案应用中,使用VCOM0/1作为公共端,可以省掉DAC输出所需的隔直电容, 配置方法参考本章的配置章节的内容。
下图是利用VCMO做公共端时的连接方式。
![]()
图5.5 audio dac 共VCM0模式
2.6. AUDIO DAC相关函数
2.6.1. 函数void dac_mode_init(void)
此函数实现对DAC管理结构体和相关解码参数进行初始化,开机初始化调用一次即可。
2.6.2. 函数void dac_init_api(u32 sr)
此函数实现对DAC硬件资源和相关寄存器进行初始化,此处会根据dac.h文件中宏定义DAC_CURR_MODE的值来选择开启DAC工作模式,开机初始化调用一次即可,其中参数:
1、sr:采样率,具体传参,参考表本章表15.1;
2.6.3. 函数dac_sr_api(u32 sr)
采样率设置函数:
1、sr:采样率,具体传参,参考表本章表15.1;
2.6.4. 函数void dac_off_api(void)
关闭dac数字部分的函数。
2.6.5. 函数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、返回值: 当前设置的数字音量值;
2.6.6. 函数u8 dac_vol(char set, u8 vol)
音量设置函数:
1、set: ① ‘+’,增大一格数字音量; ② ‘-’,减小一个数字音量; ③ ‘r’,返回当前数字音量; ④ 0,传入0,直接将数字音量设置另一参数vol的值; 2、vol:0-31,当set为0时,直接设置为此音量,最大值为31; 3、返回值: 当前设置的数字音量值;
2.6.7. 函数bool dac_mute(bool mute)
静音函数:
1、mute: ① 1,静音; ② 0,解除静音; 2、返回值: 暂无意义;
2.6.8. 函数函数bool regist_dac_channel(void *psound, void *kick)
注册数据流到AUDIO DAC管理框架中:
1、psound:sound_out_obj指向的sound数据流; 2、kick: 触发函数; 3、返回值: 成功 true; 失败 false;
2.6.9. 函数函数bool unregist_dac_channel(void *psound)
将数据流从AUDIO DAC中注销掉:
1、psound:需要注销的sound_out_obj类型的数据流; 2、返回值: 成功 true; 失败 false;
2.6.10. 函数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转换;
2.6.11. 函数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:右声道增益;
2.6.12. 函数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:右声道增益;