Skip to main content

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系统状态查询15RAM、CPU使用率等信息
0x03ADC0 PGA控制可变线路输入使能/增益设置
0x06ADC1 PGA控制可变麦克风输入使能/增益设置
0x09DAC0控制可变输出模式、音量等设置
0x0ADAC1控制可变耳机输出控制
0xFC用户自定义标签可变音效模式名称获取
0xFD音效保存到Flash1触发音效参数保存操作

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()函数实现:

采样率说明
08kHz窄带语音
116kHz宽带语音
232kHz超宽带语音
344.1kHzCD音质
448kHz专业音频标准
588.2kHz高分辨率音频
696kHz专业高分辨率音频
7176.4kHz超高分辨率音频
8192kHz专业超高分辨率音频

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值应用场景
低频800.7增强低音
中低频2501.0人声厚度
中频10001.2乐器清晰度
中高频40001.5人声明亮度
高频100002.0空间感和细节

4.2 EQ控制命令

EQ设置主要通过以下方式实现:

  1. 初始化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++;
}
}
  1. EQ参数设置 通过发送包含以下数据的命令帧:
  • 命令码:对应音效类型(如0x04表示EQ)
  • 数据:包含enable/freq/gain/q等参数

4.3 动态EQ设置

支持动态EQ调节,包括低频和高频的独立调节:

4.4 EQ设置函数

EQ设置主要通过以下函数实现:

  1. EQ初始化函数
void AudioEffectEQInit(EQUnit *unit, uint8_t channel, uint32_t sample_rate);
  1. EQ参数配置函数
void AudioEffectEQPregainConfig(EQUnit *unit);
void AudioEffectEQFilterConfig(EQUnit *unit, uint32_t sample_rate);
void AudioEffectEQFilterClearBufConfig(EQUnit *unit, uint32_t sample_rate);
  1. EQ应用函数
void AudioEffectEQApply(EQUnit *unit, int16_t *pcm_in, int16_t *pcm_out, uint32_t n, uint8_t channel);
  1. 动态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);
  1. 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