1. 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);

1.1. AUDIO DAC配置参数

1.1.1. 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版芯片支持

不支持

"dac模式设置示意图“

dac工作模式设置示意图

DAC的驱动方式介绍:

1)Class-D直接驱动喇叭(DAC_PWM、DAC_DSM2/3/11模式)
该驱动方式通过DACP和DACN引脚输出,内置功放。
"ClassD直接驱动喇叭示意图“

ClassD直接驱动喇叭示意图

2)单端输出驱动单端功放(DAC_DSM7模式)
该驱动方式在AD14N / AC104N通过PB0输出,需要外接功放芯片。(AD15N不支持该驱动方式)
"dac单端输出模式示意图“

dac单端输出模式示意图

1.1.2. AD17N APA驱动模式介绍

AD17N支持的APA工作模式在dac_cpu.h文件中可以进行选择,其中:

AD17N APA工作模式

工作模式特点

MODE1

支持单端,单端输出性能好

MODE2

支持差分,差分输出性能好

MODE3

暂不支持

APA的驱动方式有:

  1. 差分直推喇叭(推荐使用MODE2)
    该驱动方式对应MODE1、MODE2模式,通过APAP和APAN引脚输出,内置功放。
    "差分直推喇叭示意图“

    差分直推喇叭示意图

    "差分直推模式配置“

    差分直推模式配置

  2. 单端隔直推功放(推荐使用MODE1)
    该驱动方式对应MODE1模式,通过APAP、APAN引脚输出推功放(不支持立体声)。
    "单端隔直推功放原理图“

    单端隔直推功放原理图

    "单端隔直推模式配置“

    单端隔直推模式配置

1.1.3. AD18N AUDIO驱动模式介绍

AD18N AUDIO支持Class-D功放的APA工作模式,以及16bit单声道模拟DAC输出的RDAC模式;可在dac_cpu.h文件中可以进行选择,其中:

"AD18N 音频输出方式选择“

AD18N 音频输出方式选择

其中APA配置如下:

AD18N APA工作模式

工作模式特点

MODE1

支持单端,单端输出性能好

MODE2

支持差分,差分输出性能好

MODE3

暂不支持

APA的驱动方式有:

  1. 差分直推喇叭(推荐使用MODE2)
    该驱动方式对应MODE1、MODE2模式,通过APAP和APAN引脚输出,内置功放。
    "差分直推喇叭示意图“

    差分直推喇叭示意图

    "差分直推模式配置“

    差分直推模式配置

  2. 单端隔直推功放(推荐使用MODE1)
    该驱动方式对应MODE1模式,通过APAP、APAN引脚输出推功放(不支持立体声)。
    "单端隔直推功放原理图“

    单端隔直推功放原理图

    "单端隔直推模式配置“

    单端隔直推模式配置

RDAC的驱动方式有:

  1. 单端隔直推功放

    该驱动方式在AD18N通过DAC脚输出,需要外接功放芯片。 注:部分封装没有引出DAC引脚,不可使用RDAC功能!

    "单端隔直推功放原理图“

    dac单端隔直推功放原理图


1.2. AUDIO DAC接口介绍

1.2.1. 函数void dac_mode_init(void)

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

1.2.2. 函数void dac_init_api(u32 sr)

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

1、sr:采样率,默认选择为32000;
    ① 8000;
    ② 12000;
    ③ 16000;
    ④ 24000;
    ⑤ 32000;
    ⑥ 44100;
    ⑦ 48000;

1.2.3. 函数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,延迟;

1.2.4. 函数void dac_off_api(void)

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

1.2.5. 函数bool dac_mute(bool mute)

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

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

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

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

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

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

1.2.8. 函数bool unregist_dac_channel(void *psound)

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

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

1.2.9. 函数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转换;
"函数fill_dac_fill示意图“

图4 fill_dac_fill()调用示意图

1.2.10. 函数void single_apa_startup_mute_cb(void)

此函数在audio初始化时由audio库回调,使用APA引脚MUTE住功放防止po声。仅AD15N/AD17N单端输出时使用

1.2.11. 函数void single_apa_mute(u8 mute)

此函数控制APA 作功放MUTE的IO引脚。仅AD15N/AD17N单端输出时使用,其中参数:

1、mute:
    1:mute住功放;
    0:解mute;