3. AUDIO DAC

开发者在阅读本章节之前,建议先阅读AUDIO公共章节了解其工作模式和相关依赖”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);

3.1. AUDIO DAC工作模式

AD24N的DAC输出方式分为 APA模拟DAC 两种,下面将介绍如何配置两者的工作依赖以及工作模式。

3.1.1. APA的工作依赖与工作模式配置

3.1.1.1. 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

×

3.1.1.2. 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引脚输出,内置功放。
    "差分直推喇叭示意图“

    差分直推喇叭示意图

    "差分直推模式配置“

    差分直推模式配置


3.1.2. 模拟DAC的工作依赖与工作模式配置

3.1.2.1. 模拟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

×

3.1.2.2. 模拟DAC的工作方式

模拟DAC支持的工作方式只有一种。

  1. 单端隔直推功放
    该驱动方式通过DAC脚(AD24N使用PB0)输出,需要外接功放芯片。
    注:部分封装没有引出DAC引脚,不可使用RDAC功能!
    "单端隔直推功放示意图“

    dac单端隔直推功放示意图


3.2. AUDIO DAC其他配置

AD24N的AUDIO DAC其他配置在 audio_dac_cpu.h 。可配置项如下

SR_DEFAULT:开机时DAC的采样率

3.3. AUDIO DAC接口介绍

3.3.1. 函数void dac_mode_init(u16 vol, void *phy_vol_set_func)

此函数实现对DAC管理结构体和相关解码参数进行初始化,开机初始化调用一次即可。其中参数

3.3.2. 函数void dac_init_api(u32 sr, bool delay_flag)

此函数实现对DAC硬件资源和相关寄存器进行初始化,此处会根据dac.h文件中宏定义DAC_CURR_MODE的值来选择开启DAC工作模式,开机初始化调用一次即可,其中参数:

1、sr:采样率,默认选择为32000;

2、delay_flag:该参数无用;

3.3.3. 函数void dac_off_api(void)

此函数实现关闭所有DAC模块。

3.3.4. 函数bool dac_mute(bool mute)

此函数实现对DAC的软件mute,其中参数:

1、mute:mute值;
① 1,设置mute状态;
② 0,解除mute状态;

3.3.5. 函数u8 dac_vol(char set, u8 vol)

此函数实现设置DAC的数字音量,其中参数:

1、set:
    ① ‘+’,      增大一格数字音量;
    ② ‘-’,      减小一个数字音量;
    ③ ‘r’,      返回当前数字音量;
    ④ 0,        传入0,直接将数字音量设置另一参数vol的值;
2、vol:0-31,当set为0时,直接设置为此音量,最大值为31;
3、返回值:当前设置的数字音量值;

3.3.6. 函数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;

3.3.7. 函数bool unregist_dac_channel(void *psound)

此函数实现将DAC注册列表中指定的sound_out_obj删除,其中参数:

1、psound:sound_out_obj指向的sound结构体;
2、返回值:
    成功 true;
    失败 false;

3.3.8. 函数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转换;