第 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); }