2. AUDIO ADC(AD24N)

本章介绍 AD24N 的AUDIO_ADC 的相关内容。
AD24N内置应用于语音场合的 AUDIO_ADC ,可外接驻极体MIC或者数字MIC来录制外界声音 或者 linein输入。
此 AUDIO_ADC 支持16bit精度,单声道,支持多种采样率,在工作时只支持1路输入;

Audio ADC支持的采样率情况如下

玩具AD系列各个芯片的AUDIO_ADC采样率支持情况

采样率

AD24N

AD14N

8000

11025

不支持

12000

16000

22050

不支持

24000

32000

不支持

44100

不支持

48000

不支持


2.1. AUDIO_ADC相关配置说明

AUDIO_ADC的配置涉及文件如下

1、app/src/voice_toy/sh58/cpu_config.c
2、app/bsp/cpu/sh58/audio_adc_cpu.c

其中cpu_config.c主要包含audio工作依赖的常量、AUDIO_ADC硬件相关配置(输入口、单独/差分、偏置方式)、AUDIO_ADC性能相关配置(性能模式选择、MIC_PGA增益选择)

2.1.1. cpu_config.c的audio_adc配置说明

"cpu_config.c文件下的AUDIO ADC配置“

cpu_config.c文件下的AUDIO ADC配置

cpu_config.c各个配置说明如下:

AUDIO_ADC工作依赖相关常量配置:

"AUDIO_ADC依赖的常量配置“

AUDIO_ADC依赖的常量配置

cpu_config.c文件中包含AUDIO ADC&DAC以及APA模块运行时依赖的配置,依赖关系如图中表格。因此运行AUDIO_ADC时,需要保证au_const_adda_common_en常量置1.

硬件相关配置

输入口相关配置::

1、audio_adc_mic_input_port:用于控制录音模式、speaker模式以及usb模式的AUDIO_ADC模拟麦输入口。
    目前已支持的输入口详细可见枚举AUDIO_MIC_INPUT_PORT。差分输入时,该配置作为P端输入口,N端固定为PA15。
2、audio_adc_aux_input_port:用于控制linein模式的AUDIO_ADC输入口。目前已支持的输入口详细可见枚举AUDIO_MIC_INPUT_PORT。差分输入时,该配置作为P端输入口,N端固定为PA15。

差分控制开关::

1、audio_adc_diff_mic_mode:用于AUDIO_ADC初始化时传入mode为ADC_MIC模式时,模拟麦输入为 差分 还是 单端。
2、audio_adc_diff_aux_mode:用于AUDIO_ADC初始化时传入mode为ADC_LINE_IN模式时,模拟linein输入为 差分 还是 单端。

偏置相关配置::

1、auadc_mic_rs_pwr_mode:MIC电路供电以及偏置方式选择。支持情况如下:
    (1)MICLDO供电(内部电源,输出口为PA13)+外部偏置电阻;
    (2)MICLDO供电(内部电源,输出口为PA13)+内部偏置电阻;
    (3)以及外置电源+外置电阻。外部电源带来的噪声比较大,所以使用该偏置方式时会有明显噪声。
2、audio_adc_mic_bias_rs:内部偏置电阻阻值配置,具体参考枚举AUDIO_MICBIAS_RS。
3、audio_adc_mic_ldo_vs:MICLDO偏置电压配置,具体参考枚举AUDIO_MICLDO_VS。

性能相关配置:

1、auadc_perf_mode:用于控制ADC的性能模式。
    (1)AUADC_STANDARD为标准性能模式,该模式下的性能为标准性能,功耗为标准;
    (2)AUADC_LOWPOWER_PERF为低功耗性能模式,该模式的功耗较低,但是性能略差。
2、audio_adc_mic_pga_g:AUDIO_ADC的MIC_PGA增益,具体可选档位参考其枚举。

2.2. audio_adc_cpu.c的audio_adc配置说明

"audio_adc_cpu.c文件下的AUDIO ADC配置“

audio_adc_cpu.c文件下的AUDIO ADC配置

AUDIO_ADC中断运行相关配置::

1、throw:AUDIO_ADC中断启动后,抛弃前n个样点。

数字麦相关配置::

数字麦配置需要在使用audio_adc_init_api(u32 sr, ADC_MODE mode, u32 ch)mode传DIGITAL_MIC时配置才生效,具体配置说明如下。
1、audio_adc_dmic_use_ch:数字麦输入通道选择,支持参数对应通道情况如下
    (1)4:输入通道为dmic0上升沿;
    (2)5:输入通道为dmic0下降沿;
    (3)6:输入通道为dmic1上升沿;
    (4)7:输入通道为dmic1下降沿;
2、clk_io:数字麦时钟输出IO,支持output_channel映射。数字麦需要芯片给MIC提供时钟才能使用。
3、data_io:数字麦数据输入IO,支持input_channel映射。数字麦输出的数据由此IO口输入到芯片。
4、data_ch:数字麦输入通道。PORT_FUNC_ICH_PLNK_DAT0对应上面描述的dmic0,PORT_FUNC_ICH_PLNK_DAT1对应上面描述的dmic0。

2.3. AUDIO ADC结构体变量与接口介绍

Audio ADC 的函数接口涉及以下文件,分别是
1. app/lib/adc_api.c
2. include_lib/audio/audio_adc.h。
3. include_lib/audio/audio_analog.h。

Audio ADC有以下结构体:

typedef struct _AUDIO_ADC_MANAGE {
sound_out_obj *sound[ADC_CHANNEL_NUMBER];
void (*kick[ADC_CHANNEL_NUMBER])(void *);   //kick函数
u8 flag;                                    //标志位
} AUDIO_ADC_MANAGE;

Audio ADC主要有以下函数接口:

u32 audio_adc_init_api(u32 sr, ADC_MODE mode, u32 ch);
void audio_adc_enable(u32 gain);
void audio_adc_off_api(void);
bool regist_audio_adc_channel(void *psound, void *kick);
bool unregist_audio_adc_channel(void *psound);

2.3.1. 函数u32 audio_adc_init_api(u32 sr, ADC_MODE mode, u32 ch)

此函数实现对 AUDIO_ADC 硬件资源和相关寄存器进行初始化,此处会根据mode的值来选择AUDIO_ADC数据源,其中参数:

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

2、mode:ADC模式,默认选择为ADC_MIC;
    1、ADC_MIC :ADUIO_ADC数据来源为模拟MIC采集输入。输入IO由ch参数决定
    2、ADC_LINE_IN :AUDIO_ADC数据来源为LINEIN输入。
    3、ADC_MIC_APA :AUDIO_ADC数据来源为APA口输入。
    4、DIGITAL_MIC :ADUIO_ADC数据来源为数字MIC采集输入。

    注:使用ADC_MIC_APA模式时,APA的数字和模拟部分都要关闭,APAP只能与APAN外挂同一个喇叭作差分输入。由于喇叭当MIC用的灵敏度一般都比较低,因此需要配合AUDIO_ADC的增益档位使用

3、ch:选择的ADC通道;
    该参数仅对ADC_MIC模式和ADC_LINE_IN模式有效:表示单端输入的IO口,差分输入时,需要在cpu_config.c把对应mode下的差分开关打开,然后把芯片的N端(AD24N固定为PA15)接到MIC或者LINE线的输出即可。

4、返回值:成功 0,失败 详细见errno-base错误码;

2.3.2. 函数void audio_adc_enable(u32 gain)

此函数实现使能 AUDIO_ADC 数字部分,使用之后,AUDIO ADC将会起中断,向后级输出数据。其中参数gain为无效参数。

2.3.3. 函数void audio_adc_disable(void)

此函数实现关闭所有 AUDIO_ADC 数字模块,使用之后,adc中断将不再启动,需要再次调用。

2.3.4. 函数void audio_adc_off_api(void)

此函数实现关闭所有 AUDIO_ADC 模拟模块,使用之前,需要调用audio_adc_disable()关闭数字模块。

2.3.5. 函数bool regist_audio_adc_channel(void *psound, void *kick)

此函数实现将sound_out_obj注册到 AUDIO_ADC 中,用户可将采集到的数据最多分发两路处理,其中参数:

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

2.3.6. 函数bool unregist_audio_adc_channel(void *psound)

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

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

2.3.7. 函数void fill_audio_adc_fill(u8 *buf, u32 len)

此函数在 AUDIO_ADC 中断中被调用,用于将 AUDIO_ADC 转换出来放在buf里的缓存数据推到指定的空间保存,其中参数:

1、buf:AUDIO_ADC转换后样点存放的缓存buf;
2、len:该buf的大小,默认为160个byte,存有80个样点;

该接口实现将 AUDIO_ADC 转换完成的数据样点写到相应的空间(存放于audio_adc_mge.sound[i]->p_obuf)中,其具体操作如下:

① AUDIO_ADC 转换一次后,会在中断结束后调用该接口将转换的数据样点取走存放于相应的空间;
② 该接口首先会选择正在编码播放的通道,并找到存放样点数据的buf;
③ 一次性将buf中的数据写入注册了该 AUDIO_ADC 通道的audio_adc_mge.sound[i]->p_obuf里;
④ 若kick函数存在则运行kick函数,为空则该AUDIO_ADC填数函数运行完毕。

2.4. AD24N的AUDIO_ADC使用APA口输入模式使用说明

AD24N的AUDIO_ADC使用APA口输入模式之前,需要确保APA功能模块关闭,并且将APAP和APAN两个口设置为高阻。此时如果需要使用DAC输出声音,只能通过模拟DAC输出。

APA口以差分方式外接喇叭,用于录制声音。

需要调用的函数步骤如下(本流程基于system_init已经使用audio_init初始化音频):
1、如果APA已被开启,需要先调用apa_close()关闭apa模块。如果APA未开启,可以之间执行下一个步骤。
2、调用audio_adc_init_api(sr, ADC_MIC_APA, MIC_INPUT_ANA3_APAP)初始化ADC,sr根据自己需求配置采样率。此函数在使用ADC_MIC_APA模式时会将APA口设置为高阻。
3、调用audio_adc_enable(1),使能audio_adc,然后adc中断开始输出数据。

2.5. AD24N的AUDIO_ADC使用数字麦流程

AD24N的AUDIO_ADC使用数字麦之前,用户需要先将数字麦按照以下方式连接到芯片。其中芯片的CLK脚和DATA脚可以通过配置audio_adc_dmic_hdl使用PA10与PA11以外的其他引脚

数字麦

AD24N芯片

VCC

IOVDD

CLK

PA10

DATA

PA11

GND

GND

需要调用的函数步骤如下(本流程基于system_init已经使用audio_init初始化音频):
1、调用audio_adc_init_api(sr, DIGITAL_MIC, 0)初始化ADC,sr根据自己需求配置采样率
2、调用audio_adc_enable(1),使能audio_adc,然后adc中断开始输出数据。