AW32N无线麦问题整理
📎 原始文档:https://www.kdocs.cn/l/cbYwwPQ5btYa AW32N无线麦问题整理
前言:本文档整理将以各个SDK遇到的共性问题做整理汇总,可直接根据所使用的sdk版本及功能快速索引相关问题点
必看(aw328a强制升级工具升级介绍)
开发注意点
- AW328A mic 模拟增益挡位说明 AW32 ADC模拟增益(5档):0档:0dB,1档:3dB,后续以6dB递增
void *live_mic_capture_open(struct audio_path *path)
{
struct live_adc_capture_context *mic = zalloc(sizeof(struct live_adc_capture_context));
ASSERT(mic);
mic->sample_rate = path->fmt.sample_rate;
mic->gain = 4;
mic->nch = path->fmt.channel;
mic->output_path = path->output.path;
mic->write_frame = path->output.write_frame;
mic->clock = path->time.reference_clock;
mic->capture_time = path->time.request;
- AW328A 省电容偏置工作电压修改
/************************************
dac 供电模式
************************************/
// TCFG_DAC_POWER_LEVEL
#define AUDIO_VCM_CAP_LEVEL1 (0) // VCM-cap, VCM = 1.2v
#define AUDIO_VCM_CAP_LEVEL2 (1) // VCM-cap, VCM = 1.3v
#define AUDIO_VCM_CAP_LEVEL3 (2) // VCM-cap, VCM = 1.4v
#define AUDIO_VCM_CAP_LEVEL4 (3) // VCM-cap, VCM = 1.5v
//修改对应的宏定义
#define TCFG_DAC_POWER_LEVEL AUDIO_VCM_CAP_LEVEL4
- AW328A 在线调音需要使用串口的方式调试(暂时不支持USB调试)
- AW32N 使用无线升级的办法: 文档:SDK\doc\软件资料\AW32N无线话筒应用详细设计说明书.pdf 中有描述到配置方式

- AW32N 因flash空间限制仅支持sine、wav提示音 Tx:不支持所有提示音的播放
Rx:仅支持sine、wav按键提示音
Rx开启按键提示音功能:
- demo: AW32N_mic_rx_1.0.0-key-sin-wav-tone.7z
- wav提示音
- 开编解码
#define TCFG_DEC_WTGV2_ENABLE 1//DISABLE
#define TCFG_DEC_WAV_ENABLE 1//DISABLE
#define TCFG_DEC_PCM_ENABLE 1//DISABLE
- lib_media_config.c中添加
const int FILE_DEC_SUPPORT_HIGH_SAMPLE_RATE_FLAG = 0; //是否支持64k,88.2k,96k采样率
const int const_audio_codec_wav_dec_support_aiff = 0; //是否打开aiff解码开关
const u8 config_wav_id3_enable = 0; //文件中的歌手信息等解析开关
const int const_audio_codec_wav_dec_bitDepth_set_en = 0; //32bit/24bit 是否支持高位宽配置输出
const int const_audio_codec_wav_checkdst_enable = 0; //是否做dts检查
const int const_audio_codec_wav_dec_support_AB_Repeat_en = 0; //是否支持AB点跟循环
const int const_audio_codec_wav_dec_supoort_POS_play = 0; //是否支持指定位置播放
/* const int WAV_DECODER_PCM_POINTS = 480; //最多一次输出点数配置 */
/* const int WAV_MAX_BITRATEV = (48 * 2 * 32); //最大码率限制,超过这个码率,返回不支持;可以根据卡的读数速度来限制 */
const int const_audio_codec_wav_support_unstandard_sr_enable = 0; //是否支持非标准采样率
const int const_audio_codec_wav_support_unstanderd_sr_min = 8000; //非标准采样率最低限制
- 添加库文件
- 修改makefile
cpu/bd45/liba/wav_dec_lib.a \
cpu/bd45/liba/wtgv2_dec_lib.a \
- 库文件 AW32-WAV-解码库-伟新.7z
- sin提示音
- 开启与定义相关宏
#define TCFG_KEY_TONE_EN 1//DISABLE // 按键提示音。
#define CONFIG_CPU_BR28 1//AW32并非是BR28 这里只是定义该宏开启sin_tone_make接口中的红遍有选择项
- 修改sine提示音声音大小
- sin_value右移的值与音量大小成反比关系
int sin_tone_make(void *_maker, void *data, int len)
{
struct audio_sin_maker *maker = (struct audio_sin_maker *)_maker;
s16 *pcm = (s16 *)data;
int sin_value = 0;
int win_sin_value = 0;
int add_idx = 0, sub_vol = 0, win_add_idx = 0;
int offset = 0;
u8 id = maker->id;
u8 sin_num = maker->sin_num;
u8 repeat = maker->repeat;
u8 channel = maker->channel;
int sin_index;
int win_sin_index;
int volume;
u32 reamin_points = len / 2 / channel;
do {
if (maker->next_param) {
maker->volume = SINE_TOTAL_VOLUME;
maker->sin_index = 0;
maker->win_sin_index = 0;
maker->next_param = 0;
}
u8 win = maker->sin[id].win;
add_idx = ((u64)(1 << 25) * maker->sin[id].freq / DEFAULT_SINE_SAMPLE_RATE) >> 9;
if (win) {
win_add_idx = ((u64)(1 << 25) * maker->sin[id].decay / DEFAULT_SINE_SAMPLE_RATE) >> 9;
/*sub_vol = 0;*/
} else {
sub_vol = maker->sin[id].decay;
}
sin_index = maker->sin_index;
win_sin_index = maker->win_sin_index;
volume = maker->volume;
u32 points = 0;
if (maker->fade_points) {
points = maker->fade_points > reamin_points ? reamin_points : maker->fade_points;
sub_vol = 0;
maker->fade_points -= points;
} else {
points = maker->points > reamin_points ? reamin_points : maker->points;
maker->points -= points;
}
reamin_points -= points;
while (points--) {
/*hw_sin_value(sin_index, &sin_value, 0);*/
sin_value = __asm_sine((s64)sin_index, 2);
if (win) {
/*hw_sin_value(win_sin_index, &win_sin_value, 0);*/
win_sin_value = __asm_sine((s64)win_sin_index, 2);
#if ((defined CONFIG_CPU_BR36) || (defined CONFIG_CPU_BR28))
sin_value = ((s64)sin_value * (s64)win_sin_value) >> 44;
#else
// sin_value = ((s64)sin_value * (s64)win_sin_value) >> 34;
sin_value = ((s64)sin_value * (s64)win_sin_value) >> SIN_VOL;
#endif
win_sin_index += win_add_idx;
win_sin_index &= 0x1ffffff;
} else {
#if ((defined CONFIG_CPU_BR36) || (defined CONFIG_CPU_BR28))
sin_value = ((s64)volume * sin_value) >> 39;
#else
// sin_value = ((s64)volume * sin_value) >> 34;
sin_value = ((s64)volume * sin_value) >> SIN_VOL;
#endif
}
sin_index += add_idx;
sin_index &= 0x1ffffff;
volume -= sub_vol;
if (volume < 0) {
volume = 0;
}
*pcm++ = sin_value;
if (channel == 2) {
*pcm++ = sin_value;
} else if (channel == 4) {
*pcm++ = sin_value;
*pcm++ = sin_value;
*pcm++ = sin_value;
}
}
maker->volume = volume;
maker->sin_index = sin_index;
maker->win_sin_index = win_sin_index;
if (!maker->points) {
if (++id >= sin_num) {
if (!repeat) {
break;
}
id = 0;
}
maker->points = maker->sin[id].points;
maker->id = id;
maker->next_param = 1;
}
if (!reamin_points) {
break;
}
} while (1);
return len - (reamin_points * 2 * channel);
}
- sdk默认按键提示音播放接口调用处

AW32N 无线麦系列进入DUT 的方式 注意:只能进入BLE 的 dut 测试,无法测试 edr 的dut

AW32N 无线麦系列自定义数据的参考使用办法 可以自己创造一个专门从事用户自定义收发数据的UUID去进行数据交互,不再使用'I'
下面以使用'U'举例:
static void custom_cmd_identification_record_handler(u16 aux_hdl, u8 arg_num, int *argv)
{
printf(" identification_record_handler 164 %d \n", aux_hdl);
u8 i, j;
int trans_role = argv[0];
u8 *data = (u8 *)argv[1];
int len = argv[2];
put_buf(data, len);
//由于转发流程中申请了内存,因此执行完毕后必须释放
if (data) {
free(data);
}
}
CUSTOM_DATA_TRANS_STUB_REGISTER(custom_cmd_identification_record) = {
.uuid = 'U',
.task_name = "app_core",
.func = custom_cmd_identification_record_handler,
};
RX端
发送命令的接口:
custom_data_send_data_to_sibling('U', &cmd_t, sizeof(u8), 0, WIRELESS_TX_DEV1);
custom_data_send_data_to_sibling('U', &cmd_t, sizeof(u8), 0, WIRELESS_TX_DEV2);
TX端的话:注册UUID 和解析回调与RX是一样的办法
TX发送命令给RX的接口调用:
custom_data_send_data_to_sibling('U', &cmd_t, sizeof(u8), WIRELESS_RX_DEV1);
调用的话,就换成WIRELESS_RX_DEV1 作为custom_data_send_data_to_sibling 最后的参数即可
注意点:若TX 需要发送大于或等于4个byte 的数据给到RX ,会出现报错的问题,需要换库处理
aw32n_wireless_mic_release_patch01.08_TX生成配对码功能不正常换库(TX无法发送完整7个byte配对码信息).rar
内部gitlab 链接:
RX: 文件 · feature_p01.08_自定义命令传输demo · 自由品牌 / 客户支持 / JLStudio / wireless_mic / wireless_mic_rx / AW32N / wireless_mic_AW32N_1.0.0_rx · GitLab
TX:文件 · feature_p01.08_自定义命令传输demo · 自由品牌 / 客户支持 / JLStudio / wireless_mic / wireless_mic_tx / AW32N / wireless_mic_AW32N_1.0.0_tx · GitLab
共性问题
- 3in1_wireless_mic_tx1.0.0_P03 AW328 默认板级配置 其他版本sdk不需要做此修改

- 3in1_wireless_mic_tx1.0.0_P03 TEST板级默认ADKEY内部上拉电阻值设置错误
//#define R_UP 10000 //1M,内部上拉使用1M
#define R_UP 100 //10K,内部上拉默认10K
- 3in1_wireless_mic_tx1.0.0_P03 修复打开长按复位编译失败问题
#define TCFG_CHIP_RESET_PIN IO_PORTA_03 // 长按复位
#define TCFG_CHIP_RESET_LEVEL 0 // 0-低电平复位;1-高电平复位
#define TCFG_CHIP_RESET_TIME 8 // 复位时间1 2 4 8 16 单位为秒
修改方法:替换库文件,重新编译
【金山文档 | WPS云文档】 cpu
https://kdocs.cn/l/cnPz0MvBDCdL
4. 3in1_wireless_mic_tx1.0.0_P03 test 板级下串口升级失败问题 问题描述:按照word 文档 《注意说明!!!!!!!!(必读) 》 提示修改 串口升级使能功能后,仍旧无法实现串口升级
原因:SDK 自带的测试盒固件版本不对,需要使用一下测试盒固件版本
aw328_测试盒beta固件.rar
或者直接升级到 P04版本
5. 3in1_wireless_mic_tx1.0.0_P03 软件配置与硬件匹配的情况下连接音箱mic声音不正常 现象:mic端喊很大的声音,音箱那边才有一点滋滋的声音
原因:拿到mic的trim数据不正常导致
容易出现该问题的情况:
- 开发过程中,同一个板子不擦除所有的方式下载不同的程序
- 产线生产,在第一次开机没有mic头
- 第一次开机之后换了mic头 修改方法:
- 替换media.a
- 修改trim的方式
TCFG_MC_BIAS_AUTO_ADJUST MC_BIAS_ADJUST_ALWAYS//MC_BIAS_ADJUST_ONE

6. wireless_mic_tx_rx 1.0.0(patch_01.05) 修改增加近距离配对功能补丁(信号强度大于设定值才允许配对上) aw32n_wireless_mic_release_patch01.05添加rssi限制连接范围补丁.7z
缺失的le_common_define.h放在报错的指定位置。
7. wireless_mic_tx_rx 1.0.0(patch_01.07) 使用CONFIG_BOARD_AW32N_2T1_SIMPLEX 板级配置,再aw328a 芯片运行打印一直乱码的问题 注意需要配置成单脚晶振。
8. wireless_mic_tx_rx 1.0.0(patch_01.08) 使用CONFIG_BOARD_AW32N_2T1_ADAPTER 板级配置,TX 端想按键控制监听的开关的使用办法
9. AW32N()_3In1_wireless_mic_tx_1.0.0(patch_07)使用接口设置频偏值不生效的问题处理 更换下列蓝牙库:
btctrler_AW32N_3In1_wlm_tx_1.0.0_patch_07_fre_offset_comp_api.zip
并按截图方式补频偏。
extern u8 get_bt_osc_offset_flag();
extern void bt_osc_offset_set(s32 offset);
/// 若没有校准,配置默认频偏值,会被校准值覆盖
if(0 == get_bt_osc_offset_flag()){
bt_osc_offset_set(62);
}
- AW32N()_3In1_wireless_mic_tx_1.0.0(patch_08)使用BST 传输绑定功能中TX生成配对码的方式RX无法获取配对码问题 原因:BD45做低延时,蓝牙用得比较极限,最新tx->rx的只能6个byte的,rx->tx 是16个byte。如果不是超低延时方案理论可以放宽一点。现在上下行最大需要传输多少byte数据。
解决办法:不再使用TX生成配对码的当时,只能使用RX生成配对码的方式。
特殊:wireless_mic_AW32N_1.0.0(patch_01.08) 可以放宽限制,非三合一版本,而是纯无线麦版本
换库处理:
aw32n_wireless_mic_release_patch01.08_TX生成配对码功能不正常换库(TX无法发送完整7个byte配对码信息).rar
11. AW32N()_3In1_wireless_mic_tx_1.2.0 使用adapter 板级,有USB mic 的同时还需要有16K的IIS 输出 声音异常问题。 问题原因: USB mic 输出 只能是48K采样的输出,但是又需要有16K采样率的 IIS 输出,所以需要做变采样处理:
wireless_mic_rx_aw32N()_1.2.0__adapter和16KIIS输出杂音问题增加变采样处理.rar
内部gitlab:文件 · bugfix_sdk_1.2.0_adapter和16KIIS输出杂音问题增加变采样处理 · 自由品牌 / 客户支持 / JLStudio / wireless_mic / wireless_mic_rx / AW32N / wireless_mic_AW32N_1.0.0_rx · GitLab
问题处理
- PP键(mute、umute)功能 不能使用KEY_DIG_GROUP_LIVE_CAPTURE_PP来做按键mute、umute功能
原因:没有使用正确的接口去做mute功能
现象:mute住之后不能umute
解决方法:
使用正确的接口去做mute、umute功能
- RX 配置成IIS 输出,若需要没有连接TX时候也需要有IIS 时钟信号产生,按以下截图修改

资料下载
案例分享:
- led spi推rgb灯
- 修改一下接口
void led_spi_init(void)
{
gpio_set_die(LED_SPI_IO, 1);
gpio_set_direction(LED_SPI_IO, 0);
gpio_set_pull_up(LED_SPI_IO, 0);
gpio_set_pull_down(LED_SPI_IO, 0);
gpio_write(LED_SPI_IO, 0);
SFR(JL_IOMC->IOMC0, 16, 1, 1);
gpio_set_fun_output_port(LED_SPI_IO, FO_SPI1_DA0, 1, 1, LOW_POWER_FREE);
request_irq(IRQ_SPI1_IDX, 0, led_spi_isr, 0);
os_sem_create(&led_spi_sem, 1);
LED_SPI->BUF = 0;
LED_SPI->CON = 0x4021;
LED_SPI->CON1 = 0;
}
//如果刷新率大于等于20ms可以不修改一下接口
void led_spi_send_rgbbuf(u8 *rgb_buf, u16 led_num) //rgb_buf的大小 至少要等于 led_num * 24
{
if (!led_num) {
return;
}
// while (led_spi_sus) {
// os_time_dly(1);
// }
led_spi_busy = 1;
led_spi_rest();
LED_SPI->BAUD = LED_SPI_CLOCK_BASE / LED_SPI_DAT_BAUD - 1;
LED_SPI->CON |= BIT(14);
LED_SPI->ADR = (u32)rgb_buf;
LED_SPI->CNT = led_num * 24;
while (!(LED_SPI->CON & BIT(15)));
LED_SPI->CON |= BIT(14);
led_spi_busy = 0;
}
void led_spi_send_rgbbuf_isr(u8 *rgb_buf, u16 led_num) //rgb_buf的大小 至少要等于 led_num * 24
{
if (!led_num) {
return;
}
// while (led_spi_sus) {
// os_time_dly(1);
// }
led_spi_busy = 1;
os_sem_pend(&led_spi_sem, 0);
led_spi_rest();
LED_SPI->BAUD = LED_SPI_CLOCK_BASE / LED_SPI_DAT_BAUD - 1;
LED_SPI->CON |= BIT(14);
LED_SPI->ADR = (u32)rgb_buf;
LED_SPI->CNT = led_num * 24;
LED_SPI->CON |= BIT(13);//打开中断
}
- 使用方式
- 初始化led_spi_init
- 发送数据接口
- 中断不等待led_spi_send_rgbbuf_isr
- 阻塞等待led_spi_send_rgbbuf
- 数据buff必须是4字节对齐
- 每次发送数据时如果spi/lsb 时钟发生改变时需要重新设置下spi的波特率
- 测试接口
- led_spi_test