第 5 章 AUDIO 功能

1、概述

HID和SPP_AND_LE 新添加了AUDIO的实现示例代码,需要使用AUDIO功能要在板级配置使能 TCFG_AUDIO_ENABLE ,如下代码所示:

//支持Audio功能,才能使能DAC/ADC模块
#ifdef CONFIG_LITE_AUDIO
#define TCFG_AUDIO_ENABLE                   ENABLE
#if TCFG_AUDIO_ENABLE
#undef TCFG_AUDIO_ADC_ENABLE
#undef TCFG_AUDIO_DAC_ENABLE
#define TCFG_AUDIO_ADC_ENABLE               ENABLE_THIS_MOUDLE
#define TCFG_AUDIO_DAC_ENABLE               ENABLE_THIS_MOUDLE

2、Audio的使用

DAC硬件输出参数配置

在板级配置文件里面有如下配置:
/*
DAC硬件上的连接方式,可选的配置:
    DAC_OUTPUT_MONO_L               左声道
    DAC_OUTPUT_MONO_R               右声道
    DAC_OUTPUT_LR                   立体声
    DAC_OUTPUT_MONO_LR_DIFF         单声道差分输出
*/
#define TCFG_AUDIO_DAC_CONNECT_MODE         DAC_OUTPUT_MONO_LR_DIFF

需要根据具体的硬件接法,配置 TCFG_AUDIO_DAC_CONNECT_MODE 宏。

MIC配置和使用

1)配置说明
在每个 board.c 文件里都有配置 mic 参数的结构体,如下所示:
 struct adc_platform_data adc_data = {
     .mic_channel    = TCFG_AUDIO_ADC_MIC_CHA,                   //MIC通道选择,对于693x,MIC只有一个通道,固定选择右声道
 /*MIC LDO电流档位设置:
     0:0.625ua    1:1.25ua    2:1.875ua    3:2.5ua*/
    .mic_ldo_isel   = TCFG_AUDIO_ADC_LDO_SEL,
/*MIC 是否省隔直电容:
    0: 不省电容  1: 省电容 */
#if ((TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR) || (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_DUAL_LR_DIFF))
    .mic_capless    = 0,//四声道与双声道差分使用,不省电容接法
#else
    .mic_capless    = 0,
#endif
/*MIC免电容方案需要设置,影响MIC的偏置电压
    21:1.18K    20:1.42K    19:1.55K    18:1.99K    17:2.2K     16:2.4K     15:2.6K     14:2.91K    13:3.05K    12:3.5K     11:3.73K
    10:3.91K    9:4.41K     8:5.0K      7:5.6K      6:6K        5:6.5K      4:7K        3:7.6K      2:8.0K      1:8.5K              */
    .mic_bias_res   = 16,
/*MIC LDO电压档位设置,也会影响MIC的偏置电压
    0:2.3v  1:2.5v  2:2.7v  3:3.0v */
    .mic_ldo_vsel  = 2,
/*MIC电容隔直模式使用内部mic偏置*/
    .mic_bias_inside = 1,
/*保持内部mic偏置输出*/
    .mic_bias_keep = 0,
    // ladc 通道
    .ladc_num = ARRAY_SIZE(ladc_list),
    .ladc = ladc_list,
};
主要关注以下变量:
① mic_capless:0:选用不省电容模式 1:选用省电容模式;
② mic_bias_res:选用省电容模式的时候才有效,mic 的上拉偏置电阻,选择范围为:
1:16K 2:7.5K 3:5.1K 4:6.8K 5:4.7K 6:3.5K 7:2.9K 8:3K 9:2.5K 10:2.1K 11:1.9K 12:2K 13:1.8K 14:1.6K 15:1.5K 16:1K 31:0.6K;
③ mic_ldo_vsel:mic_ldo 的偏置电压,与偏置电阻共同决定 mic 的偏置,选择范围为:0:2.3v 1:2.5v 2:2.7v 3:3.0v;
④ mic_bias_inside:mic 外部电容隔直,芯片内部提供偏置电压,当 mic_bias_inside=1,可以正常使用 mic_bias_res 和 mic_ldo_vsel。
2)自动校准 MIC 偏置电压
使用省电容模式时,可在 app_config.h 配置 TCFG_MC_BIAS_AUTO_ADJUST,选择 MIC 的自动校准模式,自动选择对应的MIC 偏置电阻和偏置电压。配置如下:

不省电容无法校准。

 /*
*省电容mic偏置电压自动调整(因为校准需要时间,所以有不同的方式)
*1、烧完程序(完全更新,包括配置区)开机校准一次
*2、上电复位的时候都校准,即断电重新上电就会校准是否有偏差(默认)
*3、每次开机都校准,不管有没有断过电,即校准流程每次都跑
*/
#define MC_BIAS_ADJUST_DISABLE      0   //省电容mic偏置校准关闭
#define MC_BIAS_ADJUST_ONE          1   //省电容mic偏置只校准一次(跟dac trim一样)
#define MC_BIAS_ADJUST_POWER_ON     2   //省电容mic偏置每次上电复位都校准(Power_On_Reset)
#define MC_BIAS_ADJUST_ALWAYS       3   //省电容mic偏置每次开机都校准(包括上电复位和其他复位)
#define TCFG_MC_BIAS_AUTO_ADJUST    MC_BIAS_ADJUST_POWER_ON
#define TCFG_MC_CONVERGE_TRACE      0   //省电容mic收敛值跟踪

Audio_MIDI的文件下载配置

1)在SDKcpubr23tools下添加对应 midi.bin 文件,在同级目录的 download.bat 下添加下载项:

isd_download.exe -tonorflash -dev br23 -boot 0x12000 -div8 -wait 300 -uboot uboot.boot -app app.bin cfg_tool.bin -res midi.bin %1

download.bat 同级目录的 isd_config.ini 文件添加:

INTERNAL_DIR_ALIGN=0X2; //flash 内目录里的文件起始地址4对齐。

2)在对应的 SDK\apps\spp_and_le\board\br23\board_ac635n_demo_cfg.h 文件中,使能AUDIO功能:

#define TCFG_AUDIO_ENABLE                                      1//DISABLE
#define AUDIO_MIDI_CTRL_CONFIG               1 //midi电子琴接口使能 ,开这个宏要关掉低功耗使能
关闭低功耗模式:
#define TCFG_LOWPOWER_LOWPOWER_SEL                     0//SLEEP_EN
//SNIFF状态下芯片是否进入powerdown#if TCFG_USER_BLE_ENABLE

3)在 SDK/cpu/br23/audio_dec/audio_dec_midi_ctrl.c 中做如下设置:具体函数内容以SDK为准。

oid midi_paly_test(u32 key)
{
    static u8 open_close = 0;
    static u8 change_prog = 0;
    static u8 note_on_off = 0;
    switch (key) {
    case KEY_IR_NUM_0:
        if (!open_close) {
            /* midi_ctrl_dec_open(16000);//启动midi key */
            //midi_ctrl_dec_open(16000, "storage/sd0/C/MIDI.bin\0");//启动midi key  SD卡
            midi_ctrl_dec_open(16000,SDFILE_RES_ROOT_PATH"MIDI.bin\0");//启动midi key 系统
        } else {
            midi_ctrl_dec_close();//关闭midi key
        }
        open_close = !open_close;
        break;
    case KEY_IR_NUM_1:
        if (!change_prog) {
            midi_ctrl_set_porg(0, 0);//设置0号乐器,音轨0
        } else {
            midi_ctrl_set_porg(22, 0);//设置22号乐器,音轨0
        }
        change_prog = !change_prog;
        break;
    case KEY_IR_NUM_2:
        if (!note_on_off) {
            //模拟按键57、58、59、60、61、62,以力度127,通道0,按下测试
            ...
        } else
            //模拟按键57、58、59、60、61、62松开测试
          ...
        }
        note_on_off = !note_on_off;
         break;
    default:
        break;
    }
}

4)在 app_spp_and_le.c 种调用midi_play_test()函数播放对应文件:

static void app_key_event_handler(struct sys_event *event)
{
     ......
#if TCFG_AUDIO_ENABLE
if (event_type == KEY_EVENT_CLICK && key_value == TCFG_ADKEY_VALUE0) {
        /*midi test*/
     printf(">>>key0:open midi\n");
      midi_paly_test(KEY_IR_NUM_0);
        }
 if (event_type == KEY_EVENT_CLICK && key_value == TCFG_ADKEY_VALUE1) {

             printf(">>>key0:set  midi\n");
             midi_paly_test(KEY_IR_NUM_1);
        }
        if (event_type == KEY_EVENT_CLICK && key_value == TCFG_ADKEY_VALUE2)
             printf(">>>key2:play  midi\n");
             midi_paly_test(KEY_IR_NUM_2);        }