BP10xx-上位机
1. 系统概述
该音频通信模块是BT_Audio_SDK的核心组件,负责处理音频设备与外部系统(如PC、移动设备等)之间的数据交互。模块支持多种通信方式(UART/USB HID)和丰富的音频处理功能。
2. 通信协议详解
2.1 协议帧格式
模块使用自定义二进制协议,基本帧格式如下:
// 协议帧结构示例
uint8_t tx_buf[256] = {
0xa5, // 帧头1
0x5a, // 帧头2
0x00, // 命令码
0x00, // 数据长度
// ... 数据内容
0x16 // 结束标志
};
2.2 主要命令码
命令码 | 功能描述 | 数据长度 | 备注 |
---|---|---|---|
0x00 | 获取版本信息 | 7 | 返回SDK版本、音频库版本 |
0x01 | 系统控制 | 可变 | 系统模式、采样率等设置 |
0x02 | 系统状态查询 | 15 | RAM、CPU使用率等信息 |
0x03 | ADC0 PGA控制 | 可变 | 线路输入使能/增益设置 |
0x06 | ADC1 PGA控制 | 可变 | 麦克风输入使能/增益设置 |
0x09 | DAC0控制 | 可变 | 输出模式、音量等设置 |
0x0A | DAC1控制 | 可变 | 耳机输出控制 |
0xFC | 用户自定义标签 | 可变 | 音效模式名称获取 |
0xFD | 音效保存到Flash | 1 | 触发音效参数保存操作 |
3. 系统控制详解 (0x01命令)
3.1 系统控制参数
void Comm_Effect_0x01(uint8_t *buf) {
uint16_t TmpData;
switch(buf[0]) {
case 0: // 系统模式 {0=standby, 1=sleep}
gCtrlVars.sys_mode = TmpData;
break;
case 1: // 系统复位 {0=standby, 1=reset}
gCtrlVars.sys_reset = TmpData;
break;
case 2: // 全局采样率使能
gCtrlVars.sys_sample_rate_en = TmpData;
break;
case 3: // 全局采样率设置 (0~8)
gCtrlVars.sys_sample_rate = TmpData;
GlobalSampeRateSet();
break;
case 4: // MCLK时钟源使能
gCtrlVars.sys_mclk_src_en = TmpData;
break;
case 5: // MCLK时钟源选择 (0~4)
gCtrlVars.sys_mclk_src = TmpData;
GlobalMclkSet();
break;
case 6: // 系统默认设置
gCtrlVars.sys_default_set = TmpData;
break;
}
}
3.2 采样率设置
支持多种采样率设置,通过 GlobalSampeRateSet()
函数实现:
值 | 采样率 | 说明 |
---|---|---|
0 | 8kHz | 窄带语音 |
1 | 16kHz | 宽带语音 |
2 | 32kHz | 超宽带语音 |
3 | 44.1kHz | CD音质 |
4 | 48kHz | 专业音频标准 |
5 | 88.2kHz | 高分辨率音频 |
6 | 96kHz | 专业高分辨率音频 |
7 | 176.4kHz | 超高分辨率音频 |
8 | 192kHz | 专业超高分辨率音频 |
4. EQ设置详解
4.1 EQ参数结构
EQ参数通过 eq_unit_aggregate
数组管理,每个EQ单元包含以下参数:
typedef struct {
uint16_t enable; // EQ使能 {0=禁用, 1=启用}
uint16_t freq; // 中心频率(Hz) {20-20000}
uint16_t gain; // 增益值(dB) {-12~+12}
uint16_t q; // Q值 {0.1-10.0, 步进0.1}
} EQ_Unit;
典型EQ频段配置示例
频段类型 | 中心频率(Hz) | Q值 | 应用场景 |
---|---|---|---|
低频 | 80 | 0.7 | 增强低音 |
中低频 | 250 | 1.0 | 人声厚度 |
中频 | 1000 | 1.2 | 乐器清晰度 |
中高频 | 4000 | 1.5 | 人声明亮度 |
高频 | 10000 | 2.0 | 空间感和细节 |
4.2 EQ控制命令
EQ设置主要通过以下方式实现:
- 初始化EQ列表
for(i = 0; i < sizeof(eq_unit_aggregate)/sizeof(eq_unit_aggregate[0]); i++) {
if(EQ_DEFAULT_TABLE[0][i] == 1) {
effect_list[effect_sum] = 4; // EQ类型标识
effect_addr[effect_sum] = (uint32_t)eq_unit_aggregate[i];
effect_list_addr[effect_sum] = eff_addr++;
effect_sum++;
}
}
- EQ参数设置 通过发送包含以下数据的命令帧:
- 命令码:对应音效类型(如0x04表示EQ)
- 数据:包含enable/freq/gain/q等参数
4.3 动态EQ设置
支持动态EQ调节,包括低频和高频的独立调节:
4.4 EQ设置函数
EQ设置主要通过以下函数实现:
- EQ初始化函数
void AudioEffectEQInit(EQUnit *unit, uint8_t channel, uint32_t sample_rate);
- EQ参数配置函数
void AudioEffectEQPregainConfig(EQUnit *unit);
void AudioEffectEQFilterConfig(EQUnit *unit, uint32_t sample_rate);
void AudioEffectEQFilterClearBufConfig(EQUnit *unit, uint32_t sample_rate);
- EQ应用函数
void AudioEffectEQApply(EQUnit *unit, int16_t *pcm_in, int16_t *pcm_out, uint32_t n, uint8_t channel);
- 动态EQ相关函数
void AudioEffectDynamicEqInit(DynamicEqUnit *unit, uint32_t num_channels, uint32_t sample_rate);
void AudioEffectDynamicEqApply(DynamicEqUnit *unit, int16_t *pcm_in, int16_t *pcm_out, int16_t *pcm_watch, uint32_t n);
- EQ模式加载函数
void LoadEqMode(const uint8_t *buff);
void EqModeSet(uint8_t EqMode);
#if CFG_AUDIO_EFFECT_DYNAMIC_EQ_EN
effect_list[effect_sum] = EFF_DynamicEQ;
effect_addr[effect_sum] = (uint32_t)&gCtrlVars.music_dynamic_eq_unit;
effect_list_addr[effect_sum] = eff_addr++;
effect_sum++;
// 低频段控制
effect_list[effect_sum] = 4;
effect_addr[effect_sum] = (uint32_t)&gCtrlVars.music_dynamic_eq_unit.eq_low;
effect_list_addr[effect_sum] = eff_addr++;
effect_sum++;
// 高频段控制
effect_list[effect_sum] = 4;
effect_addr[effect_sum] = (uint32_t)&gCtrlVars.music_dynamic_eq_unit.eq_high;
effect_list_addr[effect_sum] = eff_addr++;
effect_sum++;
#endif
5. 音效管理
5.1 音效初始化
Communication_Effect_Init()
函数负责初始化所有音效:
5.2 音效配置
Communication_Effect_Config()
函数用于配置各类音频效果参数
/**
* @brief 配置音频效果参数
* @param Control 控制命令(0x00-0xff)
* @param buf 参数数据缓冲区
* @param len 参数数据长度
*/
void Communication_Effect_Config(uint8_t Control, uint8_t *buf, uint32_t len)
支持的控制命令包括:
- 0x00-0x0D: 基础音效控制
- 0x11: 用户自定义烧录数据处理
- 0x80-0xff: 高级音效控制
使用示例:
// 配置0x01类型音效
uint8_t params[] = {0x01, 0x02, 0x03};
Communication_Effect_Config(0x01, params, sizeof(params));
void Communication_Effect_Init(void) {
uint8_t eff_addr = 0x81;
effect_sum = 0;
// 初始化各类音效
#if CFG_AUDIO_EFFECT_MIC_NOISE_SUPPRESSOR_EN
effect_list[effect_sum] = 5;
effect_addr[effect_sum] = (uint32_t)&gCtrlVars.mic_expander_unit;
effect_list_addr[effect_sum] = eff_addr++;
effect_sum++;
#endif
// ... 其他音效初始化
}
5.2 音效类型列表
支持多种音效类型,部分示例如下:
音效ID | 音效名称 | 控制单元 |
---|---|---|
5 | 噪声抑制 | gCtrlVars.mic_expander_unit |
6 | 频率偏移器 | gCtrlVars.freq_shifter_unit |
7 | 啸叫检测器 | gCtrlVars.howling_dector_unit |
9 | 音高变换器 | gCtrlVars.pitch_shifter_unit |
10 | 混响 | gCtrlVars.reverb_unit |
13 | 虚拟低音 | gCtrlVars.music_vb_unit |
6. 音频设备控制
6.1 ADC控制 (0x03/0x06命令)
void Comm_PGA0_0x03(uint8_t *buf) {
switch(buf[0]) {
case 0: // LINE1左声道使能
gCtrlVars.pga0_line1_l_en = TmpData;
AudioLineSelSet();
break;
case 1: // LINE1右声道使能
gCtrlVars.pga0_line1_r_en = TmpData;
AudioLineSelSet();
break;
// ... 其他输入控制
case 8: // LINE1左声道增益(0-31)
gCtrlVars.pga0_line1_l_gain = TmpData;
AudioPgaGainSet();
break;
}
}
6.2 DAC控制 (0x09/0x0A命令)
void Comm_DAC0_0x09(uint8_t *buf) {
switch(buf[0]) {
case 0: // 输出模式
gCtrlVars.dac0_output_mode = TmpData;
AudioOutputModeSet();
break;
case 1: // 主音量控制
gCtrlVars.dac0_volume = TmpData;
AudioVolumeSet();
break;
case 2: // 静音控制
gCtrlVars.dac0_mute = TmpData;
AudioMuteSet();
break;
}
}
7. 状态查询与监控
7.1 系统状态查询 (0x02命令)
void Communication_Effect_0x02(void) {
gCtrl