.. _AUDIO_ADC章节:  

AUDIO ADC
=========================================


    AW30N AUDIO ADC 一通道,支持单声道,支持 模拟MIC输入 或者 LINEIN输入。

    +----------+---------------+
    |AW30N AUDIO 采样率支持情况|
    +----------+---------------+
    |采样率    |AUDIO_ADC      |
    +==========+===============+
    |8000      |yes            |
    +----------+---------------+
    |11025     |yes            |
    +----------+---------------+
    |12000     |yes            |
    +----------+---------------+
    |16000     |yes            |
    +----------+---------------+
    |22050     |yes            |
    +----------+---------------+
    |24000     |yes            |
    +----------+---------------+
    |32000     |yes            |
    +----------+---------------+
    |44100     |yes            |
    +----------+---------------+
    |48000     |yes            |
    +----------+---------------+

    .. centered:: 表1 AUDIO_ADC采样率支持情况


    AUDIO ADC - MIC 工作模式   


    +-----------+----------------+----------------+------------------+
    |AW30N AUDIO ADC - MIC 工作模式                                  |
    +===========+================+================+==================+
    |ADC MIC    |内置偏置电阻    |外置偏置电阻    |差分              |
    +-----------+----------------+----------------+------------------+

    .. centered:: 表2 AW30N AUDIO ADC - MIC  工作模式 


    AUDIO ADC - LINEIN 工作模式

    +-----------+-----------------------------+
    |AW30N AUDIO ADC - LINEIN 工作模式        |
    +===========+=============================+
    |LINEIN     |ADC 转数字注册到DAC的注册表  |
    +-----------+-----------------------------+

    .. centered:: 表3 AW30N AUDIO ADC - LINEIN 工作模式 


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


《app_config.c》中的开机默认配置
################################################################

    如图1中Audio公共部分和AUDIO ADC包含以下配置:
        1. vcm外挂电容;
        2. 音频系统低压配置;
        3. ADC_MIC前级/后级增益;
        4. ADC_MIC偏置方式选择和偏置电阻/电压选择;
        5. ADC_MIC输入引脚选择;
        6. ADC_MIC差分输入选择;
        7. ADC_LINEIN增益;
        8. ADC_LINEIN差分输入选择;
        9. ADC_LINEIN输入引脚选择;

    AW30N ADC相关引脚使用情况,用户选择ADC输入引脚前,需根据ADC功能配置情况选择:

    ===================   ==========================================
    I/O 引脚                功能  
    ===================   ==========================================
    PA4                     1.单端micin
    PA5                     1.单端micin 2.模拟DAC输出 3.打印输出口
    PA6                     1.单端micin 2.差分mic N端输入
    PA7                     1.单端micin 2.micldo/micbias输出
    PA8                     1.单端micin
    ===================   ==========================================



《audio_adc.h》中的开机默认配置
################################################################
    在audio_adc.h的宏定里面主要有以下:

    - 1、选择 通过 AUDIO_ADC模块输入 或者 AUDIO_LINK模块输入;

        .. image:: audio_select_adc_alink.png
            :alt: "图 AUDIO_ADC 输入配置“
            :align: center
        .. centered:: 图 AUDIO_ADC 输入配置

AUDIO ADC 部分配置
****************************************************************************************************

    相关配置在 **cpu_config.c** 里。

    AUDIO_ADC - MIC配置
        - AUDIO_MIC_RS_MODE const audio_adc_mic_rs_mode:AUDIO_ADC输入方式选择:
            1. mic_rs_inside:MICBIAS方案,PA7 I/O 输出内部MICLDO + 内置可调电阻;
            2. mic_rs_outside:MICLDO方案,PA7 I/O 输出内部MICLDO + 外置电阻;
            3. mic_rs_null:外部提供偏置方案,外置电源 + 外置电阻;
        - AUDIO_MICBIAS_RS const audio_adc_mic_bias_rs:使能MICBIAS方案时,选择内置偏置电阻大小
            1. 0.5k内置偏置电阻;
            2. 1.0k内置偏置电阻;
            3. ...
            4. 10.0k内置偏置电阻;
        - AUDIO_MICLDO_VS const audio_adc_mic_ldo_vs:使能MICLDO方案时,选择PA7 I/O 输出LDO电压大小
            1. 2.0v偏置电压输出;
            2. 2.2v偏置电压输出;
            3. ...
            4. 3.0v偏置电压输出;
        - AUDIO_MIC_INPUT_MODE const audio_adc_mic_input_mode:选择MIC输入IO;
            1. PA8 I/O 作为音频输入;
            2. PA4 I/O 作为音频输入;
            3. PA5 I/O 作为音频输入,开启模拟DAC时该引脚为输出脚,不可作为MIC输入;
            4. PA6 I/O 作为音频输入,开启差分mic时该引脚默认为N端输入脚,不可使用该引脚作为P端输入;
            5. PA7 I/O 作为音频输入,开启内置偏置时该引脚为偏置电压输出脚,不可作为MIC输入;

    AUDIO_ADC - MIC两级增益选择:
      - u32 const audio_adc_mic_pga_n6db:MIC前级-6dB增益;
        1. 0:不使能-6dB增益;
        2. 1:使能-6dB增益;
        3. 注:使能-6dB增益档位后,后级增益档位不可超过9dB!
      - AUDIO_MICPGA_G const audio_adc_mic_pga_g:MIC后级增益档位,根据枚举变量选择
        1. 0dB增益;
        2. 3dB增益;
        3. 9dB增益;
        4. 15dB增益;
        5. 21dB增益;

    AUDIO_ADC - LINEIN一级增益选择:
      - AUDIO_MICPGA_G const audio_adc_aux_pga_g:LINNEINN增益档位,根据枚举变量选择
        1. 0dB增益;
        2. 3dB增益;
        3. 9dB增益;
        4. 15dB增益;
        5. 21dB增益;

    配置总览:

        .. image:: mic_input_config.png
            :alt: "图1.4 AUDIO_ADC输入配置“
            :align: center
        .. centered:: 图1.4 AUDIO_ADC MIC输入配置



^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

AUDIO ADC管理架构
################################

    | AW30N内置AUDIO_ADC,此AUDIO_ADC支持16bit精度,单声道,最高支持48k采样率;
    | AUDIO_ADC固件管理框架只支持一路AUDIO_ADC输入,最多2路将ADUIO_ADC采集到的数据流输出。

    AUDIO ADC相关的源代码文件: ::

        apps/app/bsp/common/audio/audio_adc_api.c
        apps/app/bsp/cpu/uc03/audio_adc_cpu.c
        apps/include_lib/audio/audio_adc_api.h
        apps/include_lib/cpu/uc03/audio_adc.h

    下图是Audio ADC 管理框架对应的结构体。

    .. image:: aa-4-1-adc-mag.png
        :alt: "图4.1 audio adc 管理框架“
        :align: center
    .. centered:: 图4.1 audio adc 管理框架


    AUDIO ADC主要有以下函数: ::

        void audio_adc_mode_init(void)
        u32 audio_adc_init_api(u32 sr, AUDIO_ADC_MODE mode, u32 ch)
        void audio_adc_off_api(void)
        void fill_audio_adc_fill(u8 *buf, u32 len)
        bool regist_audio_adc_channel(void *psound, void *kick)
        bool unregist_audio_adc_channel(void *psound)

.. _AUDIO_ADC驱动模式说明:

AUDIO ADC驱动模式
****************************************************************************************************
    MICIN 使用方式比较多,这里将其分类为以下几种使用方式,并将MIC与芯片的PIN口连接关系表示出来。

.. note::
    相关引脚与芯片引脚对应关系:(对应芯片手册里的IO_mapping)

        | **MICBIAS** 固定占用芯片的PA7引脚(该电压值由LDO电压经过内置偏置电阻分压出来)
        | **AIN_A0** (即AIN_AP1) 对应 PA8(默认SDK里PA8还作为AD按键口)
        | **AIN_A1** (即AIN_AP1) 对应 PA4
        | **AIN_A2** (即AIN_AP1) 对应 PA5(默认SDK里PA5还作为DAC的输出口 / 打印口)
        | **AIN_A3** (即AIN_AP1) 对应 PA6(PA6同时还是差分mic的固定N端,使用差分时P端不可再选择PA6)
        | **AIN_A4** (即AIN_AP1) 对应 PA7(PA7同时还是MIC_BIAS供电口)

    .. image:: diff_mic_config.png
        :alt: "图4.6 差分MICIN配置示例“
        :align: center
    .. centered:: 图4.6 差分MICIN配置示例

单端MICIN(使用芯片内部偏置电阻)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    | 该方式即 **MICBIAS(PA7)** 给mic供电,使用 **AIN_AP0/1/2/3** 给芯片AUDIO_ADC输入信号,使用芯片的 **内部偏置电阻**。
    | 在app_config.h里把 **AMM_RS_INSIDE_ENABLE** 打开

    .. image:: ad-4-2-adc-micin-bias.png
        :alt: "图4.2 单端MICIN使用内部偏置电阻示意图“
        :align: center
    .. centered:: 图4.2 单端MICIN使用内部偏置电阻示意图


单端MICIN(使用芯片外部偏置电阻)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    | 该方式即 **MICBIAS(PA7)** 给mic供电,使用 **AIN_AP0/1/2/3** 给芯片AUDIO_ADC输入信号, **外部带隔直电容且使用外置电阻**。
    | 在app_config.h里把 **AMM_RS_OUTSIDE_ENABLE** 打开

    .. image:: ad-4-3-adc-micin-ldo.png
        :alt: "图4.3 单端MICIN使用外部偏置电阻示意图“
        :align: center
    .. centered:: 图4.3 单端MICIN使用外部偏置电阻示意图


省电容MICIN(使用内部偏置电阻)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    | 该方式即 **MICBIAS(PA7)** 给mic供电,同时使用 **AIN_AP4(即PA7)** 给芯片AUDIO_ADC输入信号,使用芯片的 **内部偏置电阻**。
    | 在app_config.h里把 **AMM_RS_INSIDE_ENABLE** 打开
    | 经验值内部偏置电阻(audio_adc_mic_bias_rs)选 7 档左右。

    .. image:: micin_bias_pa7.png
        :alt: "图4.4 省电容mic内部偏置电阻示意图“
        :align: center
    .. centered:: 图4.4 省电容mic内部偏置电阻示意图“

    `FAQ: AW30N怎么使用省电容、省电阻的MIC接法? <https://gitee.com/Jieli-Tech/AW30N/issues/IAEZ60>`_
    
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

差分MICIN(使用内部偏置电阻)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    | 该方式即 **MICBIAS(PA7)** 给mic供电,使用 **AIN_AP0/1/2** 作为差分的P端 给芯片AUDIO_ADC输入信号,使用芯片的 **内部偏置电阻**。
    | 差分模式下N端固定为芯片的PA6引脚。
    | 在app_config.h里把 **AMM_RS_INSIDE_ENABLE** 和 **AMM_DIFF_ENABLE** 打开

    .. image:: micin_diff_inside_resistor.png
        :alt: "图4.5 差分mic内部偏置电阻示意图“
        :align: center
    .. centered:: 图4.5 差分mic内部偏置电阻示意图“

差分MICIN(使用外部偏置电阻)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    | 该方式即 **MICBIAS(PA7)** 给mic供电,使用 **AIN_AP0/1/2** 给芯片AUDIO_ADC输入信号,使用芯片的 **外部偏置电阻**。
    | 差分模式下N端固定为芯片的PA6引脚。
    | 在app_config.h里把 **AMM_RS_OUTSIDE_ENABLE** 和 **AMM_DIFF_ENABLE** 打开

    .. image:: ad-4-4-adc-micin-diff.png
        :alt: "图4.6 差分MICIN使用外部偏置电阻示意图“
        :align: center
    .. centered:: 图4.6 差分MICIN使用外部偏置电阻示意图



^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


AUDIO ADC相关函数
################################


函数void audio_adc_mode_init(void)
****************************************************************************************************

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

函数u32 audio_adc_init_api(u32 sr, ADC_MODE mode, u32 throw_sp_num)
****************************************************************************************************

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

        1、sr:采样率;
            ① 8000;
            ② 12000;
            ③ 16000;
            ④ ...;
            ⑤ 48000;

        2、mode:AUDIO_ADC模式(具体模式对应的IO口在cpu_config.c定义);
            ① AUDIO_ADC_MIC :  选择AUDIO_ADC数据来源为MIC采集;
            ② AUDIO_ADC_LINEIN : 选择AUDIO_ADC数据来源为LINEIN输入;
            ③ AUDIO_LINK : 选择ALINK模块; 

        3、throw_sp_num:第一次启动AUDIO_ADC抛弃的样点数;(该参数对AUDIO_LINK无效)

        4、返回值:成功 0;

函数bool audio_adc_enable(void)
********************************************

    此函数实现启动Audio_ADC模块与Audio_ADC中断,使用该函数之前确保Audio_ADC已经被初始化。

        1、返回值:启动成功 1;
                  启动失败 0(失败的原因是audio_adc已被启动,该函数流程防止重复启动);

函数void audio_adc_off_api(void)
****************************************************************************************************

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

函数 bool regist_audio_adc_channel(void \*psound_pre, void \*psound_later, void \*kick)
****************************************************************************************************

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

        1、psound_pre:sound_out_obj指向的sound结构体,即接收ADC数据的SOUND;
        2、psound_later:sound_out_obj指向的sound结构体,即接收ADC数据的后一级SOUND;(常用来存储经过音效算法、SRC后的数据)
        3、kick:kick函数;
        4、返回值:
            成功 true;
            失败 false;

函数bool unregist_audio_adc_channel(void \*psound)
****************************************************************************************************

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

        1、psound:sound_out_obj指向的sound结构体,对应接收ADC数据的SOUND;
        2、返回值:
                成功 true;
                失败 false;

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

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

        1、buf:AUDIO_ADC转换后样点存放的缓存buf;
        2、len:该buf的大小,默认为160个byte,说明AUDIO_ADC一次采样到起中断有80个样点;

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

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