2. AUDIO DAC
AW30N AUDIO_DAC支持单声道,此DAC支持16bit精度。
- 各芯片音频性能对比情况如下:
芯片DAC性能对比
AC104N
AD16N
AW30N
Output Swing(空载)
430mVrms
760mVrms
564mVrms
SNR
83dB
97dB
93dB
DR
82dB
96dB
93dB
THD
-70dB
-82dB
-85dB
Noise Floor
30uVrms
11uVrms
12uVrms
表1 AUDIO_DAC性能对比
AW30N AUDIO_DAC采样率:
AW30N AUDIO 采样率支持情况
采样率
DAC
APA
8000
yes
null
11025
yes
null
12000
yes
null
16000
yes
null
22050
yes
null
24000
yes
null
32000
yes
yes
44100
yes
yes
48000
yes
yes
64000
yes
null
88200
yes
null
96000
yes
null
表2 AUDIO_DAC采样率支持情况
AUDIO DAC 工作模式:
AW30N AUDIO 工作模式
DAC
单声道单端DAC
APA
单声道单端APA
单声道差分APA
ALINK
双声道 Alink
表3 AUDIO_DAC工作模式
2.1. 《app_config.c》中的开机默认配置
- Audio公共部分和AUDIO DAC包含以下配置:
vcm外挂电容;
音频系统低压配置;
2.2. 《audio_dac.h》中的开机默认配置
在audio_dac.h的宏定里面主要有以下:
1、选择音频 通过 内置Class-D功放的APA模块 或者 模拟DAC模块输出 或者 Audio_Link模块输出;
![]()
音频输出选择
2.2.1. APA工作模式
APA工作模式
工作模式特点
MODE1
支持单端,单端输出性能好
MODE2
支持差分,差分输出性能好
MODE3
暂不支持
工作模式可根据图2.1所示,在《apa.h》文件中的 AUDAC_OUTPUT_MODE 来选择:
![]()
audio apa工作模式选择
APA的驱动方式有:
- 差分直推喇叭(推荐使用MODE2)
- 该驱动方式对应MODE1、MODE2模式,通过APAP和APAN引脚输出,内置功放。
![]()
差分直推喇叭示意图
- 单端隔直推功放(推荐使用MODE1)
- 该驱动方式对应MODE1模式,通过APAP、APAN引脚输出推功放(不支持立体声)。
![]()
单端隔直推功放原理图
2.2.2. 模拟DAC工作模式
- 单端隔直推功放
该驱动方式在AW30N通过PA5引脚输出,需要外接功放芯片。 注:部分封装没有引出DAC引脚,不可使用RDAC功能!
![]()
dac单端隔直推功放原理图
2.3. AUDIO DAC管理架构
AW30N内置模拟DAC,均支持16bit精度,支持单声道,最高支持96k采样率;DAC固件管理框架同时支持最多2路DAC数据流输出。 AUDIO DAC相关的源代码文件:
apps/app/bsp/common/audio/audio_dac_api.c apps/app/bsp/cpu/bd49/audio_dac_cpu.c apps/include_lib/audio/audio_dac_api.h apps/include_lib/cpu/bd49/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 dac_vol(char set, u8 vol) bool dac_mute(bool mute) bool regist_dac_channel(void \*psound_pre, void \*psound_later, 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.4. AUDIO DAC相关函数
2.4.1. 函数void dac_mode_init(void)
此函数实现对DAC管理结构体和相关解码参数进行初始化,开机初始化调用一次即可。
2.4.2. 函数void dac_init_api(u32 sr)
此函数实现对DAC硬件资源和相关寄存器进行初始化,此处会根据dac.h文件中宏定义DAC_CURR_MODE的值来选择开启DAC工作模式,开机初始化调用一次即可,其中参数:
1、sr:采样率,具体传参,参考表本章表15.1;
2.4.3. 函数dac_sr_api(u32 sr)
采样率设置函数:
1、sr:采样率,具体传参,参考表本章表15.1;
2.4.4. 函数void dac_off_api(void)
关闭dac数字部分的函数。
2.4.5. 函数u8 dac_vol(char set, u8 vol)
音量设置函数:
1、set: ① ‘+’,增大一格数字音量; ② ‘-’,减小一个数字音量; ③ ‘r’,返回当前数字音量; ④ 0,传入0,直接将数字音量设置另一参数vol的值; 2、vol:0-31,当set为0时,直接设置为此音量,最大值为31; 3、返回值: 当前设置的数字音量值;
2.4.6. 函数 bool dac_mute(bool mute)
静音函数:
1、mute: ① 1,静音; ② 0,解除静音; 2、返回值: 暂无意义;
2.4.7. 函数 bool regist_dac_channel(void *psound_pre, void *psound_later, void *kick)
注册数据流到AUDIO DAC管理框架中:
1、psound_pre:sound_out_obj指向的sound数据流,即注册给DAC的前一级sound; 2、psound_later:sound_out_obj指向的sound数据流,即注册给DAC的最后一级sound; 3、kick:触发函数; 4、返回值: 成功 true; 失败 false;
2.4.8. 函数函数bool unregist_dac_channel(void *psound)
将数据流从AUDIO DAC中注销掉:
1、psound:需要注销的sound_out_obj类型的数据流; 2、返回值: 成功 true; 失败 false;
2.4.9. 函数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_later[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.5. AUDIO APA模块特殊函数
2.5.1. 函数void set_apan_output_status(char val)
此函数实现控制APAN引脚输出高/低电平。
- 1、val:输出电平;
0:低电平;
1:高电平;
2.5.2. 函数void set_apap_output_status(char val)
此函数实现控制APAP引脚输出高/低电平。
- 1、val:输出电平;
0:低电平;
1:高电平;
2.5.3. 函数void apa_hardware_mute(u8 mute)
此函数实现控制APA硬件mute模块。
- 1、mute:APA模块mute配置;
1:mute主APA模块;
0:解MUTE;