AC706N音箱问题整理
📎 原始文档:https://www.kdocs.cn/l/csczbvOSXxbB AC706N音箱问题整理
- 前言:本文档整理将以各个SDK遇到的共性问题做整理汇总,可直接根据所使用的sdk版本及功能快速索引相关问题点
开发注意点
- 设备升级功能(主要是TF卡、U盘升级),目前文件格式只支持 FAT32 ,其他FAT格式目前无法升级
- AC7066A按照公版原理图配置TF卡会复位/不开机问题(会触发mclr复位)
问题原因:PC1合邦了短按复位键
解决方案:需要手动关闭短按复位功能,配置以下宏定义,在程序开始时写入0
#define MCLR_EN(en) p33_fast_access(P3_PR_PWR, BIT(3), en);
烧录器:勾选关闭复位功能
3. 频偏修改(参考蓝牙部分频偏修改)
//* 参数使用说明:如果测试盒测试到未修改频偏前数值是+20 ,那么就填bt_osc_offset_set(20); 如果测试到是-20 那么就填bt_osc_offset_set(-20);
extern void bt_osc_offset_set(s32 offset);
4. 打开OTA打印以及uboot打印的方法
- cpu\br29\tools\isd_config_rule.c 修改对应的打印口
//uboot and ota.bin串口tx
// 如果是USB口 设置为 USBDP/USBDM
#ifndef CONFIG_UBOOT_DEBUG_PIN
#define CONFIG_UBOOT_DEBUG_PIN PA01
#endif
- 更换对应文件

- 设置IO状态的方法
u32 port = PORTA;//指定IO
u32 pin = PORT_PIN_2;
gpio_hw_set_direction(port, pin, 1);//0:out, 1:in
gpio_hw_set_die(port, pin, 0);
gpio_hw_set_dieh(port, pin, 0);
gpio_hw_set_pull_up(port, pin, GPIO_PULLUP_10K);
gpio_hw_set_pull_down(port, pin, GPIO_PULLDOWN_10K);
gpio_hw_set_output_value(port, pin, 0);
- 添加AD通道的接口
#define AD_CH_IO_VBAT_PORT IO_PORTB_02 //选择一个有ADC功能IO口采集vbat电压,电压不能超过 vddio
adc_add_sampioch(adc_io2ch(AD_CH_IO_VBAT_PORT));
adc_set_sample_period(adc_io2ch(AD_CH_IO_VBAT_PORT), PMU_CH_SAMPLE_PERIOD);
- 配置IO_VDD掉电,用于关闭外部LDO芯片等的设计,需要考虑好U盘插入漏电的情况,这个时候IO_VDD不能完全达到0V,大概有1.7V左右电压。

- 7065E使用PB7应注意与DACR的绑定 feature_DACR高阻态_200_patch_08(使用的是默认VCM电容配置)
- 7065E没有VCM引脚应配置为VCM不带电容。
- 如果配置错了,使用PB7做高低输出DAC L会有一个底噪出来

- 如果配置错了,使用PB7做高低输出DAC L会有一个底噪出来
- 开机dac没有完全初始化前,DACR没有真正高阻态
- 使用PB7做AD输入电压检测时获取到的AD值偏低
- PB7初始化时把DAC高阻态,该初始化必须在播放提示音前
- 使用PB7做AD输入电压检测时获取到的AD值偏低
//DAC高阻态
SFR(JL_ADDA->DAA_CON2, 23, 1, 1); //SDDAC_PA_TRIM_EN_11v
//PB7初始化
gpio_set_mode(IO_PORT_SPILT(IO_PORTB_07), PORT_INPUT_FLOATING);
gpio_set_function(IO_PORT_SPILT(IO_PORTB_07), PORT_FUNC_GPADC);
//获取PB7 AD 值
u32 adc_v = adc_get_value_blocking(ADC_CH_IO_PB7);
- 临时处理在获取ad值前触发DAC R的高阻态
//初始化 PB7 ad输入
gpio_set_mode(IO_PORT_SPILT(IO_PORTB_07), PORT_INPUT_FLOATING);
gpio_set_function(IO_PORT_SPILT(IO_PORTB_07), PORT_FUNC_GPADC);
//触发DAC R高阻态
play_tone_file(get_tone_files()->max_vol);
tone_player_stop();
//获取PB7 AD 值
u32 adc_v = adc_get_value_blocking(ADC_CH_IO_PB7);
- U盘与T卡复用
- 200P08.07sdk dmeo: feature_DM与SDDATA复用_200_patch_08.07


- le_audio_2.0.0_patch05 200P05复用功能建议升级到200P06(包含200P06)以上
- 获取设备总数 DM和SD卡复用的方式导致dev_manager_get_total该接口获取数量不正确,需要使用以下方式获取(200P06之后的版本会做兼容处理)
u32 dev_cnt = 0;
dev_cnt += dev_online("udisk0");
dev_cnt += dev_online("sd0");
- 复用设置
- sdk自带文档(地址粘贴到浏览器中打开) file:///C:/JLStudio/standard/le_audio/AC706N/2.0.0/docs/html/SDK/IO_multiplex/IO_multiplex.html

- U盘的DM与T卡的data引脚复用需要手动添加到复用列表
- 如果复用引脚上有绑定其他引脚记得在开机引脚设置那里把它高阻态,这里以PC3与DM绑定为例。



- sdk自带文档(地址粘贴到浏览器中打开) file:///C:/JLStudio/standard/le_audio/AC706N/2.0.0/docs/html/SDK/IO_multiplex/IO_multiplex.html
- AC706芯片只有单通道LADC,不能支持数字AUX与有线麦克风共存(需要有一路走硬件通路,无法做音效处理)

- AC706 FM搜台的参数打印

- AC706N IO_CONTROL 功能介绍可以参考 1、《AC706N硬件设计指南》
2、《AC706N用户手册》
3、SDK\interface\driver\cpu\br29\asm\io_omap.h
通用输出通道选择
0:uart0_tx
1:uart1_rts
2:spi0_do
3:spi1_do
4:tmr0_pwm
5:tmr1_pwm
6:tmr2_pwm
7:tmr3_pwm
8:mc_pwm0_h
9:mc_pwm0_l
10:mc_pwm1_h
11:mc_pwm1_l
12:clkout1
13:clkout2
14:gp_ich0
15:gp_ich1
SDK\interface\driver\cpu\br29\asm\io_imap.h
13. AC706N IIS ALINK模块使用注意
初始化输出输入通道的时候,其余通道的IO会出现IO不受控情况,如不能输出低电平,
该问题是ALINK模块内部硬件设计就是这样,无法修改。
14. AC706N TWS声道切换说明 https://www.kdocs.cn/l/cjGjGFsUlqjp
15. AC706N IIS主机在没有数据输出时需保持CLK 测试sdk版本:le audio 2.0.0Patch_08.07
if(hw_ch_num !=1 || hdl->cfg.role == ALINK_ROLE_MASTER){//iis 做主机时不关硬件,避免IIS Tx主机播放完提示音关掉IIS
printf("audio_iis_stop ch_idx = %d, role = %d\n", ch_idx, hdl->cfg.role);
return 0;//IIS 模块内通道使能 大于等于2个,默认不关闭硬件
}
16. AC706N VPWR(P0) 当普通io使用注意
- 该引脚有内部充电电路,相当于下拉1MΩ的电阻
共性问题
OTA问题汇总更新
- BR29 ota_修复edr升级数组越界问题(2025年9月1日) 异常信息:
修改方法
替换以下ota.bin
br29_ota_修复edr升级数组越界问题_20250901.zip - sounbox_1.0.0_patch04 SD卡、蓝牙测试盒升级无法维持IO(2025年2月26日) 1、蓝牙测试盒升级按如下修改即可维持IO。(le_audio同样适用)
2、SD卡升级维持IO需更新如下ota升级文件。(le_audio版本也适用)
AC706N_sounbox_1.0.0_patch04_SD卡升级维持IO修改_20250226.rar - AC706音箱SDK使用蓝牙测试盒出现升级失败问题(2024年10月22日) 打开ota_debug打印会发现报错:OTA
解决办法:替换以下bin文件:
ota_BR29_20241022_关闭蓝牙中断中翻转IO口.rar
备注:20241022前le_audio和soundbox分支都存在此问题,共性问题,都需要替换 - soundbox-AC706N-1.0.0-AC706N-demo-patch_04.02 双备份升级,显示升级成功,但是代码没有更新。 处理方法:
升级前解除FLASH写保护,替换uboot。
张凯_706sounboxuboot_双备份带KEY升级不了.7z
void norflash_set_write_protect_en(void)
{
struct vm_info vm = {0};
norflash_ioctl(NULL, IOCTL_GET_VM_INFO, (u32)&vm);
norflash_set_write_protect(1, vm.vm_saddr);
}
void norflash_set_write_protect_remove(void)
{
norflash_set_write_protect(0, 0);
}
- le_audio_1.0.0_patch02 关机功耗高问题 替换以下库文件:
【金山文档 | WPS云文档】 cpu(2024年4月26日_le_audio_1.0.0_patch02处理关机功耗高问题)
https://kdocs.cn/l/ck7u8UyeOhQE - le_audio_1.0.0_patch02 AUX打断播放提示音死机问题 【金山文档 | WPS云文档】 media((2024年4月26日_le_audio_1.0.0_patch02处理AUX播放提示音死机问题)
https://kdocs.cn/l/cc5YcXzXzV69 - le_audio_1.0.0_patch02 手机远距离出现音箱杂音问题 处理方法:蓝牙A2DP添加一个丢包修复节点

- le_audio_1.0.0_patch02 关闭打印后,编译失败
void cpu_assert_debug()
{
asm("[--sp] = {rets}");
#if CONFIG_DEBUG_ENABLE
log_flush();
local_irq_disable();
while (1);
#else
p33_tx_1byte(P3_SFLAG0, 0xac);
cpu_reset();
// P3_PCNT_SET0 = 0xac;
// cpu_reset();
#endif
}
- le_audio_1.0.0_patch04 以及之前的版本重新上电FM电台变成沙沙声
u8 reset_if = 1;
if (freq == 106000 || freq == 98000 || freq == 90000 || freq == 82000) {
reset_if = 0;
}
if(reset_if){
u32 fmrx_clk = clk_get("fmrx") / 1000;
u8 if_step = (float)(1500 * 160 / (fmrx_clk / 2));
SFR(JL_FM->FMRX_CON9, 5, 7, if_step);
}
6. le_audio_2.0.0_patch04 & le_audio_1.0.0_patch05 以及之前的版本IRkey 功能异常修改 原因:驱动部分没有实现好
修改办法:le_audio_1.0.0_patch05 以及之前的版本IRkey 功能异常修改.otl
leaudio 200P0808:https://gitlab.zh-jieli.com/JL-Studio/Leaudio/706N/AC706_le_audio_2.0.0/-/tree/feature_irkey
7. le_audio_1.0.0_patch05 连接无线mic之后不能写VM AC706 le_audio patch05 连接过程中VM直接写flash 补丁.zip
8. 新旧box1.0.0_PX(三合一音箱)与新旧wmic1.0.0_PX(无线麦)互连喊话末尾有杂音 修改编解码参数
在box与wmic 两sdk中修改jlalw_offset8_tab参数(有该变量声明改其参数,没有声明不改)
9. box与wmic码率不一致导致连接之后声音异常 box 码率设置:
wmic码率设置
10. 7068M在线调音 注意VPWR脚中间不能连接电容,否则会导致通信失败

11. soundbox_1.0.0_patch_00.02 蓝牙单mic通话声音小 可视化工具中在下图位置配置单mic通话增益
到代码中会在下图位置读取增益mic_gain后通过audio_adc_mic_set_gain配置增益,实际读取到的对应关系为:
0db:mic_gain = 0
3db:mic_gain = 1
9db:mic_gain = 2
15db:mic_gain = 3
21db:mic_gain = 4
而audio_adc_mic_set_gain实际配置MIC增益范围:0(-8dB)~19(30dB),step:2dB,level(4)=0dB
导致虽然在可视化中配置了最高21db增益,实际是mic_gain=4,即level(4)=0dB,因此通话声音依然很小,故需要直接修改代码,在下图位置设置mic增益等级。
12. 3In1_wireless_mic_tx 2.0.0_patch_01 开启在线调音后死机问题 USB调音(会上电一直死机复位):
修改办法:增加宏判断
串口连接调音:(会在通信后死机)
修改办法:更换发送接口
13. le_audio_2.0.0_patch01与AW32N 1.0.0_patch01连接box发送不了自定义数据到mic BOX端如下修改
err = wireless_trans_transmit("big_rx", data, length, ¶m);
case WIRELESS_DEV_OP_SEND_PACKET:
res = big_rx_ops.send_packet((const uint8_t *)va_arg(argptr, int), va_arg(argptr, int), (big_stream_param_t *)va_arg(argptr, int));
break;
14. le_audio_2.0.0_patch01与AW32N 1.0.0_patch01自定义数据收发 例子 
注意:不管是mic发给box还是box发给mic,发送端接口(box:wireless_custom_data_send_to_sibling mic:custom_data_send_data_to_sibling)填的uuid,要在接收端uuid对应的handler中去接收数据。
例如box给mic发送数据时填的uuid为'M':
例如mic给box发送数据时填的uuid为'M':
15. le_audio_2.0.0_patch01 usb(dm)与sd(data)复用U盘兼容性差 

16. le_audio_2.0.0_patch01 开启有线/无线mic_单声道没有声音。 原因:可视化蓝牙音频同步模块默认配置错误。
修改:
底层同步不支持 LOCAL,其他三个选项对于无线麦场景代码内部写死的,选啥都是BLE。
17. le_audio_2.0.0_patch01 开启有线/无线mic_单声道,有线mic模式下从 fm 模式进入 Linein 模式死机。 原因:无线mic在线,soundbar 切换至有线mic模式,从 fm 模式进入 linein 模式时与无线mic回连造成无线mic与有线mic同时工作。
回连点日志:
死机日志:
解决:
18. 3in1_wireless_mic_tx 200P2 7068M 板级编译报错 7068编译问题.zip
19. le_audio_2.0.0_patch02 蓝牙通话会死机问题且无声问题。 报错:编码器断言错误
修改办法:
20. le_audio_2.0.0_patch02 使能PA功能异常问题 替换库文件处理
【金山文档 | WPS云文档】 btctrler(AC706N_le_audio_2.0.0_patch02修复PA异常死机问题)
https://kdocs.cn/l/cbNPgTNNFPN0
21. 706n_le_audio_200-P2,U盘解码MP3歌曲,两个无线话筒连接成功,将其中一个话筒关闭再打开连接成功,拔出U盘,sounbox.c中执行btstack_int_edr();出现CPU0 misalign_err错误死机,该补丁必须替换 替换蓝牙库
解决异常死机问题.rar
le_audio_2.0.0_patch02 时钟rtc软关机之后闹钟不响
这句话调到前面

sounbox_1.0.0_patch01 TWS配对死机问题 异常打印:ASSERT-FAILD:(g_tlsp.channel_id BIT(id))==00,1
测试方法:
TWS 音箱没有配对前分别都连接手机后,去按配对。另一个会触发断言异常
修改方法:
替换btctrler.a库文件,重新编译
库链接如下:
【金山文档 | WPS云文档】 btctrler(sounbox_AC706N_1.0.0_patch01_2024年11月5日修复两个手机连接后TWS配对死机问题)
https://kdocs.cn/l/cbcrl00wryPRsounbox_1.0.0_patch01 开机第一次设置默认闹钟不起作用 现象:rtc_dev_init初始值里面有默认闹钟的值但是到时间后没有响铃

原因:开机第一次设置默认闹钟初始化时会关掉闹钟使能
处理方法:
注释掉关闹钟操作
sounbox_1.0.0_patch01 使用alarm_add设置闹钟时间,单位秒被归零
添加秒的赋值

注释秒归零操作

sounbox_1.0.0_patch01 蓝牙音量同步在音乐暂停的时候不起作用
修改方法:
le_audio_2.0.0系列SDK使用AD按键开机过程中按键事件异常,非阻塞式AD按键值获取不准 修改方法:

AC706N外挂32.768K时钟后软关机功耗偏高,在10uA左右 按照下图修改,测试功耗在5.7uA

sounbox_1.0.0_patch01.1 设置VCOM直推,第一次关机功耗高问题处理
dac_hdl.state = 0;
audio_dac_close(&dac_hdl);
30. le_audio_2.0.0P5 使能仅保留电量显示,tws配对上以及蓝牙连接后,打完电话回来蓝牙播放音乐声音变卡顿 软件修改:
31. le_audio_2.0.0_patch05 开启有线/无线mic_单声道异常死机/栈溢出死机 如果出现 [0-CPU] emu err msg : CPU0 stack overflow err 异常信息
原因
超出栈的容量,从而导致栈溢出。
解决方法
- 检查局部变量
- 避免在函数内部创建过大的局部变量,尤其是大型数组或结构体。如果需要存储大量数据,可以使用动态申请的方式
- 减少函数内局部变量的数量和大小
- 检查函数,
- 例如有没有使用一些递归函数,递归太深。
- 加大任务栈的大小:如下

- le_audio_v2.0.0_patch07/08 开启 TWS 和 按键配对功能,多设备分别连接后断开,再次回连失败 配置:
现象 step: - 单台音响打开,TWS没有连接的情况下;
- 用手机A连接音响,然后断开A手机蓝牙;
- B手机去手动连接音响,然后断开B手机
- 这个时候再去手机A手动点击回连,就连接不上音响了 解决:
修改 tws_dual_conn_state_handler() :
- le_audio_v2.0.0_patch07 连接无线 mic 后,使用消人声功能异常 配置:可视化配置打开 1T3 使能,可连接无线 mic
现象: - 连接无线麦后,媒体音乐播放时,使用消人声

- 人声消除后,播放提示音,人声恢复
解决:
- sounbox_1.0.0_patch04 部分SD杂牌卡无法读取 解决方法:需更换底层驱动。
AC706_patch_04_send_SDcmd_no_8clk_20250305_cpu.rar - le_audio_1.0.0_patch04 蓝牙通话AGC模块不起作用 解决方法:
- 在JLStudio可视化工具(非SDK路径)路径下修改替换 .cvp_sms_ans配置.json 文件。(附件) cvp_sms_ans配置.rar
出现以下模块即为修改成功。
2.手动在代码中开启通话回音消除使能。
3.修改以下两个段的位置。

- 3In1_wireless_mic_tx 2.0.0_patch_01 变音模块在线调音时,模式参数不起效
解决方法: - 在lib_media_config.c中将vc_pitchshift_only置为1即可,需注意ram会变大。

- le_audio_v200p08相对le_audio 2.0.0P04版本T卡兼容性变差
- 替换cpu.a库文件
- le audio/soundbox 2025.1.2之后到le_audio2.0.0P08/soundbox 1.0.0P04的sdk 可以使用 AC706_patch_08_SD_read_data_before_cmd_20250508_cpu
//log特征
[00:00:00.290]tone_callback: 8, 0
[00:00:00.662][SD]sd status = 1
[00:00:00.663]sd dev msg 53443000, 0, 7e5aff0
[00:00:00.663]DEVICE_EVENT_FROM_SD0
[00:00:00.663]DEVICE_EVENT_IN
[00:00:00.663]sd0 add start
[00:00:00.664][SD]sd0 open !
[00:00:00.730][SD]sd is 2.0 SDHC !
[00:00:00.732][SD]sd init step 1 is success !
[00:00:00.741]<error> [SD]sdc receive data crc error !
[00:00:00.742]<error> [SD]sdmmc send acmd51 error ! >>> DAT0 line has poor contact , and DAT0 is always at high level !
[00:00:00.770][SD]sd is 2.0 SDHC !
[00:00:00.772][SD]sd init step 1 is success !
[00:00:00.781]<error> [SD]sdc receive data crc error !
[00:00:00.782]<error> [SD]sdmmc send acmd51 error ! >>> DAT0 line has poor contact , and DAT0 is always at high level !
[00:00:00.810][SD]sd is 2.0 SDHC !
[00:00:00.812][SD]sd init step 1 is success !
[00:00:00.821]<error> [SD]sdc receive data crc error !
[00:00:00.822]<error> [SD]sdmmc send acmd51 error ! >>> DAT0 line has poor contact , and DAT0 is always at high level !
[00:00:00.823]__dev_manager_add, sd0 add ok, dev->fmnt = 0, 0
[00:00:01.041][STREAM]dec_err: 40
[00:00:01.065][STREAM]dec_end: 0
[00:00:01.070][AUDIO-DAC]DAV VOL0 : 0x40004000
[00:00:01.101][fade]state:idle,max_volume:100,cur:0,0
[00:00:01.101]set_vol[idle]:=0
[00:00:01.101][SW_DVOL]Gain:0,AVOL:14,DVOL:16384
- ac706n_le_audio_v200p08关闭打印无法连接 tws 替换库 rebuild:
btctrler_706_le_audio_v2p8_修复_tws_无法连接.zip
(该补丁已经包含:bugfix_02_240MHz_rf)
补充修改:

- ac706n_le_audio_v200p08开led7显示在music播放音乐显示音量时立马被音乐时间覆盖显示界面 原因:
如下修改(非唯一修改方案,其他方案可以自己分析让后去修复该问题)
方法一:
删掉如下代码
方法二:
修改如下代码
static void ui_strick_loop()
{
int msg[1];
if (__ui_display->init) {
if(__ui_display->tmp_menu_ret_cnt){
if(--__ui_display->tmp_menu_ret_cnt==0){
msg[0] = UI_MSG_STRICK;
g_printf("------msg----");
post_ui_msg(msg, 1);
}else{
return;
}
}
if (__ui_display->auto_reflash_time && ((++__ui_display->time_count) >= __ui_display->auto_reflash_time)) {
ui_menu_reflash(0);//自动刷新主页
__ui_display->time_count = 0;
}
// if (__ui_display->tmp_menu_ret_cnt && ((--__ui_display->tmp_menu_ret_cnt) == 0)) {
// msg[0] = UI_MSG_STRICK;
// post_ui_msg(msg, 1);
// }
}
}
- soundbox_1.0.0_patch04 开1T2一拖二后,使用bt_cmd_prepare接口控制的部分命令控制对象错乱异常(如PP功能),不是播歌的那一台手机 如下图修改:
// bt_cmd_prepare(USER_CTRL_AVCTP_OPID_PLAY, 0, NULL);
u8 *bt_addr = NULL;
u8 addr[6];
if (a2dp_player_get_btaddr(addr)) {
bt_addr = addr;
}
bt_cmd_prepare_for_addr(bt_addr, USER_CTRL_AVCTP_OPID_PLAY, 0, NULL);
- 无线麦706N_wireless_mic_tx_2.0.0_P01版本 开启充电配置后,多次开关机会卡住 问题原因:关机的过程有个临界区,按键唤醒,充电唤醒,都可能导致这样的情况
处理方法:当前版本暂无解决方法,但可添加下列补丁,使异常触发时能够自动复位。
706N无线麦开关机卡住自动复位补丁.rar
注:如果断言打印没有关掉,该补丁将不会起作用
///异常中断,asser打印开启
#ifdef CONFIG_RELEASE_ENABLE
const int config_asser = 0;
#else
const int config_asser = 0;
#endif
复位源如下:
42. ac706n_le_audio_v200p0803不停的开关广播导致内存泄漏问题 现象:ll_buf_malloc申请的内存一直没释放。
原因:动态内存下ext adv buffer未释放
处理办法:
btctrle_AC706_LEAUDIO_2.0.0_P0803_修改不断开关广播导致内存泄漏问题.7z
43. ac706n_le_audio_v200p08 配置DAC立体声输出后,蓝牙通话异常死机或无声 处理方法:参考单声道模式时的通话流程,重新配置通话上行的节点配置,主要修改以下两个节点。
Gitlab地址:Files · bugfix_200_P08_配置立体声模式蓝牙通话异常死机 · 自由品牌 / 客户支持 / 可视化SDK / le_audio / JL706Nle_audio_2.0.0 · GitLab
44. ac706n_le_audio_V100-P5 部分特殊的U盘 和SD卡复用后,在开机插入后SD已插入情况下再插入挂载失败的问题处理 修改优化方法如下

45. ac706n_aoundbox_100P04优化快速插拔sd卡概率出现不读卡 检测方式:clk
原因:在检测接口的空闲时间插拔卡导致卡回复命令/数据异常
现象:拔插之后播放不了卡需要重新插拔一下卡才能读取
相关log:
- 在解码前插拔

- 在解码时插拔
处理方案(以时间换准确和兼容性):
用到的接口:
static int sd_scan_cn=0;
void u_sd_dev_offline(void){
sd_scan_cn=-10/*让检测接口保持多少次检测返回0*/;
}
int u_sd_io_detect(void *pdata)
{
struct sdmmc_card_dect_platform_data *data = (struct sdmmc_card_dect_platform_data *)pdata;
u32 det_io = data->detect_io[2];
u32 val, res = 0;
u32 *det_io_outreg = gpio2crossbar_outreg(det_io);
u32 data_dir_ctl = (*det_io_outreg) & 0b11;
if (data_dir_ctl) {
(*det_io_outreg) &= ~(0b11);
res = 1;
}
if ((data->detect_mode == SD_IO_ADC_DECT) || (data->detect_mode == SD_PG_ADC_DECT)) {
gpio_set_mode(IO_PORT_SPILT(det_io), PORT_INPUT_PULLUP_10K);
gpio_set_function(IO_PORT_SPILT(det_io), PORT_FUNC_GPADC);
udelay(5);
u32 ad_ch = adc_io2ch(det_io);
u32 ad_value = adc_get_value_blocking(ad_ch);
sd_io_detect_dump_result(ad_value);
gpio_set_mode(IO_PORT_SPILT(det_io), PORT_HIGHZ);//INPUT_PULLUP_10K);
if (res) {
(*det_io_outreg) |= data_dir_ctl;
}
if (ad_value < data->detect_less_ad) {
return 1;
}
if ((ad_value > data->detect_ad_limit_l) && (ad_value < data->detect_ad_limit_h)) {
return 1;
}
} else {
gpio_set_mode(IO_PORT_SPILT(det_io), data->detect_io_level?PORT_INPUT_PULLDOWN_10K:PORT_INPUT_PULLUP_10K);
udelay(5);
val = gpio_read(det_io);
sd_io_detect_dump_result(val);
if (res) {
(*det_io_outreg) |= data_dir_ctl;
}
printf("--------------val[%d] level[%d] [%d]",val,data->detect_io_level,val==data->detect_io_level);
if (val == data->detect_io_level) {
if(sd_scan_cn<0xf0)sd_scan_cn++;
}else{
sd_scan_cn=0;
}
return sd_scan_cn>10/*滤波次数*/?1:0;
}
return 0;
}
- 在解码前插拔(初始化、挂载阶段拔出)
- 使用自定义检测接口替换默认sdk库里面的接口

- 自定义接口里面添加上限检测滤波

- 减小检测扫描时间

- 使用自定义检测接口替换默认sdk库里面的接口
- 在解码时插拔
- 解码器读取失败之后在MUSIC_PLAYER_ERR_DEV_OFFLINE消息处理中添加:自定义接口检测保持一段时间返回为0

- 解码器读取失败之后在MUSIC_PLAYER_ERR_DEV_OFFLINE消息处理中添加:自定义接口检测保持一段时间返回为0
46.ac706n_soundbox-100-patch4-sdk,使能UI-LED7和红外按键后,配合的IO按键或AD按键软关机唤醒失效的问题
优化方法:
extern void unmask_enter_critical(void);//调用关闭不可屏蔽中断
void user_led7_timer_close()
{
y_printf("user_led7_timer_close:%d\n", user_led7_timer);
if (user_led7_timer) {
gptimer_pause(user_led7_timer);
}
}
在软关机前关闭所有的定时器中断。
ac706n_soundbox-100-patch4-sdk-RTC时钟音箱设置闹钟demo和处理开机前设置的闹钟关机开机后不生效的问题




706N-LE_AUDIO-100-patch5在添加各项补丁程序后,处理SD卡和U盘复用挂载失败 添加修改方法:706N-LE_AUDIO-100-patch5在添加各项补丁程序后,处理SD卡和U盘复用挂载失败.otl
le_audio_2.0.0_patch08.05 / patch08.06两个话筒连上后,关掉其中一个,这时另一个话筒声音不正常 异常现象
- 两个话筒连上后,关掉其中一个,这时另一个话筒声音不正常,有咔咔声,看打印一直打印 dac will empty !! 原因·
- 数据流节点端口的状态不对导致输入数据被丢弃 解决
08.05版本: - 替换media.a
- media(ac706n_le_audio_2.0.0_patch_08.05修复断开第一路mic打印dac will empty).rar 08.06版本:
- 替换media.a
- media(ac706n_le_audio_2.0.0_patch_08.06修复断开第一路mic打印dac will empty).zip
le_audio_2.0.0_patch08.05 音箱搭配AW32_3ln1_tx_1.0.0_P05无线麦,会出现丢包现象 修改方法:
设置config_default_big_chmap为0。
706N-le_audio_1.0.0_patch05-sdk快速拔插SD卡概率出现死机情况
快速拔插SD卡,概率出现host_dev->sem变量在已经被删除的情况下再此被操作。AC706N_soundbox_1.0.0patch04 开省电容mic开机是PA4的状态被改掉 修改的文件:audio_setup.c
测试程序:AC706N_soundbox_1.0.0patch04-开省电容mic开机是PA4的状态被改掉.7z
52.706N-soundbox-100-patch4使用闹钟RTC功能,设置重复响起的闹钟后,关机闹钟唤醒,闹钟第二天不会再重复响起。
修改方法:
52. ac706soundbox_1.0.0patch04.02 linein模拟输入切到其他模式有linein声音 测试程序:ac706n_soundbox_1.0.0p04.02-模拟输入切到其他模式有linein声音.7z
同时期 706 le_audio 2.0.0patch08.06也存在该问题
修改linein_stop接口:
void linein_stop(void)
{
if (__this->onoff == 0) {
log_info("linein is aleady stop\n");
return;
}
#if TCFG_AUDIO_AUX_ANALOG_PATH_ENABLE
audio_analog_aux_close(&(__this->analog_aux));
SFR(JL_ADDA->DAA_CON3, 4, 1, 0); // SDDAC_AMUX_A0_EN_11v
SFR(JL_ADDA->DAA_CON3, 6, 1, 0); // SDDAC_AMUX_A1_EN_11v
SFR(JL_ADDA->DAA_CON3, 8, 1, 0); // SDDAC_AMUX_A2_EN_11v
SFR(JL_ADDA->DAA_CON3, 10, 1, 0); // SDDAC_AMUX_A3_EN_11v
SFR(JL_ADDA->DAA_CON3, 12, 1, 0); // SDDAC_AMUX_A4_EN_11v
SFR(JL_ADDA->DAA_CON3, 15, 1, 0); // SDDAC_AMUX_B0_EN_11v
SFR(JL_ADDA->DAA_CON3, 17, 1, 0); // SDDAC_AMUX_B1_EN_11v
SFR(JL_ADDA->DAA_CON3, 19, 1, 0); // SDDAC_AMUX_B2_EN_11v
SFR(JL_ADDA->DAA_CON3, 21, 1, 0); // SDDAC_AMUX_B3_EN_11v
SFR(JL_ADDA->DAA_CON3, 23, 1, 0); // SDDAC_AMUX_B4_EN_11v
#else
/* set_dac_start_delay_time(0, 0); //把dac的延时设置回默认的配置 */
linein_player_close();
#endif
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, __this->volume, 1);
__this->onoff = 0;
}
- le_audio_2.0.0_patch08.06 配置TWS加立体声时,单箱时输出左右声道,TWS连接时双箱分别输出左声道和右声道。 修改方法:
1.添加channel merge节点,并设置为tws_auto配置。
2.配置为立体声输出时,若未连接TWS,需将channel修改为AUDIO_CH_LR,才能输出立体声。
static int tws_get_output_channel()
{
int channel = (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_LR) ? AUDIO_CH_LR : AUDIO_CH_MIX;
if (tws_api_is_connect()) {
channel = tws_api_get_local_channel() == 'L' ? AUDIO_CH_L : AUDIO_CH_R;
}
return channel;
}
54. le_audio_2.0.0_patch08.06 关闭串口打印后,其他串口与MCU的数据通讯不正常 修改方法:如果使用代码里面给的串口demo,需要做以下修改
55.706N-soundbox-100-patch4 部分特殊U盘,SD卡和USB复用后,出现无法挂载的问题
usb_multiplex.c 插入U盘或者模式切到播U盘,需要把DPDM拉低一段时间,让U盘自己认为插入了主机
56.706N-系列使用PB0有驱动LED7数码管时,部分LED灯珠亮度不一致的问题
706N-PB0 IO的驱动电流能力只有固定的输出,与其他IO口输出电流配置容易出现差别,导致LED7亮度不一致。如果一定需要使用PB0驱动LED7数码管,可以按照下图修改电流配置。
55. le_audio_2.0.0_patch08.06 增加llns 到 混响数据流中 编译报错问题。 解决办法:拷贝一个其他芯片的 libllns.a 即可
使用时候需要注意修改ADC 的中断点数 ,不然会导致爆RAM死机 的问题
56. 706N-soundbox-100-patch04.02 低功耗无法连接ble 解决办法:修改btctrler.a,添加低功耗流程
btctrler_706_soundbox_100_patch0402_ble支持低功耗.zip
57. le_audio_2.0.0_patch08.07 开机不播提示音,设置一个频点108Mhz,再播提示音会卡死 根本原因:dac的oe时钟被关掉了
解决方法:修改cpu.a,添加ass_pll_oe
cpu_706_le_audio_200_0807_修复开机不播提示音设置频点后播提示音异常.zip
58. le_audio_2.0.0_patch08.07 开1T3后测试盒获取蓝牙版本号异常 解决方法:修改btctrler.a
btctrler_灵永改_开1T3改蓝牙版本号异常_706_200patch0807.zip
59. 706_soundbox_1.0.0_SDK 不同提示音分别调节音量的功能需求,实时调节特殊提示音音量需求-可移植到其他706NSDK 
#if U_SCENE_MODE_EN
// 根据文件名判断是否为特殊场景提示音并设置音量
if (player->file) { // 改为检查文件句柄是否存在
char filename[64] = {0};
// 获取实际文件名
resfile_get_name(player->file, filename, sizeof(filename));
y_printf("filename: %s\n", filename);
printf("user_scene_vol:%d, wtone_volume:%d, music_to_tone_vol:%d\n",
app_var.user_scene_vol, app_var.wtone_volume, app_var.music_to_tone_vol);
if (strstr(filename, "scene_00")) {
// 设置特殊场景提示音音量(例如降低音量)
app_var.u_tone_state = 1;
if (app_audio_get_volume(APP_AUDIO_STATE_WTONE) != app_var.user_scene_vol) {
app_audio_set_volume(APP_AUDIO_STATE_WTONE, app_var.user_scene_vol, 1);
}
} else {
app_var.u_tone_state = 0;
if (app_audio_get_volume(APP_AUDIO_STATE_WTONE) != app_var.music_to_tone_vol) {
app_audio_set_volume(APP_AUDIO_STATE_WTONE, app_var.music_to_tone_vol, 1);
}
}
}
#endif
// 设置情景音量接口(带边界检查)
void app_scene_volume_set(u8 volume)
{
if (volume > 30) {
app_var.music_volume = 30;
} else {
app_var.music_volume = volume;
}
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, app_var.music_volume, 1);
#if U_SCENE_MODE_EN
printf("user_scene_vol set: %d\n", app_var.user_scene_vol);
// 如果当前正在播放情景提示音,则立即更新音量
if (tone_player_runing() && app_var.u_tone_state) {
// app_audio_set_volume(APP_AUDIO_STATE_WTONE, app_var.user_scene_vol, 1);
// 添加动态更新正在播放的提示音音量
struct volume_cfg cfg = {0};
cfg.bypass = VOLUME_NODE_CMD_SET_VOL;
cfg.cur_vol = app_var.user_scene_vol;
jlstream_set_node_param(NODE_UUID_VOLUME_CTRLER, "Vol_SysTone", (void *)&cfg, sizeof(struct volume_cfg));
}
#endif
// 保存音量设置到VM
// syscfg_write(CFG_SCENE_VOL, &app_var.user_scene_vol, 1);
}
- le_audio_2.0.0_patch08.07 PWMLED配置双IO双灯 灯效会两个同时亮 原因:
SDK在led初始化的时候流程大致如下:
蓝灯亮-》设置IO1映射输出
红灯亮-》设置IO2映射输出
在灯效切换时,缺少关闭映射源的操作。导致两个IO同时输出PWM信号,导致两个灯都亮起来。
处理方法:
切换灯效时,void pwm_led_hw_init(void *pdata) 添加关闭IO映射的操作 pwm_led_io_unmount();
- le_audio_2.0.0_patch08.07 &soundbox SDK 充电无法触发充电满的消息 修改: 修正adc_close函数里的ADC时钟使能配置
void adc_close() //adc close
{
JL_ADC->CON = BIT(17) | BIT(3);//clock_en
JL_ADC->CON = BIT(17) | BIT(6) | BIT(3);
JL_ADC->CON = BIT(6) | BIT(3);
}
分支:bugfix_200_patch_08.07_充电无法充满问题
gitlab: Files · bugfix_200_patch_08.07_充电无法充满问题 · JL-Studio / Leaudio / 706N / AC706_le_audio_2.0.0 · GitLab - 修复 soundbox_1.0.0_patch04 添加 VOTP 区域无法开机 在isd_config.ini的EXTRA_CFG_PARAM配置段中增加OTP_CFG_SIZE配置
[EXTRA_CFG_PARAM]
OTP_CFG_SIZE=256;
706n_soundbox_1.0.0_patch_04_cpu_修复添加 VOTP 区域无法开机.zip
- 修复 le audio 2.0.0 patch08.07 在 IDLE与 BT 直接快速切换的死机 死机原因固定:btencry_task 线程还没执行完,被btctler线程执行的时候释放free_simple,导致异常
解决:
ac706n_le_audio_2.0.0_patch08.07_btctrler_修复IDLE与BT进出来回连接的死机.zip
问题处理
- le_audio_1.0.0_patch04 手动增加linein检测复用adkey 通道做法的实现。 SDK_706_le_audio_patch04_增加复用linein检测和adkey检测_修改说明.rar
- le_audio_1.0.0_patch05 U盘复用sd卡data 脚,编译出错,且无法读取U盘问题处理。 按照下面截图修改:

- le_audio_1.0.0_patch05 省电容麦自动校准配置方式。 代码:需要打开校准,并且最好是always
adc节点:要使用PA0 做mic_bias 供电(这个是必须项),这个是需要PA0 作为供电,而使用AC7065E芯片由于PA1和PA0双绑,默认使用PA1 作为mic脚,需要打开PA0作为mic_bias 给麦供电。
相同道理,若是别的芯片做706的省电容麦形式,则需要将配置的mic_bias 脚短接到mic脚 上面,给麦供电
- 三合一SDK无线mic静音功能 实现方式:
a.box端把对应的mic链路的音量设置为0
b.mic端把mic音量设置为0
c.mic端把mic的数据清除
测试sdk为 三合一 无线mic 1.0.0_p03 SDK 其他SDK仅供参考

- 三和一SDK无线麦reverb切换接口 测试sdk为 三合一 无线mic 1.0.0_p03 SDK 其他SDK仅供参考
- 切换接口
//模式切换时 参数更新接口
void set_mic_reverb_mode_by_id(u8 mode)
模式枚举EFFECT_REVERB_PARM_MAX要与外部配置工具情景数量对应上不然读写数据越界死机

模式切换相关参数的对应关系

- 三合一SDK无线mic更新reverb wet参数 测试sdk为 三合一 无线mic 1.0.0_p03 SDK 其他SDK仅供参考
/**
*接口会更新reverb中的wet
*max_leve:最大等级值
*level:当前等级值
*如果当前情景配置工具里面reverb wet 为120 那么更新下去值为 120*level/max_level
**/
void mic_effect_reverb_wet_set(int max_level,int level){
if (g_mic_effect == NULL || g_mic_effect->sub_0_plate_reverb_hdl == NULL) {
return ;
}
int wet;
static int max=-1;
if(max<0){
max=g_mic_effect->sub_0_plate_reverb_hdl->reverb_parm_obj.wet;
}
printf("reverb max_level=%d level=%d\r\n",max_level,level);
wet=level*max/max_level;
if(wet>max)wet=max;
if(wet<0)wet=0;
Plate_reverb_parm parm;
memcpy(&parm, & g_mic_effect->sub_0_plate_reverb_hdl->reverb_parm_obj, sizeof(Plate_reverb_parm));
parm.wet = wet;
update_plate_reverb_parm(g_mic_effect->sub_0_plate_reverb_hdl, &parm);
//reverb_wet_level=level;
printf("reverb wet=%d max=%d",g_mic_effect->sub_0_plate_reverb_hdl->reverb_parm_obj.wet,max);
}
- le_audio_1.0.0_patch05 使用硬件定时器影响音频流程,双麦连接的时候,关闭断开一个麦,主机音乐有1S左右的杂音。
只改动红框部分,翻转IO的不改
这里是修改减少麦克风断连判断时间 - le_audio_2.0.0_patch01 7066A使用DM口做复用SD卡DATA脚复用
cpu(240808 706V200DM做SD卡DATA脚无作用问题).7z - le_audio_1.0.0_patch05 7065E sd CMD 脚 复用 linein检测 ,但是 SD 卡供电 使用sdpg 脚控制,导致 插卡时linein 检测异常问题 原因:使用sdpg供电,在卡没有工作的时候,sdpg 是不会供电的,而有一些卡在没有供电的情况下会导致 cmd 脚会漏电扯电,从而导致cmd 的AD值检测不准确,从而影响到linein 的识别
解决办法: - 要么是不要使用sdpg 供电,使用IOVDD供电。
- 软件修改只能让sdpg 一直持续供电,修改办法为: 在 devices_init 前调用 sdpg_config(4);
在关机引脚保护的位置 sdpg_config(0);
- le_audio_1.0.0_patch05 三合一SDK创建任务数过多复位
目前当创建的任务数大于15的时候会出现复位。
system(20240826 706_le_audio_100_patch05 修改同时允运行任务数为16).7z - soundbox_sdk调试过程中出现ram不足问题处理汇总
| 复现方法 | 如何解决? |
|---|---|
| sound_box_patch007以下版本,出现ram不足异常 例如情况:开启话筒叠加蓝牙SBC解码会出现爆RAM死机,如果删音效后,再次加上TWS的连接会出现死机情况。 | 使用patch007以上版本 |
701N_soundbox_007,话筒和蓝牙一起叠加播放,这个过程打断方式播放提示音(为了解决爆ram问题,播放提示音前后会开关话筒),在提示音结束后,重新打开话筒解码时候会出现大PO声杂音。![]() | EQ模块申请不到足够的ram,导致杂音出现,需要尽可能节省ram的使用 1、DRC改limiter,limiter保持限幅功能 ![]() 2、话筒EQ1段数减少 ![]() 3、a2dp启动解码的数据丢弃 ![]() |
| 706n_soundbox_007,公版测试,切换话筒音效会出现heap_mmu_erro异常或提示ram空间不足 | 切换话筒音效需要开关一次话筒数据流,然后再切换一次对应的场景scene 1、修改scene_switch.c |
void set_mic_current_scene(u8 index)
{
mic_scene = index;
printf("---- mic_scene = %d",mic_scene);
}
```c-like void mic_effect_set_cur_scene() { mic_effect_scene_set(mic_scene); } ```
```c-like void mic_effect_scene_set_release(u8 scene) { u8 scene_num = get_mic_effect_scene_num(); if (scene >= scene_num) { printf("err : without this scene %d\n", scene); return; } mic_scene = scene; char tar_name[16]; printf("set scene = %d",scene);
if(mic_effect_player_runing()) {
mic_effect_player_close();
}
os_time_dly(1);
if(!mic_effect_player_runing()) {
mic_effect_player_open();
}
}
<br>
```c-like
修改该函数
/* mic混响:根据参数组序号进行场景切换 */
void mic_effect_scene_set(u8 scene)
{
u8 scene_num = get_mic_effect_scene_num();
if (scene >= scene_num) {
printf("err : without this scene %d\n", scene);
return;
}
mic_scene = scene;
char tar_name[16];
printf("set scene = %d",scene);
#ifdef TCFG_NOISEGATE_NODE_ENABLE
for (int i = 0; i < ARRAY_SIZE(mic_noisegate_name); i++) {
sprintf(tar_name, "%s%s", mic_noisegate_name[i], mic_name);
noisegate_update_parm(scene, tar_name, 0);
}
#endif
#ifdef TCFG_CROSSOVER_NODE_ENABLE
for (int i = 0; i < ARRAY_SIZE(mic_crossover_name); i++) {
sprintf(tar_name, "%s%s", mic_crossover_name[i], mic_name);
crossover_update_parm(scene, tar_name, 0);
}
#endif
#if ((defined TCFG_3BAND_MERGE_ENABLE) || ((defined TCFG_2BAND_MERGE_ENABLE)))
for (int i = 0; i < ARRAY_SIZE(mic_band_merge_name); i++) {
sprintf(tar_name, "%s%s", mic_band_merge_name[i], mic_name);
band_merge_update_parm(scene, tar_name, 0);
}
#endif
#ifdef TCFG_FREQUENCY_SHIFT_HOWLING_NODE_ENABLE
for (int i = 0; i < ARRAY_SIZE(mic_howling_fs_name); i++) {
sprintf(tar_name, "%s%s", mic_howling_fs_name[i], mic_name);
howling_frequency_shift_update_parm(scene, tar_name, 0);
}
#endif
#ifdef TCFG_NOTCH_HOWLING_NODE_ENABLE
for (int i = 0; i < ARRAY_SIZE(mic_howling_supress_name); i++) {
sprintf(tar_name, "%s%s", mic_howling_supress_name[i], mic_name);
howling_suppress_update_parm(scene, tar_name, 0);
}
#endif
#ifdef TCFG_VOICE_CHANGER_NODE_ENABLE
for (int i = 0; i < ARRAY_SIZE(mic_voice_changer_name); i++) {
sprintf(tar_name, "%s%s", mic_voice_changer_name[i], mic_name);
voice_changer_update_parm(scene, tar_name, 0);
}
#endif
#ifdef TCFG_AUTOTUNE_NODE_ENABLE
for (int i = 0; i < ARRAY_SIZE(mic_autotune_name); i++) {
sprintf(tar_name, "%s%s", mic_autotune_name[i], mic_name);
autotune_update_parm(scene, tar_name, 0);
}
#endif
#ifdef TCFG_PLATE_REVERB_ADVANCE_NODE_ENABLE
for (int i = 0; i < ARRAY_SIZE(mic_plate_reverb_advance_name); i++) {
sprintf(tar_name, "%s%s", mic_plate_reverb_advance_name[i], mic_name);
reverb_advance_update_parm(scene, tar_name, 0);
}
#endif
#ifdef TCFG_ECHO_NODE_ENABLE
for (int i = 0; i < ARRAY_SIZE(mic_echo_name); i++) {
sprintf(tar_name, "%s%s", mic_echo_name[i], mic_name);
echo_update_parm(scene, tar_name, 0);
}
#endif
#ifdef TCFG_PLATE_REVERB_LITE_NODE_ENABLE
for (int i = 0; i < ARRAY_SIZE(mic_plate_reverb_advance_name); i++) {
sprintf(tar_name, "%s%s", mic_plate_reverb_advance_name[i], mic_name);
reverb_update_parm(scene, tar_name, 0);
}
#endif
for (int i = 0; i < ARRAY_SIZE(mic_eq_name); i++) {
sprintf(tar_name, "%s%s", mic_eq_name[i], mic_name);
eq_update_parm(scene, tar_name, 0);
}
for (int i = 0; i < ARRAY_SIZE(mic_drc_name); i++) {
sprintf(tar_name, "%s%s", mic_drc_name[i], mic_name);
drc_update_parm(scene, tar_name, 0);
}
#ifdef TCFG_BASS_TREBLE_NODE_ENABLE
for (int i = 0; i < ARRAY_SIZE(mic_bass_treble_name); i++) {
sprintf(tar_name, "%s%s", mic_bass_treble_name[i], mic_name);
bass_treble_update_parm(scene, tar_name, 0);
}
#endif
}
```c-like /* mic混响:根据参数组个数顺序切换场景 */ void mic_effect_scene_switch() { int scene_num = get_mic_effect_scene_num(); if (!scene_num) { puts("scene switch err\n"); return; } mic_scene++; if (mic_scene >= scene_num) { mic_scene = 0; } printf("mic_scene!!! =%d",mic_scene); // mic_effect_scene_set_bypass_all(mic_scene); mic_effect_scene_set_release(mic_scene); // mic_effect_scene_set(mic_scene);
}
<br>修改 effects_default_param.c<br>
```c-like
#if 1
char *mic_node_name[] = {"Eq1Eff","Limiter1", "FshiftEff", "VchangerEff", "EchoEff", "PReverbEff", "Eq2Eff"};
for(int i=0; i<ARRAY_SIZE(mic_node_name); i++) {
if(!strcmp(name->name, mic_node_name[i])) {
printf("-------%s",mic_node_name[i]);
struct eff_default_parm *get_parm = (struct eff_default_parm *)arg;
get_parm->mode_index = get_mic_current_scene();
get_parm->cfg_index = 0; //目标配置项
ret = 1;
break;
}
}
#endif

更新node_param_update.c
void reverb_update_parm(u8 mode_index, char *node_name, u8 cfg_index)
{
plate_reverb_param_tool_set cfg = {0};
int ret = jlstream_read_form_data(mode_index, node_name, cfg_index, &cfg);
if (!ret) {
printf("read parm err, %s, %s\n", __func__, node_name);
return;
}
printf("cfg.bypass=%d",cfg.is_bypass);
jlstream_set_node_param(NODE_UUID_PLATE_REVERB, node_name, &cfg, sizeof(cfg));
jlstream_set_node_param(NODE_UUID_PLATE_REVERB_LITE, node_name, &cfg, sizeof(cfg));
}

| | 706n_soundbox_007,话筒音效叠加其他任一解码音效,期间打断方式播放MP3提示音,会出现ram不足异常死机 | 下载压缩包,对比tone_player.c文件的修改点
提示音开关混响_tone_player.rar | | 706n_soundbox_007,fm模式下播放提示音会出现ram不足异常死机 | 下载压缩包,对比文件的修改点,仅是提供一个参考修改方法。
fm开关处理.rar |
- soundbox_sdk_patch007,开启TWS功能,解码U盘过程中拔出退出到蓝牙模式出现死机 下载压缩包,对比进行修改
soundbox_patch007,开启TWS功能,解码U盘过程中拔出退出到蓝牙模式出现死机.rar - le_audio_200-P2,为节省资源需在播放MP3提示音前后开关一下无线话筒的音效,调用接口会造成话筒断连的,需要做个接口,保持连接
apps\soundbox\wireless_trans\le_audio\big\le_broadcast.c
int broadcast_audio_all_close(u16 big_hdl)
{
u8 i;
struct broadcast_hdl *p;
void *recorder = 0;
struct broadcast_rx_audio_hdl player;
player.le_audio = 0;
player.rx_stream = 0;
broadcast_mutex_pend(&broadcast_mutex, __LINE__);
spin_lock(&broadcast_lock);
list_for_each_entry(p, &broadcast_list_head, entry) {
if (p->big_hdl == big_hdl) {
//关闭原来的recorder
if (broadcast_role == BROADCAST_ROLE_TRANSMITTER) {
for (i = 0; i < get_bis_num(BROADCAST_ROLE_TRANSMITTER); i++) {
if (p->bis_hdl_info[i].recorder) {
recorder = p->bis_hdl_info[i].recorder;
p->bis_hdl_info[i].recorder = NULL;
p->bis_hdl_info[i].init_ok = 0;
}
spin_unlock(&broadcast_lock);
if (recorder) {
if (le_audio_switch_ops && le_audio_switch_ops->tx_le_audio_close) {
le_audio_switch_ops->tx_le_audio_close(recorder);
}
}
spin_lock(&broadcast_lock);
}
} else if (broadcast_role == BROADCAST_ROLE_RECEIVER) {
for (i = 0; i < get_bis_num(BROADCAST_ROLE_RECEIVER); i++) {
if (p->bis_hdl_info[i].rx_player.le_audio) {
player.le_audio = p->bis_hdl_info[i].rx_player.le_audio;
p->bis_hdl_info[i].rx_player.le_audio = NULL;
p->bis_hdl_info[i].init_ok = 0;
}
if (p->bis_hdl_info[i].rx_player.rx_stream) {
player.rx_stream = p->bis_hdl_info[i].rx_player.rx_stream;
p->bis_hdl_info[i].rx_player.rx_stream = NULL;
p->bis_hdl_info[i].init_ok = 0;
}
spin_unlock(&broadcast_lock);
if (player.le_audio && player.rx_stream) {
if (le_audio_switch_ops && le_audio_switch_ops->rx_le_audio_close) {
le_audio_switch_ops->rx_le_audio_close(&player);
player.le_audio = NULL;
player.rx_stream = NULL;
}
}
spin_lock(&broadcast_lock);
}
}
}
}
spin_unlock(&broadcast_lock);
broadcast_mutex_post(&broadcast_mutex, __LINE__);
return 0;
}
int broadcast_audio_all_open(u16 big_hdl)
{
u8 find = 0;
struct broadcast_hdl *broadcast_hdl = 0;
struct le_audio_stream_params params = {0};
u8 i = 0;
void *recorder = 0;
broadcast_mutex_pend(&broadcast_mutex, __LINE__);
list_for_each_entry(broadcast_hdl, &broadcast_list_head, entry) {
if (broadcast_hdl->big_hdl == big_hdl) {
find = 1;
break;
}
}
broadcast_mutex_post(&broadcast_mutex, __LINE__);
le_audio_switch_ops = get_broadcast_audio_sw_ops();
//关闭本地音频播放
if (le_audio_switch_ops && le_audio_switch_ops->local_audio_close) {
le_audio_switch_ops->local_audio_close();
}
params.fmt.nch = get_big_audio_coding_nch();
params.fmt.bit_rate = get_big_audio_coding_bit_rate();
params.fmt.coding_type = LE_AUDIO_CODEC_TYPE;
params.fmt.frame_dms = get_big_audio_coding_frame_duration();
params.fmt.sdu_period = get_big_sdu_period_us();
params.fmt.sample_rate = LE_AUDIO_CODEC_SAMPLERATE;
params.fmt.dec_ch_mode = LEA_RX_DEC_OUTPUT_CHANNEL;
params.reference_time = broadcast_audio_reference_time;
params.conn = broadcast_hdl;
broadcast_mutex_pend(&broadcast_mutex, __LINE__);
if (find) {
if (broadcast_role == BROADCAST_ROLE_TRANSMITTER) {
for (i = 0; i < get_bis_num(BROADCAST_ROLE_TRANSMITTER); i++) {
if (!broadcast_hdl->bis_hdl_info[i].recorder) {
if (le_audio_switch_ops && le_audio_switch_ops->tx_le_audio_open) {
recorder = le_audio_switch_ops->tx_le_audio_open(¶ms);
spin_lock(&broadcast_lock);
broadcast_hdl->bis_hdl_info[i].recorder = recorder;
broadcast_hdl->bis_hdl_info[i].init_ok = 1;
spin_unlock(&broadcast_lock);
}
}
}
} else if (broadcast_role == BROADCAST_ROLE_RECEIVER) {
for (i = 0; i < get_bis_num(BROADCAST_ROLE_RECEIVER); i++) {
if (!broadcast_hdl->bis_hdl_info[i].bis_hdl) {
continue;
}
if ((!broadcast_hdl->bis_hdl_info[i].rx_player.le_audio) &&
(!broadcast_hdl->bis_hdl_info[i].rx_player.rx_stream)) {
if (le_audio_switch_ops && le_audio_switch_ops->rx_le_audio_open) {
le_audio_switch_ops->rx_le_audio_open(&broadcast_hdl->bis_hdl_info[i].rx_player, ¶ms);
spin_lock(&broadcast_lock);
broadcast_hdl->bis_hdl_info[i].init_ok = 1;
spin_unlock(&broadcast_lock);
}
}
}
}
}
broadcast_mutex_post(&broadcast_mutex, __LINE__);
return 0;
}
apps\soundbox\wireless_trans\le_audio\big\app_le_broadcast.c
void user_broadcast_audio_all_close(void)
{
for (u8 i = 0; i < BIG_MAX_NUMS; i++) {
if (app_big_hdl_info[i].used && app_big_hdl_info[i].big_hdl) {
line_inf
broadcast_audio_all_close( app_big_hdl_info[i].big_hdl);//
// ret = broadcast_close(app_big_hdl_info[i].big_hdl);
// memset(&app_big_hdl_info[i], 0, sizeof(struct app_big_hdl_t));
// app_big_hdl_info[i].big_status = status;
}
}
}
void user_broadcast_audio_all_open(void)
{
for (u8 i = 0; i < BIG_MAX_NUMS; i++) {
if (app_big_hdl_info[i].used && app_big_hdl_info[i].big_hdl) {
line_inf
broadcast_audio_all_open( app_big_hdl_info[i].big_hdl);//
// ret = broadcast_close(app_big_hdl_info[i].big_hdl);
// memset(&app_big_hdl_info[i], 0, sizeof(struct app_big_hdl_t));
// app_big_hdl_info[i].big_status = status;
}
}
}
- le_audio_200-P2,706n_wireless_mic_200,tx开启echo,连接成功后音箱端会有PO声 修改文件
sound_device_driver_增加话筒数据淡入.zip - 706n_le_audio_200,播放提示音前后开关无线话筒解码,如果播放提示音是wtg格式,会出现PO声,如果播放的是MP3提示音则没有PO声出来 测试到有该问题,可以先临时用MP3提示音播放
- 706n_le_audio,ram不足死机汇总解决列表
| 问题描述 | 解决方法 |
|---|---|
| 706n_le_audio_200,U盘解码MP3加两个无线话再增加一个AD101N灯板显示功能会ram不足死机 | |
| 706n_le_audio_200,U盘解码MP3歌曲,两个无线话筒连接成功,将其中一个话筒不停开关,会复现出ram不足死机 | |
| 706n_le_audio_200,仅仅修改音频配置为双声道,媒体和系统等音频流没有切换成对应立体声音频流程时,连接两个话筒后会出现ram不足死机 | |
| 706n_le_audio_200,广播主机开关容易死机 | 1.DRC改limiter![]() 2.config_jlstream_use_icache_num=2; 3.关闭广播后再播放关闭广播的提示音 |
- le_audio_100-P5,为节省资源需在播放MP3提示音前后开关一下无线话筒的音效,调用接口会造成话筒断连的,需要做个接口,保持连接
apps\soundbox\wireless_trans\le_audio\cig\le_connected.c
int le_connected_audio_all_close(u16 cig_hdl)
{
u8 i;
int ret;
void *recorder = 0;
int player_status = 0;
struct connected_rx_audio_hdl player;
player.le_audio = 0;
player.rx_stream = 0;
if (!connected_init_flag) {
return -1;
}
log_info("--func=%s", __FUNCTION__);
//TODO:获取播放状态
if (le_audio_switch_ops && le_audio_switch_ops->play_status) {
player_status = le_audio_switch_ops->play_status();
}
struct connected_hdl *p, *n;
connected_mutex_pend(&connected_mutex, __LINE__);
spin_lock(&connected_lock);
list_for_each_entry_safe(p, n, &connected_list_head, entry) {
if (p->cig_hdl != cig_hdl) {
continue;
}
for (i = 0; i < CIS_MAX_CONNECTABLE_NUMS; i++) {
p->cis_hdl_info[i].init_ok = 0;
// p->cis_hdl_info[i].cis_hdl = 0;
if (p->cis_hdl_info[i].recorder) {
recorder = p->cis_hdl_info[i].recorder;
p->cis_hdl_info[i].recorder = NULL;
}
if (p->cis_hdl_info[i].rx_player.le_audio) {
player.le_audio = p->cis_hdl_info[i].rx_player.le_audio;
p->cis_hdl_info[i].rx_player.le_audio = NULL;
}
if (p->cis_hdl_info[i].rx_player.rx_stream) {
player.rx_stream = p->cis_hdl_info[i].rx_player.rx_stream;
p->cis_hdl_info[i].rx_player.rx_stream = NULL;
}
spin_unlock(&connected_lock);
if (recorder) {
//TODO:关闭recorder
if (le_audio_switch_ops && le_audio_switch_ops->tx_le_audio_close) {
le_audio_switch_ops->tx_le_audio_close(recorder);
recorder = NULL;
}
}
if (player.le_audio && player.rx_stream) {
//TODO:关闭player
if (le_audio_switch_ops && le_audio_switch_ops->rx_le_audio_close) {
le_audio_switch_ops->rx_le_audio_close(&player);
player.le_audio = NULL;
player.rx_stream = NULL;
}
}
spin_lock(&connected_lock);
}
}
spin_unlock(&connected_lock);
connected_mutex_post(&connected_mutex, __LINE__);
return 0;
}
int le_connected_audio_all_open(u16 cig_hdl)
{
u8 find = 0;
u8 index = 0;
struct connected_hdl *connected_hdl = 0;
struct le_audio_stream_params params = {0};
cig_hdl_t * hdl = (cig_hdl_t *)cig_hdl;
u8 i = 0;
void *recorder = 0;
if (!connected_init_flag) {
return -1;
}
connected_mutex_pend(&connected_mutex, __LINE__);
list_for_each_entry(connected_hdl, &connected_list_head, entry) {
if (connected_hdl->cig_hdl == cig_hdl) {
find = 1;
break;
}
}
connected_mutex_post(&connected_mutex, __LINE__);
for (i = 0; i < CIS_MAX_CONNECTABLE_NUMS; i++) {
if (!connected_hdl->cis_hdl_info[i].cis_hdl) {
index = i;
break;
}
}
le_audio_switch_ops = get_connected_audio_sw_ops();
//关闭本地音频播放
if (le_audio_switch_ops && le_audio_switch_ops->local_audio_close) {
le_audio_switch_ops->local_audio_close();
}
params.fmt.nch = get_cig_audio_coding_nch();
params.fmt.bit_rate = get_cig_audio_coding_bit_rate();
params.fmt.coding_type = LE_AUDIO_CODEC_TYPE;
params.fmt.frame_dms = get_cig_audio_coding_frame_duration();
params.fmt.sdu_period = get_cig_sdu_period_us();
params.fmt.sample_rate = LE_AUDIO_CODEC_SAMPLERATE;
params.fmt.dec_ch_mode = LEA_TX_DEC_OUTPUT_CHANNEL;
params.reference_time = connected_audio_reference_time;
params.conn = connected_hdl;
params.fmt.dec_ch_mode = LEA_RX_DEC_OUTPUT_CHANNEL;
connected_mutex_pend(&connected_mutex, __LINE__);
if (find) {
for (i = 0; i < CIS_MAX_CONNECTABLE_NUMS; i++) {
if (!connected_hdl->cis_hdl_info[i].cis_hdl) {
continue;
}
if ((!connected_hdl->cis_hdl_info[i].rx_player.le_audio) &&
(!connected_hdl->cis_hdl_info[i].rx_player.rx_stream)) {
if (le_audio_switch_ops && le_audio_switch_ops->rx_le_audio_open) {
le_audio_switch_ops->rx_le_audio_open(&connected_hdl->cis_hdl_info[i].rx_player, ¶ms);
spin_lock(&connected_lock);
connected_hdl->cis_hdl_info[i].init_ok = 1;
spin_unlock(&connected_lock);
}
}
}
}
connected_mutex_post(&connected_mutex, __LINE__);
return 0;
}
apps\soundbox\wireless_trans\le_audio\cig\app_le_connected.c
void user_le_connected_audio_all_close(void)
{
for (u8 i = 0; i < CIS_MAX_CONNECTABLE_NUMS; i++) {
if (app_cig_conn_info[i].used && app_cig_conn_info[i].cig_hdl) {
le_connected_audio_all_close(app_cig_conn_info[i].cig_hdl);//
// ret = broadcast_close(app_big_hdl_info[i].big_hdl);
// memset(&app_big_hdl_info[i], 0, sizeof(struct app_big_hdl_t));
// app_big_hdl_info[i].big_status = status;
}
}
}
void user_le_connected_audio_all_open(void)
{
for (u8 i = 0; i < CIS_MAX_CONNECTABLE_NUMS; i++) {
if (app_cig_conn_info[i].used && app_cig_conn_info[i].cig_hdl) {
le_connected_audio_all_open( app_cig_conn_info[i].cig_hdl);//
// ret = broadcast_close(app_big_hdl_info[i].big_hdl);
// memset(&app_big_hdl_info[i], 0, sizeof(struct app_big_hdl_t));
// app_big_hdl_info[i].big_status = status;
}
}
}
le_audio_100-P5,开不可屏蔽中断后,导致写VM死机,无断言打印。 【金山文档 | WPS云文档】 system.a(6d7a790b 添加多核才获取lock条件)0906
https://kdocs.cn/l/ccenwQVlSkkEAC706N_le_audio_V2.0.0_patch04开启录音功能失败 开启打印的错误信息如下:
处理方法:
AC706N_3ln1_wireless_mic_tx SDK,开启led7_UI显示闪烁问题

需要增加timer定时器,并且将led7_driver.c放入RAM中,需修改以下文件,对比修改。 file.rar
JL706N-soundbox_1.0.0(patch 01) SDK 实现提示音无缝播放 具体可以参考附件里面:FILE_DEC_DEST_PLAY 宏定义的内容:
提示音无缝播放修改对比文件.zip
关键函数如下:


JL706N-soundbox_1.0.0(patch 02) SDK FM搜台时间较三合一方案要长很多 LTY 706soundbox方案(300ms)收音确认真假台时间比LEaudio的时间(84ms)长太多了
解决方案:
换CPU.a库
cpu(2024年12月23日_sounboxV1.0P2优化收台速度)AC706N_le_audio_V1.0.0_patch05 旧SDK 按键连击会有串键的情况发生。(最新的SDK已经修复)LTY

if (key->event == KEY_ACTION_NO_KEY) {
if (click_cnt >= 2) {
u16 multi_click_temp = KEY_ACTION_DOUBLE_CLICK + (click_cnt - 2);
if (multi_click_temp < KEY_ACTION_MAX) {
key->event = multi_click_temp;
}
} else {
key->event = KEY_ACTION_CLICK;
}
- AC706N音箱SDK 使用一组SPI切换DO数据脚映射(用于推两条RGB灯光)LTY


- AC706N系列HW_SPI分时复用使用方法 复用应用.otl
- le_audio_v200p08配置SDPG为SD卡供电脚,升级时无法维持 适用场景:SDPG做维持io给样机供电
修改方法:配置SD卡电源为SD_PWR_NULL和SDPG一直打开,然后按截图修改sd0_update的配置。
这样配置也是以SDPG作为SD卡的供电脚,且一直维持高电平。

- AC706N_3ln1_wireless_mic_tx_2.0.0(patch_04)SDK 软关机无法配置VDDIO掉电 修改方法:配置soff_mode为0。

- AC706N_le_audio_2.0.0(patch_08.06)SDK 关闭1T3 功能和FM模式使能后,插入U盘后再拔出U盘切换到BT 模式触发死机断言 问题复现:会触发这个创建 btencry 线程错误的断言
[00:00:09.825]le_config:1 0 0 0
[00:00:09.825][LMP]>>>btctrler_task_init<<<
[00:00:09.825]cpu 0 file:/jks/workspace/manifest_dev_soundbox_export/btsdk/lib/system/task/task.c, line:88
[00:00:09.826]ASSERT-FAILD: err == OS_ERR_NONE task_create_faild: btencry, 25
问题解决:
增加 mode_try_exit = APP_MODE_NULL;
29. AC706N_le_audio_2.0.0(patch_08.06)SDK 增加频谱获取节点后,播放U盘歌曲第一首结束后会触发死机断言 问题表现:触发spec255 info unknow 断言
解决办法:替换media.a
leaudi_AC706N_2.0.0(patch_08.06)_br29频谱创建线程失败问题.zip
测试用例
- AC7068M话筒省电容麦克风demo程序 以下提供可以直接下载到省电容麦克风的程序,PA1做为MIC脚,PA0是MIC_BIAS脚,由于AC7068M的5脚PA1和PA0刚好邦定一起,5脚既可以做信号采集也可以提供偏置电压。
7068M_话筒_省电容_1.0.0_patch03.zip - AC706N 杰理开发平台添加能量检测 具体可以看项目帮助文档——能量检测

- 添加对应的音频节点

- 3in1_wireless_mic_tx 200P2 7068M串口在线调试demo 样机引脚配置:
TX:P00(VPWR),去掉该引脚上的电阻电容防止信号干扰
RX:PC4
200P2-BOX开TWS-7068M-MIC串口在线调试[RX-PC4_TX-P00(VPWR)].7z
- 如果关打印不能在线调试尝试如下修改
#if ((defined CONFIG_DEBUG_ENABLE) && (TCFG_UART0_ENABLE))
__this->udev = uart_init(-1, &config);
#else
__this->udev = uart_init(1, &config);
#endif

- 3in1_wireless_mic_tx 100P3 7068M串口在线调试demo 样机引脚配置:
TX:P00(VPWR),去掉该引脚上的电阻电容防止信号干扰
RX:PC4
demo(已修复关打印不能在线调试问题):3in1_wireless_mic_tx_100P03_7068M_在线调音.7z - AC7069F蓝牙头戴耳机标准原理图V1.1 程序配置范例 使用SDK:soundbox 0.1.0 版本 或者 sounbox_1.0.0_patch02 以后版本
对应的工具配置
- 板级配置(LED灯的IO不能调换,驱动写死,一定是PC4配红灯,PC5配蓝灯!!!!!)




- 按键配置

- 功能配置

- AC706N-le_audio-200SDK有线/无线麦录音demo DEMO 程序 1
AC706N-le_audio-200SDK有线_无线麦录音demo.otl
706n_le_audio_2.0.0_patch_08_无线有线录音demo.rar
- 因ram资源问题,有线麦和无线麦不能同时录音,看情况选择是否配置可以连接1个无线话筒或2个无线话筒。如下图的宏定义 RX_USED_BIS_NUM

- 录音过程中,如果录音的是无线话筒,当无线话筒均断开后,录音自动结束,保存录音文件。
- 录音过程中,如果录音的是有线话筒,话筒拔出退出音频流程,录音自动结束,保存录音文件。
- 录音过程中,如果录音的是无线话筒,插入有线话筒,录音自动结束,保存录音文件。
- 录音过程中,如果录音的是有线话筒,无线话筒连接上,录音自动结束,保存录音文件。
- 发起录音,录音模式下使用APP_MSG_REC_PP消息。
- 编码器的采样率必须配置为44100采样率,demo程序中已经配置好,否则会出现无线话筒连接上/有线话筒打开,没有声音的问题。具体打印信息会出现‘H’,意味着音频流协商出现问题。
- SDK包含了无线话筒程序,le_audio程序,以及v6stencil.stencil文件,v6stencil.stencil文件需要替换到对应的patch路径中,如C:\JLStudio.netcache\le_audio_AC706N_2.0.0_patch_08\config\config
9、如果案子使能 TCFG_DEV_MANAGER_ALONE_DEVICE_LIMIT 使能开关(DM复用SD_CMD)
需要添加以下代码
DEMO 程序 2
le_audio_200_patch04_录音功能开发.rar
- 该SDK开启了0编码,可以支持无线话筒都断开的时候继续保存录音,需要手动关闭录音。
- 支持双无线话筒录音 修复的一些异常BUG:
修复录音时拔出sd卡死机问题:
//*----------------------------------------------------------------------------*/
/**@brief 设备下线预处理
@param
event:设备事件
@return
@note 根据特殊情景,这里可以处理一些例如io复用处理
*/
/*----------------------------------------------------------------------------*/
static int dev_manager_del_prepare(int *msg)
{
int ret = 0;
switch (msg[0]) {
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
#if (USER_EX_WIRELESS_MIC_RECORD_MODE_EN && TCFG_APP_RECORD_EN)
extern void ex_record_stream_close(void);
extern void app_audio_mute(u8 value);
if (get_rec_stream_state()) {
ex_record_stream_close();
app_audio_mute(1);
}
#endif
mult_sd_offline_before((char *)msg[2], g_usb_id);
break;
//#if TCFG_UDISK_ENABLE || TCFG_HOST_AUDIO_ENABLE
// case DEVICE_EVENT_FROM_OTG:
// ///host umount
// usb_host_unmount(g_usb_id);
// break;
//#endif
}
return ret;
}
- AC706N-le_audio-200P08 Linein 设置DAC为高阻态 注:
- linein/AUX 座子上的R/L与主控DAC R/L 并联之后接入功放/耳机,在插入linein/AUX之后需要把主控DAC设置为高阻态同时关掉DAC偏置

- Demo ac706_le_audio_2.0.0P08-linein设置dac为高阻态.7z(测试dmeo的flash配置为双线,如果下载到样机上开不了机请还原为4线)

- 强定义void audio_dac_power_state(u8 state)接口,并编写实现
- 库里面该接口为弱定义 attribute((weak)) void audio_dac_power_state(u8 state);
- void audio_dac_power_state(u8 state)该接口主要是控制dac高阻态的开关
- 该接口在dac_power_off、dac_power_on中有调用该接口,如果在没有音频流工作时,调用这两个接口会把dac偏置关掉。
void audio_dac_power_state(u8 state){
g_printf("audio_dac_power_state set state=%d 0x%x\n",state,JL_ADDA->DAA_CON2);
extern struct audio_dac_hdl dac_hdl;
switch (state){
case DAC_ANALOG_CLOSE_FINISH:
SFR(JL_ADDA->DAA_CON2, 23, 1, 1); //SDDAC_TRIM_EN_11v
break;
case DAC_ANALOG_OPEN_FINISH:
SFR(JL_ADDA->DAA_CON2, 23, 1, 0); //SDDAC_TRIM_EN_11v
break;
default:
break;
}
g_printf("audio_dac_power_state --- 0x%x\n",JL_ADDA->DAA_CON2);
}
- 进linein时调用dac_power_off 退出时调用dac_power_on
//*----------------------------------------------------------------------------*/
/**@brief linein 入口
@param 无
@return
@note
*/
/*----------------------------------------------------------------------------*/
static int linein_tone_play_end_callback(void *priv, enum stream_event event)
{
if (false == app_in_mode(APP_MODE_LINEIN)) {
return 0;
}
switch (event) {
case STREAM_EVENT_NONE:
case STREAM_EVENT_STOP:
// 注释掉原来lienin流程
// app_send_message(APP_MSG_LINEIN_START, 0);
//关dac偏置 设置dac为高阻态
dac_power_off();
break;
default:
break;
}
return 0;
}
void app_linein_exit()
{
app_set_current_mode(app_get_mode_by_name(APP_MODE_NULL)); //这里把MODE设置成NULL,防止快速切模式的时候提示音还没播完已经退出当前模式,在提示音回调里还继续开广播
linein_stop();
linein_idle_flag = 1;
app_send_message(APP_MSG_EXIT_MODE, APP_MODE_LINEIN);
/* tone_player_stop(); */
//恢复dac设置
dac_power_on();
}
- AC706N-le_audio-200P0803 广播 DEMO:
jl706nle_audio_2.0.0-feature_200_P0803_JLA_LW48000-广播dmeo.zip(文件夹的名称比较长解压之后重命名一个短一些的名称不然超过windows路径长度编译报找不到文件)
内部地址 - 706 le audio200P0806开BIS广播 测试demo:AC706_le_audio_2.0.0-p0806-music广播.7z
- 广播与1T3功能冲突,需要关1T3使能

- 帧持续时间默认为12.5ms会卡顿,改为10ms

- 编码格式根据项目自行选择

- JLA 使用48K采样 音质最好,内存使用最大
- JLA_LW 使用32K采样 音质中等,内存使用中等
- JLA_LL 使用16K采样 音质低,内存使用最少
- PKT_V3可开可不开
- AC706N IO中断
// 中断回调函数
gpio_irq_callback_p_test1(enum gpio_port port, u32 pin, enum gpio_irq_edge edge)
{
printf("port%d.%d:%d-cb1\n", port, pin, edge);
}
// 中断初始化
struct gpio_irq_config_st gpio_irq_config_C = {
.pin = PORT_PIN_1|PORT_PIN_3|PORT_PIN_4|PORT_PIN_5, //PORT_PIN_
.irq_edge = PORT_IRQ_EDGE_FALL,//PORT_IRQ_ANYEDGE
.callback = gpio_irq_callback_p_test1,
.irq_priority = 2, //中断优先级
};
gpio_irq_config(PORTC, &gpio_irq_config_C);
struct gpio_irq_config_st gpio_irq_config_B = {
.pin = PORT_PIN_0|PORT_PIN_1|PORT_PIN_3|PORT_PIN_4|PORT_PIN_5|PORT_PIN_6|PORT_PIN_7, //PORT_PIN_
.irq_edge = PORT_IRQ_EDGE_FALL,//PORT_IRQ_ANYEDGE
.callback = gpio_irq_callback_p_test1,
.irq_priority = 2, //中断优先级
};
gpio_irq_config(PORTB, &gpio_irq_config_B);
struct gpio_irq_config_st gpio_irq_config_A = {
.pin = PORT_PIN_0|PORT_PIN_1|PORT_PIN_3|PORT_PIN_4|PORT_PIN_7, //PORT_PIN_
.irq_edge = PORT_IRQ_EDGE_FALL,//PORT_IRQ_ANYEDGE
.callback = gpio_irq_callback_p_test1,
.irq_priority = 2, //中断优先级
};
gpio_irq_config(PORTA, &gpio_irq_config_A);
demo
补丁:
AC706N_le_audio_sdk_release_2.0.0_patch_08.03 PC5无法触发需要替换以下的库文件
cpu_修改PC5无法映射中断问题(br29-ac706n_3In1_soundbox_release_200p8)
AC706N-IO中断代码
11. AC706N MCPWM 示范代码:SDK\cpu\br29\periph\mcpwm.c
void mcpwm_test(void) //直接调用即可
补丁:
- AC706N_le_audio_sdk_release_2.0.0_patch_08 以及相关SDK 设置占空比的函数没有实现完整需要按一下函数进行修改:
可能会引起设置0/100占空比后pwm没有波形输出的问题
void mcpwm_set_duty(int mcpwm_cfg_id, u16 duty)
void mcpwm_set_duty(int mcpwm_cfg_id, u16 duty)
{
ASSERT(mcpwm_info[mcpwm_cfg_id] != NULL, "func:%s(), line:%d\n", __func__, __LINE__);
int id = mcpwm_cfg_id;
u32 ch = (u32)mcpwm_info[id]->cfg.ch;
MCPWM_TIMERx_REG *timer_reg = mcpwm_get_timerx_reg(ch);
MCPWM_CHx_REG *ch_reg = mcpwm_get_chx_reg(ch);
u16 ch_cmph = 0;
u16 ch_cmpl = 0;
u16 tmr_cnt = 0;
u16 tmr_con = timer_reg->tmr_con;
u16 tmr_pr = timer_reg->tmr_pr;
asm("csync");
ch_cmpl = tmr_pr * duty / 10000;
printf("---%d---%d---%d\n", ch_cmpl, tmr_pr, duty);
ch_cmph = ch_cmpl;
tmr_cnt = 0;
/* tmr_con |= 0b01; */
if (duty == 10000) {
tmr_cnt = 0;
tmr_con &= ~(0b11);
} else if (duty == 0) {
tmr_cnt = ch_cmpl;
tmr_con &= ~(0b11);
} else {
if (mcpwm_info[id]->cfg.aligned_mode == MCPWM_CENTER_ALIGNED) { //中心对齐
tmr_con |= 0b10; //递增-递降循环模式,中心对齐
} else {
tmr_con |= 0b01; //递增模式,边沿对齐
}
}
spin_lock(&mcpwm_lock);
ch_reg->ch_cmph = ch_cmph;
ch_reg->ch_cmpl = ch_cmpl;
u32 mcpwm_con = JL_MCPWM->MCPWM_CON0;
JL_MCPWM->MCPWM_CON0 |= BIT(16);
timer_reg->tmr_cnt = tmr_cnt;
timer_reg->tmr_con = tmr_con;
JL_MCPWM->MCPWM_CON0 = mcpwm_con;
spin_unlock(&mcpwm_lock);
}
AC706N 杰理之家 SDK:AC706N_soundbox_1.0.0_patch_04.02 (开始支持杰理之家,没有权限的客户需要单独申请)
补丁资料:
gitlab 最新维护分支:
Files · feature_1.0.0_patch_04.02_杰理之家 · JL-Studio / SoundBox / 706N / AC706N_SoundBox_1.0.0 · GitLab
2025年12月03日:
SDK:AC706N_soundbox_1.0.0_patch_04.02
使用方法:压缩包解压后,直接覆盖原工程。然后重新打开工程,重新编译
feature_1.0.0_patch_04.02_杰理之家_f951b308.7z
2025年11月14日:
SDK:AC706N_soundbox_1.0.0_patch_04.02
使用方法:压缩包解压后,直接覆盖原工程。然后重新打开工程,重新编译
feature_1.0.0_patch_04.02_杰理之家_4a5711cc.zip小度APP SDK:AC706N_soundbox_1.0.0_patch_08.06
demo:706_le_audio_2.0.0_P08.06_xiaodu_20260112.rar
修改点:支持小度2.0.0版本
设置普通io为串口主从升级功能 升级主从设置

- le_audio-AC706N-2.0.0-patch_08 SDK:le_audio-AC706N-2.0.0-patch_08
demo:patch08主从机升级验证ok.zip - soundbox-AC706N-1.0.0-patch_04.02
- 单备份: Files · feature_普通io串口单备份升级 · JL-Studio / SoundBox / 706N / AC706N_SoundBox_1.0.0 · GitLab
- 双备份: Files · feature_普通io串口双备份升级 · JL-Studio / SoundBox / 706N / AC706N_SoundBox_1.0.0 · GitLab
注意:
设置的大小与实际的对应不上会升级失败,比如:配置为8M实际为16M 升级显示成功但是实际重新上电还是原来的程序。
优化代码空间:
le_audio-AC706N-2.0.0-patch_08 添加提示音无缝循环播放 demo: 706_200_08提示音循环无缝播放.rar
AC706N_le_audio_V2.0.0_patch08.07 播放提示音时加减提示音音量 Files · feature_调节提示音音量_08.07 · JL-Studio / Leaudio / 706N / AC706_le_audio_2.0.0 · GitLab
注意:音量调节的节点名称程序与音频流必须一 一对应

demo里面用的是叠加接口播放提示音的接口,如果是非叠加播放接口需要自己去实现

默认加减提示音的节点是Vol_SysTone如果需要改成其他的可以自行修改相关参数与名称

AC706N_le_audio_V2.0.0_patch08.06 外挂FM RDA5807 内部链接:Files · feature_200_patch_08.06_外挂FM5807 · 自由品牌 / 客户支持 / JLStudio / le_audio / JL706Nle_audio_2.0.0 · GitLab
demo:706_le_audio_2.0.0_08.06_RDA5807.rar
修改内容:添加外挂FM(RDA5807),使用软件IIC通信
修复收音异常问题
修复搜台异常死机问题
AC706N_le_audio_V2.0.0_patch08.07 串口传输音频数据 实现功能:
A样机拿到linein的pcm数据通过串口传给另一个B样机并播放出来
tx:linein->effect_dev0->uart
rx:uart->source->dac
Files · 两706通过串口把mic数据传给对方并从对方dac输出 · JL-Studio / Leaudio / 706N / AC706_le_audio_2.0.0 · GitLabac706soundbox_1.0.0patch04.02 添加测试盒串口升级功能 demo链接:Files · feature_P04.02_添加测试盒串口升级功能 · JL-Studio / SoundBox / 706N / AC706N_SoundBox_1.0.0 · GitLab
AC706N系列HW_SPI分时复用使用方法




