JL701N音箱问题整理
📎 原始文档:https://www.kdocs.cn/l/caiLRFRhfsmM JL701N音箱问题整理
前言:本文档整理将以各个SDK遇到的共性问题做整理汇总,可直接根据所使用的sdk版本及功能快速索引相关问题点
开发注意点
OTA问题处理
分支:bugfix_1.4.2_ota
https://gitlab.zh-jieli.com/soundbox/novisualization/ac701n_soundbox_sdk/-/tree/bugfix_1.4.2_ota
- JL701N 升级维持IO状态功能需要注意IO的选择 ROM中IO无法维持IO状态,需要避免硬件上使用以下IO做mos管的维持脚等。

- JL701N 蓝牙添加PA(例如:RFX2401C) 需要注意发射功率选择 相关链接:蓝牙相关.otl
在设计阶段有添加PA的方案,可能需要适当调节蓝牙主控端的RF功率,避免饱和导致波形失真,从而导致信号不好,导致声音卡顿
bt_rf_PA_control_io_remap(IO_PORTB_06,IO_PORTB_07); //701N 有其他芯片可能没有这个 txen->PB6
- JL701N spi推灯有概率出现不亮灯 对应的io口在初始化时需开HD0强驱
- JL701N 支持映射的IO口列表,PE口不支持唤醒(SPI等等的需要映射使用的功能)
- 支持的映射的外设有:SD0、IIC、UART0,1,2、TDM等
- 注意:模拟的外设是不支持映射

- JL701N 使用24BIT DAC输出 跟 16BIT DAC输出 软件差异点
- 位宽:16BIT 数据位宽: 2byte , 24BIT数据位宽: 4byte
- 能量值:24bit的数据比16bit位数多,计算出来的能量就会比16BIT的值大 所以:之前使用的16bit的能量值阈值需要对应调大:如 混响的闪避值等

- DRC:对应的满幅度的值也不一样。16bit为90.3dB、24bit 为138.4dB

- JL701N AUX声道左右相反 《JL7016C蓝牙音箱方案标准原理图V1.1.pdf》和《JL7012C蓝牙音箱方案标准原理图V1.1.pdf》两个原理图的AUX画反。

发布的原理图和代码标注的左右声道相反。修改方式是重画硬件左右声道,或软件上将数据左右数据调换。
【金山文档】 linein左右声道相反
linein左右声道相反.rar - SDK提示音文件名长度目前不支持超过14字符长度,超过有可能出现播放声音异常(2023年11月28日) 修改方法:先减少提示音文件名的长度


- SDK中的最高采样率和WAV码率等修改支持 目前有关Media相关的配置都会写在 apps\soundbox\log_config\lib_media_config.c
// wav最大支持比特率,单位kbps
const int WAV_MAX_BITRATEV = (48 * 2 * 12);
// 支持的最大采样率
const int CONFIG_DEC_SUPPORT_SAMPLERATE = 96000;
- SDK中的混响模式中增加 LLNS 节点,需要同步修改中断点数的问题 中断点数对应关系:
// const u16 llns_frame_size[4][2] = {
// {16000, 80},
// {32000, 160},
// {44100, 220},
// {48000, 240},
// };

共性问题
JL701N 2T1 DUPLEX应用共性问题汇总链接 JL701N_2T1_DUPLEX 应用软件问题汇总.otl
JL701N v1.0.0播放APE格式的音频文件,关机时会出现音乐先卡几下再关机 20220816 LJW 退出音乐模式时写断点造成的卡顿,改成先结束解码再写断点,如下图



JL701N v1.0.0启用消人声之后声音变调20220711 SQ

JL701N v1.0.0一拖八USB带电池烧录异常问题 fs ac701n_soundbox_release_v1.0.0一拖八USB带电池烧录异常问题
解决办法:添加如下自定义命令
extern void go_mask_usb_updata();
static u32 setup_other(struct usb_device_t *usb_device, struct usb_ctrlrequest *req)
{
u8 ack_data[8] = {0};
u32 ret = 0;
u32 tx_len;
u8 *tx_payload = usb_get_setup_buffer(usb_device);
switch (req->bRequest) {
case USB_REQ_GET_STATUS:
#if TCFG_TYPEC_EARPHONE_TEST_FILTER
tx_len = 1;
tx_payload[0] = 0xfe;
usb_set_data_payload(usb_device, req, tx_payload, tx_len);
#endif
if ((req->wValue == 0xfc) && (req->wIndex == 0xfe)) {
if (req->wLength == sizeof(ack_data)) { //֧�ָ�˽��������Ӧ
log_info("support private update command\n");
memset(ack_data, 0xff, sizeof(ack_data));
usb_set_data_payload(usb_device, req, ack_data, sizeof(ack_data));
} else if (req->wLength == 0x00) { //����ת����ģʽ
log_info("run func go_mask_usb_updata()\n");
usb_set_setup_phase(usb_device, USB_EP0_STAGE_SETUP);
go_mask_usb_updata();
}
ret = 1;
}
break;
default:
ret = 1 ;
break;
}
return ret;
}
- JL701N v1.0.0使用eq_mode_sw或者eq_mode_set切换EQ模式后,暂停再播放EQ会变回默认问题 20220723 FSW 解码开EQ使用到了music_mode数组,但是使用eq_mode_sw或者eq_mode_set切换时没有更新music_mode数组,需要更新一下。
u8 tar = nor_label;
music_mode[tar].eq_parm.global_gain = global_gain_tab[eq_mode];
music_mode[tar].eq_parm.seg_num = ARRAY_SIZE(eq_tab_normal);
memcpy(music_mode[tar].eq_parm.seg, seg, sizeof(eq_tab_normal));
JL701N v1.3.0 公版开启混响后,测试在大声一些喊的时候左声道出现"po”声 20230525LCP 原因:程序使能了mic_eq4,但eq4的drc和eg调换位置,在 MIC EFFECT REVERB ECHO ADVANCE做了位宽匹配处理 (drc 16bit输出,匹配eg 16bit输入),没有在 MIC EFFECT REVERB ECHO做相应的处理,导致大声喊话时声音异常
解决办法:
JL701N v1.3.0 music模式打断方式播放提示音后无声问题 2023/04/28 LCP

- JL701N v1.3.0开PC模式,PC端设置mic增益级别时,下发mic增益给701,会死机 - 2022/07/01 MJW 问题出现:PC端如下设置:

开启断言之后得到:
原因:cpu_in_irq 意思是当前在中断里面。
因为VM的临界区保护是使用了信号量。操作系统的信号量是不能在中断状态、或者中断关闭状态获取。所以不能在中断中写入VM。
处理办法:延后写入处理
- JL701N v1.3.0 DAC输出使用左右差分方式,人声消除会有杂音问题修改方法 WGH -2023/04/12 原因:消人声应该以立体声的音频数据来参考处理,由于DAC输出选择了左右差分方式,会在消人声的数据流节点前加了一个节点将右边声道进行反相处理,导致消原音的数据不是立体声数据,消除效果不好。

处理方法:将消原音的数据流节点放到反相节点前面即可。
注意:由于消人声是放在mixer节点中(关于数据节点的设计,可以看看发布SDK中的文档《AUDIO接口设计说明文档V1.0》),提示音数据流也会经过mixer节点,所以消人声也会把提示音消除,所以需要再播放提示音前关闭消人声,结束后再恢复状态
10. JL701N v1.3.0 蓝牙音频解码码率没有设置到最高影响音频音质 相关资料链接
蓝牙相关.otl
修改方法:
apps\soundbox\task_manager\bt\bt.c 的 bt_function_select_init() 函数中的 :
__set_sbc_cap_bitpool(53); //35~53之间,音箱建议直接设置为53
__set_aac_bitrate(320 * 1000);//范围131k~320K
提高码率带宽会增大,距离可能会变短,具体实测为准
11. JL701N v1.3.0 打开人声消除后,DAC配成单声道输出少了一路声道输出 20230612 LZK 原因:打开人声消除,DAC配成单声道输出会少了一路声道输出。
修改:
cpu\br28\audio_dec\audio_dec.c 的 int audio_dec_init()
#if AUDIO_VOCAL_REMOVE_EN
mix_vocal_remove_hdl = vocal_remove_open(ch_num, sr, 100, 200, 13000);
u8 dac_connect_mode = TCFG_AUDIO_DAC_CONNECT_MODE;
if (dac_connect_mode == DAC_OUTPUT_MONO_L) {
vocal_remove_mix_ch_switch = channel_switch_open(AUDIO_CH_DIFF, 0);
} else if (dac_connect_mode == DAC_OUTPUT_MONO_R) {
vocal_remove_mix_ch_switch = channel_switch_open(AUDIO_CH_DIFF, 0);
}
#endif
JL701N v1.3.0 输出走iis, 蓝牙通话声音卡顿严重,甚至没有声音 -2023/06/13 FS 原因:之前的逻辑是由蓝牙数据驱动解码,蓝牙来数据就驱动解码一次,这样需要解码一次的数据被消耗完不能有模块处理不完,iis 输出需要变采样,这个模块会导致数据一次处理不完,需要激活数据流在跑一次才能处理完数据。修改之后的逻辑是,如果是解码取不到数,说明是没有数据导致的挂起,蓝牙来数据才会去激活。如果是数据流里面模块一次不能将数据处理完,就激活解码在跑一次。
处理方法:软件修改如图
JL701N v1.3.0 U盘、T卡播歌过程拔出,播放提示音前听见"PO"声
-2023/07/07 WGH
原因:突然拔出后DAC仍残留数据,该数据会下次播放提示音前把残留数据播出,听起来类似"PO"声
修改方法: 添加以下播歌杂声补丁
【金山文档】 jl701n_soundbox_release_v1.3.0 播歌杂声补丁
https://kdocs.cn/l/ckekKn0e4yIRJL701N v1.3.0 系统时间jiffies异常,可能导致不可预知的问题 -2023/07/07 WGH
异常系统时间如下图
已发现的会导致的问题:
1、导致adc_scan周期到了也不执行
2、按键失效
修改方法:
15. JL701N v1.3.0 小度APP在第一进入蓝牙模式可以连接,切换模式后再次进入蓝牙模式连接失败 -2023/07/07 WGH
修改方法如下:
JL701N v1.3.0 打开混响后出现近端通话无声问题 修改此处:

JL701N v1.3.0维持IO升级- 升级完成后提示音播放不出来 替换ota.bin文件
【金山文档】 ota
https://kdocs.cn/l/cblxjdQtJflzJL701N v1.3.0链接手机播放歌曲,手机取消配对or忽略设备出现杂音问题 需要替换补丁文件:
【金山文档】 jl701n 播歌杂声补丁-0629
https://kdocs.cn/l/cpyxr0O6P2hP
- 后续SDK已经加上这部分内容,具体看共性问题 《JL701N v1.4.1 播放T卡,U盘等设备切换模式到其他模式,播放提示音前会出现杂音,类似于“PO”声,如果切换的时机刚好在音量较高的时候,比较容易出现》修改
- JL701N v1.3.0 当const int plate_reverb_mode = REVERB_ADVANCE_MODE ,在吹气后update_plate_reverb_parm,后会持续出现“嘶嘶”杂音。
更换lib_plateReverb_adv.a
【金山文档】 lib_plateReverb_adv_701V130
https://kdocs.cn/l/cjYzrS7NSOIN
- JL701N v1.3.0 USB MIC 工作一段时间就会出现异常 PC模式的USB mic 工作一段时间就会出现MIC数据写不进的情况。
修改方法:
替换cpu.a库文件重新编译:
【金山文档】 cpu_JL701N_1.3.0_修改tick timer被关了导致usb的超时函数直接退出的问题
https://kdocs.cn/l/ck56V0OJ6VmQ - JL701N v1.4.0 混响使用多个mic时默认会有6dB的开启


- JL701N v1.4.0 dac设置为差分或者开机混响,dac输出白噪声


#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_MONO_LR_DIFF)
// mic_data_viewer = audio_data_viewer_open(mic_data_viewer_callback);
// mic_data_viewer_entry = audio_data_viewer_entry_get(mic_data_viewer);
extern void last_data_viewer_callback(u8 ch, s16 *data, u32 len);
mic_data_viewer = audio_data_viewer_open(last_data_viewer_callback);
mic_data_viewer_entry = audio_data_viewer_entry_get(mic_data_viewer);
#endif
static void pcm_LR_to_DUAL_DIFF_32(s32 *pcm_lr, s32 *pcm_dual_diff, int points_per_ch)
{
s32 pcm_L;
s32 pcm_R;
s32 pcm_diff;
int i = 0;
for (i = 0; i < points_per_ch; i++, pcm_lr += 2) {
pcm_L = *pcm_lr;
pcm_R = *(pcm_lr + 1);
pcm_diff = (s32)(((int)pcm_L + pcm_R) >> 1);
*pcm_dual_diff++ = pcm_diff;
*pcm_dual_diff++ = -pcm_diff;
// *pcm_dual_diff++ = (pcm_diff == -8388608) ? (8388607) : (-pcm_diff);
*pcm_dual_diff = data_sat_s24(*pcm_dual_diff);
}
}
void last_data_viewer_callback(u8 ch, s16 *data, u32 len)
{
if (global_bit_wide) {
pcm_LR_to_DUAL_DIFF_32((s32 *)data, (s32 *)data, len / 2 / 2 / 2);
} else {
pcm_LR_to_DUAL_DIFF(data, data, len / 2 / 2);
}
}
- JL701N v1.4.1 无缝播放播放不起作用(1.4.2 SDK开始支持) JL701N v1.4.1SDK 24bit的暂时不支持无缝播放
如果使用可以把DAC修改回16BIT 如下
/*
*DAC 位宽(bit width)配置
*16bit:DAC_16BIT_MODE
*24bit:DAC_24BIT_MODE
* */
#define TCFG_AUDIO_DAC_BIT_WIDTH DAC_16BIT_MODE
- JL701N v1.4.1 24BIT输出,单声道差分输出杂音 原因:对于24BIT的位宽24bit的数据没有做好最大最小的数据越界判断,修改如下
sdk\cpu\br28\audio_dec\audio_dec.c
static void pcm_LR_to_DUAL_DIFF_32(s32 *pcm_lr, s32 *pcm_dual_diff, int points_per_ch)
{
s32 pcm_L;
s32 pcm_R;
s32 pcm_diff;
int i = 0;
for (i = 0; i < points_per_ch; i++, pcm_lr += 2) {
pcm_L = *pcm_lr;
pcm_R = *(pcm_lr + 1);
pcm_diff = (s32)(((int)pcm_L + pcm_R) >> 1);
// s32 *cur_addr = pcm_dual_diff;
*pcm_dual_diff++ = pcm_diff;
// *pcm_dual_diff++ = -pcm_diff;
// *cur_addr = data_sat_s24(*cur_addr);
*pcm_dual_diff++ = (pcm_diff == PCM_24BIT_SAT_MIN) ? (PCM_24BIT_SAT_MAX) : (-pcm_diff);
}
}
sdk\cpu\br28\audio_mic\mic_effect.c
static void pcm_LR_to_DUAL_DIFF_32(s32 *pcm_lr, s32 *pcm_dual_diff, int points_per_ch)
{
s32 pcm_L;
s32 pcm_R;
s32 pcm_diff;
int i = 0;
for (i = 0; i < points_per_ch; i++, pcm_lr += 2) {
pcm_L = *pcm_lr;
pcm_R = *(pcm_lr + 1);
pcm_diff = (s32)(((int)pcm_L + pcm_R) >> 1);
*pcm_dual_diff++ = pcm_diff;
// *pcm_dual_diff++ = -pcm_diff;
// *pcm_dual_diff = data_sat_s24(*pcm_dual_diff);
*pcm_dual_diff++ = (pcm_diff == PCM_24BIT_SAT_MIN) ? (PCM_24BIT_SAT_MAX) : (-pcm_diff);
}
}
- JL701N v1.4.1 单声道linein输出有雪花声杂音 原因:ADC采集没有做好单声道的24bit采集
替换media.a后rebuild
【金山文档】 media_修复linein单声道问题
https://kdocs.cn/l/ck6YLe8XjH4M
修改sdk\cpu\br28\audio_dec\audio_dec_linein.c
#if defined(TCFG_AUDIO_ADC_BIT_MODE)&&ADC_BIT_WIDTH_24&&(TCFG_AUDIO_ADC_BIT_MODE == ADC_BIT_WIDTH_24)
dec->pcm_dec.bit_wide = global_bit_wide;
#endif
include_lib\media\media_develop\media\pcm_decoder.h
struct pcm_decoder {
u16 ch_num : 4; // 声道数
u16 output_ch_num : 4; // 输出声道数
u16 output_ch_type : 4; // 输出声道类型
u16 dec_no_out_sound : 1; // 解码不直接输出声音(用于TWS转发)
u16 bit_wide;
u32 sample_rate; // 采样率
struct audio_decoder decoder; // 解码句柄
void *read_priv; // 数据获取私有句柄
int (*read_data)(void *priv, void *buf, int len); // 数据获取
};
- JL701N v1.4.1 开启TCFG_MIC_EFFECT_ENABLE,MP3格式提示音播放断续卡顿杂音。 替换lib_mp3_dec.a后rebuild
【金山文档】 lib_mp3_dec
https://kdocs.cn/l/caYrXh4Ye3Zp - JL701N v1.4.1 开启TWS后出现死机问题 替换btstack.a 后rebuild
【金山文档】 btstack_1.4.1_修复TWS死机问题
https://kdocs.cn/l/cd7oUkuyxJIr - JL701N v1.4.1 24bit 单声道输出+人声消除后出现有雪花声杂音 人声消除的通道切换24BIT输出是32BIT数据,需要设置以下函数,16BIT输出的传0

//bit_wide 0:16bit 1:32bit
channel_switch_set_bit_wide(vocal_remove_mix_ch_switch, 1);
- JL701N v1.4.1 人声消除使用方法 原因:目前人声消除算法添加到各个解码流中,不像以前添加到mixer节点后。
以下代码已经添加bt,music,linein中,其他的解码请自行参考添加
【金山文档】 人声消除修改
https://kdocs.cn/l/cf7ZlfCOeXfL
static u8 vocal_remove_status = 0;
vocal_remove_hdl *a2dp_vocal_remove_hdl = NULL;
vocal_remove_hdl *linein_vocal_remove_hdl = NULL;
vocal_remove_hdl *music_file_vocal_remove_hdl = NULL;
//开关人声消除算法
void vocal_remove_switch(u8 sw)
{
printf("----------------->>>>>sw:%d\n",sw);
local_irq_disable();
vocal_remove_status = sw;
if(a2dp_vocal_remove_hdl){
audio_vocal_remove_sw(a2dp_vocal_remove_hdl, !sw);
}
if(linein_vocal_remove_hdl){
audio_vocal_remove_sw(linein_vocal_remove_hdl, !sw);
}
if(music_file_vocal_remove_hdl){
audio_vocal_remove_sw(music_file_vocal_remove_hdl, !sw);
}
local_irq_enable();
}
//获取开关状态
u8 vocal_remove_get_status(void)
{
return vocal_remove_status;
}
//设置开关状态
void vocal_remove_set_status(u8 ste)
{
vocal_remove_status = ste;
}
30. JL701N v1.4.1 24bit 播放FLAC文件声音异常问题 替换lib_flac_dec.a 后rebuild
【金山文档】 lib_flac_dec_JL701N_1.4.1_解决FLAC文件24BIT播放杂音问题
https://kdocs.cn/l/cr8jlyGPSsSb
31. JL701N v1.4.1 播放T卡,U盘等设备切换模式到其他模式,播放提示音前会出现杂音,类似于“PO”声,如果切换的时机刚好在音量较高的时候,比较容易出现。 cpu\br28\audio_way\audio_app_stream.c
32. JL701N v1.4.1 开启#define CONFIG_APP_BT_ENABLE 宏后,spp收发数据处理没有找到的问题处理。 原因:开启#define CONFIG_APP_BT_ENABLE 宏配置后,spp的收发处理的回调默认会被库里面接管,所以在app层是看不到的。
解决办法:参考如下文档实现双通道spp即可
双通道spp使用.pdf
33. JL701N v1.4.1 开关IIS解码后,不停的打印"W",显示buf满 原因:调用 iis_in_dec_open(TCFG_IIS_SR);打开IIS解码后,调用 iis_in_dec_close();关闭解码时,没有关闭alink模块导致一直填数据,但是没有读数据,显示buf满。
解决办法:
34. JL701N v1.4.1 广播有杂音
- 问题现象
- AUX模式下存在规律的杂音:
2、关闭打印出现杂音
- 原因:位宽异常
- 解决办法: 添加以下补丁(替换库文件需要重新编译)
【金山文档】 JL701N_1.4.1_由于BLE 音频上行同步延时存储位宽溢出导致的linein广播间断性啪声问题补丁
JL701N_1.4.1_由于BLE 音频上行同步延时存储位宽溢出导致的linein广播间断性啪声问题补丁.zip
- JL701N v1.4.1 先开启混响音效(话筒)再开启linein采集,概率性出现“POPO”杂音问题。
- 默认SDK中,开启混响音效会固定采样点数176,而linein的PCM解码点数固定为256,且没有做缓冲BUF处理,所以总会有概率出现读数为0的情况,导致有PO声。
修改方法:
第1种方法:会增大话筒延时,代码固定MIC的采样点数为256点
第2种方法:会增加linein的延时,增加linein解码的buf缓冲代码
int linein_sample_read(void *hdl, void *data, int len)
static bool can_read_data = 0;
AT(.fm_data_code)
int linein_sample_read(void *hdl, void *data, int len)
{
struct linein_sample_hdl *linein = (struct linein_sample_hdl *)hdl;
#if 0
// no wait
u8 count = 0;
__retry:
if (cbuf_get_data_size(&linein->cbuf) < len) {
local_irq_disable();
os_sem_set(&linein->sem, 0);
local_irq_enable();
os_sem_pend(&linein->sem, 2);
if (cbuf_get_data_size(&linein->cbuf) < len) {
if (++count > 4) {
return 0;
}
goto __retry;
}
}
#endif
u16 point_offset = 1;
#if defined(TCFG_AUDIO_ADC_BIT_MODE)&&ADC_BIT_WIDTH_24&&(TCFG_AUDIO_ADC_BIT_MODE == ADC_BIT_WIDTH_24)
point_offset = 2;
#endif
u32 tlen = ADC_LINEIN_IRQ_POINTS << point_offset * linein->channel_num;
if (tlen > len) {
tlen = len;
}
#if 1
int cbuf_data_len = cbuf_get_data_len(&linein->cbuf);
printf("cbuf_data_len=%d,total=%d",cbuf_data_len,linein->cbuf.total_len);
if(!(cbuf_data_len < linein->cbuf.total_len * 1 /4)) {
//缓冲数据少于1/2,不读取数据,等缓冲
can_read_data = 1;
putchar('y');
} else {
putchar('x');
}
if(can_read_data) {
int rlen = cbuf_read(&linein->cbuf, data, tlen);
// printf("tlen=%d,len=%d,rlen=%d",tlen,len,rlen);
local_irq_disable();
if (rlen < tlen) {
linein->wait_resume = 1;
}
local_irq_enable();
return rlen;
} else {
memset(data, 0x00, len);
return len;
}
#else
int cbuf_data_len = cbuf_get_data_len(&linein->cbuf);
printf("cbuf_data_len=%d",cbuf_data_len);
int rlen = cbuf_read(&linein->cbuf, data, tlen);
// printf("tlen=%d,len=%d,rlen=%d",tlen,len,rlen);
local_irq_disable();
if (rlen < tlen) {
linein->wait_resume = 1;
}
local_irq_enable();
return rlen;
#endif
}
JL701N v1.4.1 蓝牙map功能编译报错,需要更换库文件

【金山文档】 br28_soundbox-141
br28_soundbox-141.zipJL701N v1.4.1 开启music_harmonic后,在线调试音效和下载进芯片的音效不一致 20231109 CYL

if (music_mode_seq0 != mode_id){
return 0;
}
JL701N v1.4.1 打开 linein 检测与 SD cmd 复用会出现卡顿
处理方法:
注释掉:asm volatile("idle");//wait isr 这句话JL701N v1.4.1 通话过程中BLE会断链问题 定义一个变量,替换下库文件
const bool config_le_high_priority = 1;
【金山文档 | WPS云文档】 btctrler-701-140-修复esco开启ble断连
https://kdocs.cn/l/cjx5C7UuRq2jJL701N v1.4.2 通话过程中BLE会断链问题(同上) 定义一个变量,替换下库文件
const bool config_le_high_priority = 1;
【金山文档 | WPS云文档】 btctrler-701-142-通话过程ble优先级高-2024-11-14
https://kdocs.cn/l/csaMrxvqvM4TJL701N v1.4.3beta2 通话过程中BLE会断链问题(同上) 定义一个变量,替换下库文件
const bool config_le_high_priority = 1;
btctrler-701-143beta2-通话过程ble优先级高.rarJL701N v1.4.2 蓝牙map功能编译报错,需要更换库文件 【金山文档】 btstack_JL701N_1.4.2_修复map编译报错问题
btstack_JL701N_1.4.2_修复map编译报错问题JL701N v1.4.2 开usb在线调试 20231109 SQ
默认的做法开PC与蓝牙后台
临时方案使用如下方式


JL701N v1.4.2 开混响与混合录音 音乐卡顿 20231109 SQ 如下操作会导致该问题
#define RECORDER_MIX_EN ENABLE//混合录音使能, 需要录制例如蓝牙、FM、 LINEIN才开
#define TCFG_MIC_EFFECT_ENABLE ENABLE
修改方法:
#define TCFG_REVERB_SAMPLERATE_DEFUAL (48000)
#define MIC_EFFECT_SAMPLERATE (48000)
- JL701N v1.4.2 切换eq死机 20231109 SQ 现象:开机有音乐播放之后使用eq_mode_sw切换eq死机,在开机没有声音出来之前切换之后没有问题
原因:外部eqtable的buff大小与实际不符,在操作的时候越界
#if defined(EXT_HP_LP_SECTIONS) && EXT_HP_LP_SECTIONS
extern const struct eq_seg_info eq_tab_normal[10+EXT_HP_LP_SECTIONS];
#else
extern const struct eq_seg_info eq_tab_normal[10];
#endif
46. JL701N v1.4.2 在线调试工具中music后的noisegate异常 20231109 SQ 开启BASS与BASS NOISE GATE
注意:开启BASS与BASS NOISE GATE之后在线调试工具并不一定有这个两个效果的调试框,需要找珠海相关人员修改或者找一个比较全的效果bin文件(效果文件不对可能导致死机问题)

audio_noisegate_open_demo接口实现使用下列代码替换
NOISEGATE_API_STRUCT *audio_noisegate_open_demo(u32 ns_name, u32 sample_rate, u32 ch_num)
{
u8 ns_gate_bit_width = global_bit_wide?1:0;
#if AUDIO_NOISE_GATE_ENABLE
NoiseGateParam_TOOL_SET *parm = NULL;
#if MUSIC_NOISE_GATE_EN
if (ns_name == AEID_MUSIC_NS_GATE) {
parm = &music_noisegate_parm[nor_label];
#if AUDIO_VBASS_32BIT_OUT_EN
ns_gate_bit_width = 1;
#endif
} else if (ns_name == AEID_AUX_NS_GATE) {
parm = &music_noisegate_parm[aux_label];
#if AUDIO_VBASS_32BIT_OUT_EN
ns_gate_bit_width = 1;
#endif
}
#endif
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
if (ns_name == AEID_MIC_NS_GATE) {
u8 mode = get_mic_eff_mode();
struct eff_parm *mic_eff = &eff_mode[mode];
parm = &mic_eff->noise_gate_parm;
}
#endif
if (!parm) {
return NULL;
}
NoiseGateParam noisegate_parm = {0};
noisegate_parm.attackTime = parm->parm.attackTime;
noisegate_parm.releaseTime = parm->parm.releaseTime;
noisegate_parm.threshold = parm->parm.threshold;
noisegate_parm.low_th_gain = parm->parm.low_th_gain;
noisegate_parm.sampleRate = sample_rate;
noisegate_parm.channel = ch_num;
noisegate_parm.pcm_info.IndataBit = ns_gate_bit_width;
noisegate_parm.pcm_info.OutdataBit = ns_gate_bit_width;
noisegate_parm.pcm_info.IndataInc = (ch_num == 1) ? 1 : 2;
noisegate_parm.pcm_info.OutdataInc = (ch_num == 1) ? 1 : 2;
noisegate_parm.pcm_info.Qval = global_bit_wide ? 23 : 15;
NOISEGATE_API_STRUCT *hdl = audio_noisegate_open(ns_name, &noisegate_parm);
audio_noisegate_bypass(ns_name, parm->is_bypass);
return hdl;
#else
return NULL;
#endif
}
- JL701N v1.4.2 设置为iis输出,在music模式下以打断方式音量加按键按住一直播放最大音量提示音,持续一段时间异常死机 原因:alink要等所有数据播完才能进行进行模块hw_ptr和shn的复位,目前的流程没有等这一步完成就开始同步更新操作,导致读出来的hw_ptr和shn是错误的
解决方法:软件修改如下,增加延迟等待所有数据播完才进行进行模块hw_ptr和shn的复位
u8 cnt = 0;
while(alink_get_hwptr(iis->hw_ch) != alink_get_swptr(iis->hw_ch))
{
os_time_dly(1);
cnt++;
if(cnt>20)
{
break;
}
}
- JL701N v1.4.2 DAC 24bit 频响获取异常 前提:
- dac 24bit
- 开启频响能量获取
/*
*DAC 位宽(bit width)配置
*16bit:DAC_16BIT_MODE
*24bit:DAC_24BIT_MODE
* */
#define TCFG_AUDIO_DAC_BIT_WIDTH DAC_24BIT_MODE
#define AUDIO_SPECTRUM_CONFIG 1 //频响能量值获取接口
调用:
调用spectrum_get_demo获取频响发现播放1KHz的音频最高能量在300Hz/600Hz等其他的频点上
修改库:
jl701n_soundbox_release_v1.4.2-DAC24bit-FFT频响获取异常 .7z
49. JL701N v1.4.2 音乐模式下不停打断播放提示音,会出现异常死机 目前在打开混合录音+automute,音乐模式打断播放提示音的条件下,概率触发audio_stream断言问题
异常信息:
原因:mixer里面的问题,打断播放提示音时,最后一包的文件解码数据存在mixer里,然后给到提示音的数据流里面,触发了长度判断的断言
修改方法:
jl701n_soundbox_release_v1.4.2_音乐模式打断提示音.zip
2026年3月31日17:46:13:
播放某一些采样率和输出采样率不一致的歌曲,同时打断播放提示音时,概率死机。
异常信息:
音乐模式地打断播放提示音src异常问题处理JL701N_soundbox_release_V1.4.2.zip(已包含上面的打断提示音修改)
50. JL701N 24BIT输出,蓝牙通话,当出现丢包时候DAC听见“滋滋”的杂音,而不是卡顿。 原因:PLC丢包修复模块没有支持到24bit
static void esco_plc_run_32(s32 *data, u16 len, u8 repair)
{
u16 repair_point, tmp_point;
s16 tmp_buf[PLC_FRAME_LEN]; //24转16的临时buf
tmp_point = len / 4;
#if 0 //debug
static u16 repair_cnt = 0;
if (repair) {
repair_cnt++;
y_printf("[E%d]", repair_cnt);
} else {
repair_cnt = 0;
}
//log_i("[%d]",point);
#endif/*debug*/
while (tmp_point) {
repair_point = (tmp_point > PLC_FRAME_LEN) ? PLC_FRAME_LEN : tmp_point;
tmp_point = tmp_point - repair_point;
audio_convert_data_32bit_to_16bit_round(data, tmp_buf, repair_point);
PLC_run(tmp_buf, tmp_buf, repair_point, repair);
audio_convert_data_16bit_to_32bit_round(tmp_buf, data, repair_point);
data += repair_point;
}
}
调用如下图:
完整补丁包:
jl701n_soundbox_release_v1.4.2 - 24bit通话PLC异常问题.zip
51. JL701N 24BIT输出,开启IIS输出,开启音乐通路谐波激励器后,播放蓝牙音频出现死机 修改方法:
- JL701N USB口给苹果手机充电,需要解锁手机屏幕才能充电问题 修改方法:(苹果充电需要我们做主机,并且发一个控制传输的命令)

增加的代码部分:
#if 1 //////////////////////增加以下代码/////////////////////
extern int usb_control_msg(struct usb_host_device *host_dev,u8 request,u8 requesttype,u16 vale,u16 index,void *data,u16 size);
if(device_desc.idVendor == 0x5ac)
{
usb_control_msg(host_dev,0x40,0x40,0x01f4,0x05dc,NULL,0);
private_data->status = 1;
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>iphone!!!!\n");
return DEV_ERR_NONE;
}
#endif // 1 //////////////////////end/////////////////////
53. JL701NV1.4.2 IIS输出,开启谐波激励器后播放蓝牙歌曲死机 
- JL701N SDK142 出现概率死机,且打印发现每次是在设置音量函数后死机的处理方法 若SDK142 有测试到概率死机,且每次死机打印都是在设置音量后发生的,定位触发死机的函数在库里:

解决方法是更新以下库:
media.a库解决了调音量概率死机和AAC提示音变调问题-20231227.zip
55. JL701N SDK142 外挂FLASH分区下载,不能开机
需要替换isd_download.exe
解决分区指定地址下载不能开机isd_download.7z
56. JL701N SDK141 小度APP在第一进入蓝牙模式可以连接,切换模式后再次进入蓝牙模式连接失败 问题原因:
目前BT模式切换退出的时候,并没有执行AI方面的退出流程,所以需要增加该部分的逻辑代码。
参考demo如下(需替换btstack.a库):
jl701n_soundbox_release_v1.4.1_修复小度APP切换模式后不回连问题.zip
以上demo经过测试,安卓手机和苹果手机都可以正常回连。
57. JL701N SDK142 广播频繁同步消息出现异常死机/从机同步消息异常(不停收到同步消息)
处理方法:替换以下库文件,重新编译【金山文档】 btctrler_JL701N_1.4.2_解决广播同步消息死机问题beta版本金山文档
btctrler_JL701N_1.4.2_解决广播同步消息死机问题.zip
(以上补丁包含有
1、广播音响主从连接苹果手机,从机无声音的问题
2、蓝牙回连数量记忆保存
)
https://www.kdocs.cn/l/caiLRFRhfsmM?linkname=MvuR5IeVlT
58. JL701N SDK142 24bit格式录音,获取录音时长接口获4取时间异常,recorder_get_encoding_time() 需要替换media.a库,然后rebuild。
701n 142分支修正24bitpcm录音时长获取.zip
JL701N SDK142 CONFIG_UPDATE_JUMP_TO_MASK配置为1,app ota升级过程中IO无法维持会掉,u盘升级则可以维持 软件修改如下图

JL701N SDK142 开启动态EQ后,在线音效调试的声音效果和下载到芯片后的声音效果不一致,可能原因: 原因:
修改方法:
将EXT_EQ_NSECTION改为10。JL701N SDK142 1TN连接 rx端在断开连接后概率性死机 原因:功能冲突,下图变量BTOSC_FASTBOOT_EN是用于使能晶振快速起振的,目前实际还没开发完成需要关闭;
修改方法:TX RX代码均将下图BTOSC_FASTBOOT_EN关闭;
JL701N SDK142 IIS+dac+48K输出,IIS声音卡顿,DAC声音正常,需要修复IIS声音 原因:SRC模块一次处理长度1024Bytes,但是前面推数据会超过这个长度,导致数据处理不完整。
参考以下SDK修改:
jl701n_soundbox_release_v1.4.2_fix_dac_iis_48k_输出异常.zipJL701N SDK142 1TN配对流程 tx端概率性配对失败 现象:rx端已进入app_broadcast_enter_pair(0);状态下,tx端调用完app_broadcast_enter_pair(0);与app_broadcast_exit_pair(0);完成配对后,概率性所有rx都连接接不上;
原因:TX端的配对流程和打开big广播的流程执行任务一样,但是执行成功的命令任务不一样。br28是双核会有重入发风险,如果配对和打开广播同时调用,命令上发有抢占的风险,如果被配对流程里面的命令先执行了,创建BIG就失败,表现为RX端同步不上TX。
另一种现象表现为:1TN 按键进入配对后,已经确定配对组队成功,然后TX 先上线,RX 后上线无法直接连接,需要TX后上线才能直接跟RX连接
原因为:发包帧间隔为5ms , 没有做相对应的适配。
修改方法:替换库:jl701n_soundbox_release_v1.4.2_修复1TN应用配对概率连接不上问题_20240611.rar
代码添加:
const char *bt_get_ble_name()
{
return (const char *)(bt_cfg.ble_name);
}
同时以上更换的库
64. JL701N SDK142 部分WAV歌曲会误识别成DTS格式解码,导致异常死机
处理方法:替换库文件处理:
【金山文档 | WPS云文档】 lib_dts_dec_JL701_1.4.2_WAV歌曲会误识别成DTS格式解码,导致异常死机
https://kdocs.cn/l/caOINBeqtqwT
JL701N SDK142 使能CONFIG_APP_BT_ENABLE后连接杰理之家苹果手机音量同步没有作用 原因:下图红框参数rcspModel->A_platform判断为:0:Andriod、1:iOS、2:小程序、3:固件,因此当连接设备为ios系统时,则不会跑进音量同步
处理方法:软件修改如下
JL701N 连接杰理之家时不进行设备认证
默认是开启,如果需要关闭修改下图宏
JL701N SDK142做tws功能时出现解码失败无声问题;
解决办法:注释掉此函数
JL701N SDK142 CIG或BIG连上后安卓手机音量同步功能异常 cig跑起来之后,app_audio_get_state再去获取状态返回的是APP_AUDIO_STATE_IDLE,导致没有跑音量同步,软件修改如下,增加红框处这行代码:


JL701N SDK142 设置为iis输出通话回音明显,回音消除算法不起作用 jl701n_soundbox_release_v1.4.2_iis输出回音消除修改_20240709.zip
使用iis和DAC同时输出的情况下,需要在上面补丁的基础上换库并在应用层定义函数。
jl701n_soundbox_release_v1.4.2_iis和DAC同时输出回音消除修改.7z
AEC测试为单工情况下,需要修改:
const u8 CONST_AEC_DLY_EST = 0;
#if ((AUDIO_OUTPUT_WAY == AUDIO_OUTPUT_WAY_FM) || (TCFG_AEC_SIMPLEX))
aec_param->dly_est = 0;
#else
aec_param->dly_est = 0;
#endif
打开延时估计会导致系统默认跑单工
70. JL701N SDK142 双向两发一收异常死机问题 现象:jl701n_soundbox_release_v1.4.2选择双向两发一收板级 CONFIG_BOARD_JL701N_WIRELESS_2T1_DUPLEX,主机连接两个从机后从机方反复开关机去连接主机,主机会出现异常死机
原因:有传参问题,导致底层数死机。
修改方法:换库
【金山文档 | WPS云文档】 btstack_JL701V142_除0死机问题
https://kdocs.cn/l/caiH4RThBeGb
同时添加代码如下:
uint32_t pair_public_code; //公共配对码
uint32_t pair_bind_code; //要绑定的私有配对码
uint16_t pair_sw_time; //公共配对码和私有配对码scan切换周期
s8 pair_rssi; //配对功能允许的有效rssi范围
71. JL701N SDK142 打开BLE ,做BLE 主机功能编译报错问题处理 MJW 编译报错:
处理办法:关闭le_afh_en
72. JL701N SDK142 蓝牙AAC格式能量检测无效问题 新添加能量检测函数:extern int aac_energy_check(u8 *packet, u16 size); 用于AAC格式的检测
具体修改如下
701-soundbox-v142-添加AAC检测.zip
73. JL701N SDK142 广播音箱保持连接但长期没音频数据时候,在恢复音频播放的时候,会出现明显延时出声音。 替换以下btctrler.a库文件,修复CIS保持连接但长期没数发时的基带计数行为。
【金山文档 | WPS云文档】 btctrler_2024_11_22_1701_huangwenbin.a
https://kdocs.cn/l/cgEhHz6p7u8q
//如果编译报 config_bb_optimized_ctrl 未定义,在编译到的文件中添加定义
const int config_bb_optimized_ctrl=0;
同时打57与73的补丁:
btctrler.a使用73中的库
btstack.a使用57中的库
- JL701N SDK142 关机后DAC没有设置高阻问题 定义下面的函数,底层会自行调用
void hw_close_dac(void)
{
memset(JL_ADDA, 0x0, sizeof(JL_ADDA_TypeDef));
SFR(JL_ADDA->DAA_CON2, 15, 1, 1);
SFR(JL_ADDA->DAA_CON2, 5, 1, 1);
}
- JL701N le_audio SDK连接的设备暂停一段时间再播放dac概率卡顿 sdk版本:1.0.0-2.0.0P00.01
复现方法:暂停10min左右再播放1min dac大概率会出现卡顿现象
现象:1.dac输出断断续续2.出现问题时打印'o'
原因:设备在暂停之后没有发送a2dp stop事件过来,而是一直发送数据包,导致dac音频流的时间戳异常
修改方法:
/**************************1*********************************/
static int a2dp_audio_is_underrun(struct a2dp_stream_control *ctrl)
{
if(A2DP_STREAM_UNDERRUN == ctrl->stream_error){
return true;
}
/**************************2*********************************/
if(frame->flags & FRAME_FLAG_FILL_PACKET){
distance_time = 0;
}

76. JL701N SDK142 麦混响打开LLNS节点后没有接口动态更新降噪效果参数处理 增加以下更新接口:
#include "stream/stream_jlsp_llns.h"
typedef struct {
void *llns;
u16 frame_size;//unit:point
} llns_hdl_t;
extern llns_hdl_t llns_hdl;
/*
* gainfloor:调节底噪大小(0~1)
* suppress_level:噪声抑制强度(0~6)
*/
void audio_llns_parm_update(float gainfloor, float suppress_level)
{
llns_param_t parm = {0};
parm.gainfloor = gainfloor;
parm.suppress_level = suppress_level;
if (llns_hdl.llns) {
/* printf(">>> llns update %x", llns_hdl.llns); */
/* printf("gainfloor %d, suppress_level %d", (int)parm.gainfloor, (int)parm.suppress_level); */
JLSP_llns_set_parameters(llns_hdl.llns, &parm);
}
}
- JL701N SDK143beta2 挂载emmc设置 检测为cmd方式
const int sdx_can_operate_mmc_card = 2;//当为cmd检查时 1:只发送sd检查命令 2:只发emmc检查命令
78. JL701N SDK143beta2 开启TWS固定主从后,tws关机流程默认有2s延时处理可以修改如下写法缩短延时
79. JL701N le audio 2.0.0Path(02.02) 开PA功能编译报错 打开pa控制编译报错,未定义bt_rf_PA_control_io_remap
处理方法:
更换io控制接口
void bt_set_rxtx_status_io(u32 tx_pin, u32 rx_pin)
80. JL701N SDK143beta2 开启双备份升级后,带key 的芯片并不能真正升级成功,还是用的原有的sdk的程序 问题描述:在使用“杰理OTA”进行双备份升级时,能弹出升级成功的界面。但是程序仍旧跑的是旧的程序
问题原因:芯片带key ,校验key 的时候异常,导致无法切换 新程序运行
解决办法:更换uboot 文件。
jl701n_soundbox_v1.4.3beta2_修复双备份ota升级带key芯片无法真正OTA升级uboot文件 (1).rar
81. JL701N SDK142 代码使能蓝牙PA功能,APP OTA的时候蓝牙PA不生效 APP OTA的时候蓝牙PA不生效
(下图是PA控制脚,使用杰理OTA进行升级过程中,复位后蓝牙控制脚没有波形输出)
修改方法:
替换以下修改
JL701N_1.4.2_升级使能PA.zip
- JL701_le_audio_2.0.0可视化程序测试BQB程序修改

void set_tx_mode(u8 set_mode_normal, u8 set_mode_dut);
set_tx_mode(1, 1);


JL701N_SDK_142第一次开机供电不稳定情况下存在trim错误,导致后续开机失败问题 jl701n_soundbox_142_power_trim错误补丁.rar
JL701N_SDK_142使能混合录音功能后,通话的回音算法不起作用问题处理 原因:开启混合录音功能后,会将输出采样率固定为48K
修改办法:需要将dac回采数据的采样率同步修改为48K
JL701N_SDK_142、JL701N_SDK_143-IIS输入-长时间播放-概率无声(IIS输入-48KHz-DAC输出或者发射器输出) 原因:iis_in->wait_resume的修改存在重入风险;另外,存在sample_read后,挂起音频流,但iis_in->wait_resume为0,导致一直没有激活解码的情况。
1、audio_dec线程和alink中断 同时访问修改iis_in->wait_resume变量
2、audio_dec线程运行于cpu1核,alink-isr是cpu0的核中断
3、两者通过禁用中断操作临界区时,实际上并没有禁用另一个核的中断,有概率重入风险
4、当iis_in->wait_resume变量修改发生重入后,会导致标志位异常,使得一直无法唤醒音频流,出现无声问题。
修改办法:
改为spin_lock的方式,锁住多核调度,保护iis_in->wait_resume变量。 并增加cbuf写满->触发主动resume一次音频流。
另外,底层同样有维护了标志位变量,可以在iis_dma_in判断如果写cbuf满,则触发事件重启close&open IIS音频流


JL701N_SDK_143beta2 IIS输入蓝牙发射器连接JBLGo4长时间播放短暂无声 701_soundbox_143_beta2蓝牙发射器连接JBLGo4长时间播放短暂无声1-2S问题.7z
JL701N_SDK_143beta2 flac 格式解码按键快进后,file_dec_get_cur_time获取返回的当前时间与实际播放的音频时间并不一致。 现象:快进步进3s 后,获取到的是快进3s 后的时间,但是实际快进了的时间大于3s ,所以导致实际播放当前的时间与用接口返回的时间不相符。
解决办法:更换flac的解码库
lib_flac_dec(jl701n_soundbox_v1.4.3beta2_flac格式解码_快进后获取当前播放时间与实际播放时间不吻合问题).rarJL701N_SDK_142版本sdk DAC输出方式选择差分单声道输出,同时打开混合录音和人声消除功能,会导致播放TF卡音频的时候非48K采样的音频文件变调。 问题复现原因:DAC输出方式选择差分单声道输出,同时打开混合录音和人声消除功能,会导致播放TF卡音频的时候非48K采样的音频文件变调。三个条件缺一不可。
解决办法:
JL701N_SDK_142 beta2 播放6声道flac报解码器启动失败 原因:默认解码器不支持大于2声道解码
换库:701 143 beta2 修改flac播放不了的问题.zip
demo:jl701n_soundbox_v1.4.3beta3-播放6声道flac失败.7zJL701N_SDK_142 低概率第一次上电trim的挡位错误且保存导致无法开机问题 替换以下两个文件后,rebuild
【金山文档 | WPS云文档】 power_trim
https://kdocs.cn/l/cu2Nx8CjpOBl
【金山文档 | WPS云文档】 cpu
https://kdocs.cn/l/ccGOJ3eea6qZJL701N_SDK_143 beta3设置24BIT输出的情况下,WAV解码变调。

JL701N_SDK_143 beta2 优化第一次调用fget_free_space()扫盘速度慢和挂载设备内存快占满时创建目录慢 修改办法:替换system.a后做下面修改
701-143beat2_system_获取剩余容量和创建目录加速.zip
①添加下面的代码,替换system.a后速度还不够的话可以参考修改下面的②③
//================================================//
// FS功能控制 //
//================================================//
const int FATFS_GET_SPACE_USE_RAM = 32 * 1024;///0;//32 * 1024; //获取剩余容量使用大Buf缓存,加快速度, 必须512倍数
②加大SD卡时钟频率(可能会不兼容一些劣质卡)
③改大分配单元大小
93. 701 142/143beta3 获取exfat文件系统容量异常 142sdk:
库:system_BR28_142_20251208_支持exfat获取剩余容量和修改卷标_mac电脑兼容
在lib_system_config.c中添加定义:
const int FATFS_GET_SPACE_USE_RAM = 32 * 1024; //获取剩余容量使用大Buf缓存,加快速度, 必须512倍数
143beta3:
库:system-143beta3-获取exfat文件系统剩余容量
测试程序:
ac701n_soundbox_sdk_v1.4.2-支持exfat获取剩余容量和修改卷标_mac电脑兼容.7z
jl701n_soundbox_release_v1.4.2_beta3-获取exfat文件系统剩余容量.7z
94. 701 142 不能设置exfat的卷标 库:传送门
测试程序:传送门
95. 701 142 exfat对mac电脑兼容性问题 强制从mac上面把下来,再去录音,之后再插回mac没发现刚才录制的音频文件
库:传送门
测试程序:传送门
96. 701-142-sdk广播主从机概率性同步异常问题 出现现象:主从机声音听感上觉得一样大,但听感方向会偏向主机;
测试现象:使用仪器测试主从机之间存在相位差异,大于1k-200deg(200/360ms)
修改点:
修改broadcast.c文件:
97. 701-142-sdk PC 模式插入手机中暂停播放后间隔10s ~20s 后 无法通过按键控制手机恢复播放问题 问题描述:PC 模式插入手机中暂停播放后间隔10s ~20s 后 无法通过按键控制手机恢复播放问题,插到电脑中则正常。
使用USB 分析仪抓到的数据最后进入了 remote wakeup 状态。
解决办法:需要关闭remote wakeup 功能
98. 701 1.4.3 beta3 开启广播死机问题 解决:
*(.jl_codec_c_sparse_code)
*(.jl_codec_e_code)
*(.jl_codec_d_code)
*(.jl_codec_c_code)
*(.jl_codec_ari_c_code)
*(.jl_codec_c_const)
*(.jl_codec_const)
*(.jl_codec_t441k_code)
99. 701 1.4.2 dac配成单声道时开启big广播,声音变大问题 原因:改为单声道时,广播mixer节点默认会将左声道和右声道的数据进行合并,以单声道的形式进行播放,音量会变大
修改方法:添加声道转换节点处理,不使用mixer




struct channel_switch *ch_switch;//声道变换
u8 ch_num = audio_output_channel_num(); //获取输出设备的声道数
r_printf("live_stream_player_start: dec_out_ch_num = %d, ch_num = %d\n", ctx->dec_out_ch_num, ch_num);
if (ctx->dec_out_ch_num != ch_num) {
if (ctx->dec_out_ch_num == 1) {
ctx->ch_switch = channel_switch_open(AUDIO_CH_LR, 0);
} else {
ctx->ch_switch = channel_switch_open(AUDIO_CH_DIFF, 0);
}
}
if (ctx->ch_switch) {
entries[entry_cnt++] = &ctx->ch_switch->entry;
}
channel_switch_close(&ctx->ch_switch);
- 701 1.4.2 使能蓝牙发射和1T2,连接两台手机(至少1台苹果手机)异常 修改:改为不强制做主机,并且替换btctrler库
【金山文档 | WPS云文档】 btctrler_701_142_202512221142
https://www.kdocs.cn/l/cb3uUNjupSEL
const int config_btctler_bredr_master = 0;
u8 config_btctler_bredr_master_emitter = 1;
JL701N v1.4.2 开混响 dac选择单声道差分输出DAC_OUTPUT_MONO_LR_DIFF,混合录音出来的音频经过差分电路听不到混响声音 原因:MIC通路提前做差分转换导致录音相加时相互抵消导致无声
修改方法:按下图修改
JL701N_SDK_142 修改RTC计算函数 当设置为闰年12月31日可以成功,比如手动设置2024年12月31日,系统显示为2024年12月31口,但是当设置平年12月31旦异常了,会显示下一年的一月一日,比如设置2023年12月31日,系统则显示成2024年1月1日
修改方法:替换cpu.a【金山文档 | WPS云文档】 cpu(JL701N_SDK_142_修改RTC计算函数)https://www.kdocs.cn/l/ckznoWnoSEV6
【金山文档 | WPS云文档】 cpu_分支sdk_1.4.2_patch_405a9114
https://www.kdocs.cn/l/ckxrjwJxCkBr
更新:JL701N_soundbox_sdk_release 非可视化修复电源 trim 问题和添加 flash 写保护补丁
Files · sdk_1.4.2_patch · SOUNDBOX / 非可视化 / ac701n_soundbox_sdk · GitLabjl701n_soundbox_v1.4.3_beta2/beta3 发射器连不上JBL TUNE510BT耳机 修改方法:替换btctrler.a
btctrler_瑞卿改_jl701n_soundbox_v1.4.3beta2_20260309_发射器兼容JBL TUNE510BT.zip
btctrler_瑞卿改_jl701n_soundbox_v1.4.3beta2_20260309_发射器兼容JBL TUNE510BT.zipjl701n_soundbox_v1.4.2 写打开不存在的文件出现内存泄漏 修改方法:替换system.a
system_福勇改_AC701_142_修复写打开不存在的文件出现内存泄漏.zipjl701n_soundbox_v1.4.2 部分U盘无法挂载的兼容性问题 问题表现:能识别U盘但是无法成功挂载。
system_福勇改_BR28_142_支持UEFI文件系统启动.rar
增加常量定义:
const int FATFS_GET_SPACE_USE_RAM = 0; //获取剩余容量使用大Buf缓存,加快速度, 必须512倍数
jl701n_soundbox_v1.4.2 长时间煲机sys_s_hi_timer_add 极低概率出现不跑的情况 TIMER1->CON寄存器在双核中断以及线程中(sys timr中调用usr_timer_schedule)有被同时修改的风险
修改方法:替换原来的cpu.a【金山文档 | WPS云文档】 cpu_new.a(1.4https://www.kdocs.cn/l/cllg0yKBWCgQ
【金山文档 | WPS云文档】 cpu_分支sdk_1.4.2_patch_405a9114
https://www.kdocs.cn/l/ckxrjwJxCkBr
更新:JL701N_soundbox_sdk_release 非可视化修复电源 trim 问题和添加 flash 写保护补丁
Files · sdk_1.4.2_patch · SOUNDBOX / 非可视化 / ac701n_soundbox_sdk · GitLab
107. jl701n_soundbox_v1.4.2 支持fat32、exfat等创建长名文件夹和设置属性 修改方法:按下面提供的文件修改
system_福勇改_AC701_142_20260410_支持创建长文件夹名和设置属性.zip
108. jl701n_soundbox_v1.4.2 同时使能IIS 输入输出功能,从live_iis 模式切换到下一模式时候,触发死机问题 修改办法:
109. jl701n_soundbox_v1.4.3_beta3 蓝牙发射器模式连接车机会直接进入通话音频 根本原因:hfp 命令回复错误
修改方法:更换btstack.a。
btstack_瑞卿改_701_143_beta3_修复发射器连车机直接进通话的问题.rar
提交记录:
外网:https://gitlab.zh-jieli.com/soundbox/novisualization/ac701n_soundbox_sdk.git
内网:Files · bugfix_sdk_1.4.3_beta3_bt_emitter · SOUNDBOX / ac701n_soundbox_sdk · GitLab
110. jl701n_soundbox_v1.4.2 苹果手机iPlayer播放器存在吞音现象 处理方法:
将如下三个功能置0。
#define TCFG_BT_SUPPORT_AAC 0 //AAC格式支持
u8 a2dp_support_delay_report = 0;
const int CONFIG_BTCTLER_QOS_ENABLE = 0;

111. jl701n_soundbox_v1.4.2 MP3(VBR)文件,获取播放总时间不准 根本原因:vbr的mp3文件,按文件总长度估算会出现比较严重的误差;
修改方法:替换lib_mp3_dec.a
下载链接:
外网:https://gitlab.zh-jieli.com/soundbox/novisualization/ac701n_soundbox_sdk/-/tree/bugfix_1.4.2_mp3%E8%8E%B7%E5%8F%96%E6%97%B6%E9%97%B4%E4%B8%8D%E5%87%86
分支:bugfix_1.4.2_mp3获取时间不准
112. jl701n_soundbox_v1.4.2 针对问题 54、87、89 合并的修改补丁 701 142修改flac播放不了6声道的问题.zip
113. jl701n_soundbox_v1.4.2 提示音叠加播放蓝牙无声或卡顿 
audio_mixer_set_direct_out(&mixer, 0);
还需要替换meida_app.a
外网链接:Files · bugfix_1.4.2_提示音叠加播放蓝牙无声 · SOUNDBOX / 非可视化 / ac701n_soundbox_sdk · GitLab
问题处理
JL701N v1.0.0 芯片不停DVDD复位 -2022/06/25 LZK 死机打印如下:(或者出现DVDD复位)
处理方法:
芯片硬件上不支持DCDC 只能跑LDO,配置如下。
JL701N v1.2.0带T卡(装有升级文件)上电死机问题以及T卡(IO维持)升级死机问题20221101 ZGH (在对应的目录替换以下两个文件)
【金山文档】ac701n_soundbox_release_v1.2.0带T卡(装有升级文件)上电死机问题以及T卡(IO维持)升级死机问题_cpu
IO维持T卡升级死机问题
IO维持相关配置方法
3. JL701N v1.2.1 开机手动释放dac上电的噗噗声20221214 SQ&20230411WGH 
WGH:
修改如下:
audio_way_set_sample_rate(AUDIO_OUT_WAY_TYPE,audio_output_nor_rate());
// audio_way_set_sample_rate(AUDIO_OUT_WAY_TYPE,48000);
audio_way_ioctrl(AUDIO_OUT_WAY_TYPE, SNDCTL_IOCTL_POWER_ON, NULL);
- JL701N v1.2.1 混响添加linein叠加MIC_EFFECT_CONFIG_LINEIN,后启动mic_effect_start,mic的增益大小会异常为0 20230203WGH

int audio_adc_mode_set(u8 type, u16 sample_rate, u8 gain)
{
if (adc_mode_hdl == NULL) {
printf("%s %d hdl is NULL err !\n", __func__, __LINE__);
return -1;
}
if (adc_mode_hdl->ch[type].enable == 0) {
printf("audio_adc_mode_channel is not enable err!\n");
return -1;
}
adc_mode_hdl->sample_rate = sample_rate;
adc_mode_hdl->ch[type].gain = gain;
return 0;
}

int audio_linein_open(struct adc_linein_ch *linein, u16 sample_rate, int gain)
{
printf("%s",__func__);
#if TCFG_AUDIO_ADC_ENABLE
if (adc_mode_hdl == NULL) {
printf("%s %d hdl is NULL err !\n", __func__, __LINE__);
return -1;
}
#if TCFG_MIC_EFFECT_ENABLE //开混响时启用多路AD
audio_adc_mode_switch(ADC_LINEIN_MODE);
//设置一下MIC的采样率以及增益
extern int audio_adc_mode_set(u8 type, u16 sample_rate, u8 gain);
audio_adc_mode_set(0,effect_mic_stream_parm_default.sample_rate,effect_mic_stream_parm_default.mic_gain);
#else
adc_mode_hdl->ch[0].enable = 0;
adc_mode_hdl->ch[1].enable = 1;
adc_mode_hdl->ch[2].enable = 0;
#endif
audio_adc_mode_channel_open(1, linein, sample_rate, gain);
return 0;
#endif // #if TCFG_AUDIO_ADC_ENABLE
return -1;
}
- JL701N v1.2.1 开混响 AUDIO dac选择单声道差分输出(TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_MONO_LR_DIFF)出现变声变调,声音异常 20230307 ZGH--20230411--WGH ZGH:

WGH:
在cpu\br28\audio_mic\mic_effect.c中1、修改
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_LR || TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_DUAL_LR_DIFF || TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_MONO_LR_DIFF)
// #if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_LR || TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_DUAL_LR_DIFF)
#define DAC_OUTPUT_CHANNELS 2
#elif (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_L || TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_R || TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_LR_DIFF)
#define DAC_OUTPUT_CHANNELS 1
#elif (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR)
#define DAC_OUTPUT_CHANNELS 4
#else
#define DAC_OUTPUT_CHANNELS 3
#endif
添加函数
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_MONO_LR_DIFF)
void *mic_data_viewer_last = NULL;
void *mic_data_viewer_last_entry = NULL;
static void pcm_LR_to_DUAL_DIFF(s16 *pcm_lr, s16 *pcm_dual_diff, int points_per_ch)
{
s16 pcm_L;
s16 pcm_R;
s16 pcm_diff;
int i = 0;
for (i = 0; i < points_per_ch; i++, pcm_lr += 2) {
pcm_L = *pcm_lr;
pcm_R = *(pcm_lr + 1);
pcm_diff = (s16)(((int)pcm_L + pcm_R) >> 1);
*pcm_dual_diff++ = pcm_diff;
*pcm_dual_diff++ = (pcm_diff == -32768) ? (32767) : (-pcm_diff);
}
}
static void last_data_viewer_callback(u8 ch, s16 *data, u32 len)
{
pcm_LR_to_DUAL_DIFF(data, data, len / 2 / 2);
}
#endif
修改mic_effect_start()函数,左边是修改后
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_MONO_LR_DIFF)
mic_data_viewer_last = audio_data_viewer_open(last_data_viewer_callback);
mic_data_viewer_last_entry = audio_data_viewer_entry_get(mic_data_viewer_last);
#endif

#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_MONO_LR_DIFF)
if (mic_data_viewer_last_entry) {
entries[entry_cnt++] = mic_data_viewer_last_entry;
}
#endif
- JL701N v1.2.1 开启MIC_EFFECT_CONFIG_DVOL无作用,话筒音量调节无作用 20230412 LZK 原因:创建的DVOL数据流句柄没有加入话筒数据流中

在cpu\br28\audio_mic\mic_effect.c中
修改
左边是修改后
///初始化数字音量
struct audio_stream_entry *dvol_entry;
if (effect->parm.effect_config & BIT(MIC_EFFECT_CONFIG_DVOL)) {
effect_dvol_default_parm.ch_total = ch_num;
#if defined(SYS_DIGVOL_GROUP_EN)&&SYS_DIGVOL_GROUP_EN
dvol_entry = sys_digvol_group_ch_open("mic_mic", -1, &effect_dvol_default_parm);
effect->d_vol = audio_dig_vol_group_hdl_get(sys_digvol_group, "mic_mic");
#else
effect->d_vol = audio_dig_vol_open((audio_dig_vol_param *)&effect_dvol_default_parm);
dvol_entry = audio_dig_vol_entry_get(effect->d_vol);
#endif /*SYS_DIGVOL_GROUP_EN*/
}
左边是修改后
if(effect->d_vol) {
printf("dvol_entry = %d",dvol_entry);
entries[entry_cnt++] = dvol_entry;
}
- JL701N v1.2.1 DRC0参数没有更新成功,导致效果和调试的不一致。 -2023/04/12 原因:读取eq_cfg_hw.bin的DRC参数没有更新
在cpu\br28\audio_mic\mic_effect.c中
修改
#include "sw_drc.h"
#if TCFG_DRC_ENABLE
static wdrc_struct_TOOL_SET mic_drc_parm[5];
#if (TCFG_MIC_EFFECT_SEL == MIC_EFFECT_REVERB_ECHO_ADVANCE)
static CrossOverParam_TOOL_SET last_crossover;
static wdrc_struct_TOOL_SET last_wdrc_parm[4];
#endif
#endif
void *mic_drc_open(u32 sample_rate, u8 ch_num, u8 drc_name)
{
#if (TCFG_MIC_EFFECT_SEL == MIC_EFFECT_REVERB_ECHO_ADVANCE)
if(drc_name == AEID_MIC_DRC4) {
struct audio_drc_param_parm = {0};
parm.channels = ch_num;
parm.sr = sample_rate;
parm.out_32bit = 1;
parm.cb = drc_get_filter_info;
parm.drc_name = drc_name;
parm.nband = CROSSOVER_EN | MORE_BAND_EN;
u8 mode = get_mic_eff_mode();
memcpy(&last_wdrc_parm,&mic_last_drc_parm[mode].wdrc_parm,sizeof(last_wdrc_parm));
memcpy(&last_crossover,&mic_last_drc_parm[mode].crossover, sizeof(CrossOverParam_TOOL_SET));
parm.crossover = &last_crossover;
parm.wdrc = &last_wdrc_parm;
struct audio_drc *drc = audio_dec_drc_open(&parm);
return drc;
}
#endif
#if TCFG_DRC_ENABLE
u8 mode = get_mic_eff_mode();
log_i("sample_rate %d %d\n", sample_rate, ch_num);
struct audio_drc_param parm = {0};
parm.channels = ch_num;
parm.sr = sample_rate;
if (drc_name == AEID_MIC_DRC4) {
parm.out_32bit = 0;
}else{
parm.out_32bit = 1;
}
parm.cb = drc_get_filter_info;
parm.drc_name = drc_name;
u8 index = get_drc_module_index(drc_name);
memcpy(&mic_drc_parm[index],&eff_mode[mode].drc_parm[index],sizeof(wdrc_struct_TOOL_SET));
// parm.wdrc = &eff_mode[mode].drc_parm[index];
parm.wdrc = &mic_drc_parm[index];
log_d("=====drc_name %d\n", drc_name);
struct audio_drc *drc = audio_dec_drc_open(&parm);
clock_add(EQ_CLK);
return drc;
#else
return NULL;
#endif//TCFG_DRC_ENABLE
}
- JL701N v1.2.1 使用以下音效文件话需要按照下面文件修改 -2023/04/12 需要先按照上面第9点,第10点,第11点修改,后再做下面的修改,以下修改偏多,可以联系提供SDK对比拷贝。
音效文件流程如下:

修改:
板级头文件定义宏



修改cpu\br28\audio_effect\effects_adj.c

修改sdk\include_lib\media\effects_adj.h

cpu\br28\audio_mic\mic_effect.c 调换EQ4和DRC4的前后顺序

cpu\br28\audio_effect\audio_eff_default_parm.h

JL701N v1.2.1 使用新版本的plate reverb音效修改方法 -2023/04/12
cpu\br28\audio_mic\mic_effect.c
2、include_lib\media\reverb_api.h
替换lib_reverb_cal.a、media.a
链接:https://pan.baidu.com/s/1MooTM5hLLOecvXC8X2rQQQ
提取码:8888
10. JL701N v1.2.1 提前打开DAC模块的偏置电压,避免PO声问题出现 -2023/04/12 音响通常会带有功放芯片推动喇叭,如果出现功放打开情况下,dac的偏置电压才打开,会出现PO声,如下图
701N SDK在int audio_dec_init();不会打开DAC的偏置电压,仅有在有数据流开始执行后才会打开DAC偏置电压,如下图代码
cpu\br28\audio_way\audio_app_stream.c
为避免PO声,可以在打开DAC偏置电压后,才打开功放。
这边也提供一个主动打开DAC偏置电压的方法
cpu\br28\audio_dec\audio_dec.c
audio_way_set_sample_rate(AUDIO_OUT_WAY_TYPE,audio_output_nor_rate());
// audio_way_set_sample_rate(AUDIO_OUT_WAY_TYPE,48000);
audio_way_ioctrl(AUDIO_OUT_WAY_TYPE, SNDCTL_IOCTL_POWER_ON, NULL);
printf("-------------------------- audio dac power on ------------------------");
如果方案中含有混响,会调用mic_effect_start(void),需要注释一行代码,避免开关混响数据流导致关闭DAC偏置电压,导致PO声产生
注:以上提前打开DAC偏置电压会提升功耗。
- JL701N v1.3.0使能多路mic通道,采集到的声音变频问题 程序如果配置双通道的话,正常开启MIC会出现变频问题:
原因:rptr是读取到的数据,wptr是要写入的数据,原先配置双通道后异常是由于数据double,即wptr写入了
double的数据,但实际p->handler输出的数据还是单份的数据数量,导致wptr写入的数据只有前面的一半数
据被拿走,导致声音变调:
解决办法:对所有通道做累加限幅后输出
cpu\br28\audio_enc\audio_enc.c
if(i == 0){
while (remain_points--) {
int valuetemp = 0;
u8 j = 0;
for(j = 0;j < adc_mode_hdl->total_ch_num;j++){ //所有通带数据累加
valuetemp += *(rptr+j);
}
if (valuetemp < -32768) { //限幅后输出
valuetemp = -32768;
} else if (valuetemp > 32767) {
valuetemp = 32767;
}
s16 value = (s16)valuetemp;
memcpy(wptr, &value, 1 * 2);
rptr += adc_mode_hdl->total_ch_num;
wptr += 1;
}
}
else{
while (remain_points--) {
memcpy(wptr, rptr, adc_mode_hdl->ch[i].ch_num * 2);
rptr += adc_mode_hdl->total_ch_num;
wptr += adc_mode_hdl->ch[i].ch_num;
}
}
PS:1.4.0SDK后 需按以下修改:
cpu\br28\audio_enc\audio_enc.c
s32 valuetemp;
s32* value_ptr_s32;
s16* value_ptr_s16;
if(i == 0){ // 混响通路,单声道处理
while (remain_points--) {
valuetemp = 0;
value_ptr_s32 = rptr;
value_ptr_s16 = rptr;
if(point_size == 4){
for(u8 j = 0;j < adc_mode_hdl->ch[i].ch_num;j++){ //所有通带数据累加
valuetemp += *(value_ptr_s32+j);
}
if (valuetemp < PCM_24BIT_SAT_MIN) { //限幅后输出
valuetemp = PCM_24BIT_SAT_MIN;
} else if (valuetemp > PCM_24BIT_SAT_MAX) {
valuetemp = PCM_24BIT_SAT_MAX;
}
}else{
u8 j = 0;
for(j = 0;j < adc_mode_hdl->ch[i].ch_num;j++){ //所有通带数据累加
valuetemp += *(value_ptr_s16+j);
}
if (valuetemp < -32768) { //限幅后输出
valuetemp = -32768;
} else if (valuetemp > 32767) {
valuetemp = 32767;
}
}
memcpy(wptr, &valuetemp, point_size);
rptr += adc_mode_hdl->total_ch_num * (point_size / 2);
wptr += (point_size / 2);
}
}else{
while (remain_points--) {
memcpy(wptr, rptr, adc_mode_hdl->ch[i].ch_num * point_size);
rptr += adc_mode_hdl->total_ch_num * (point_size / 2);
wptr += adc_mode_hdl->ch[i].ch_num * (point_size / 2);
}
}
- JL701N V1.3.0-1.4.1对箱同步消息会延时发给对方 关闭对箱sniff功能
#define CONFIG_BT_TWS_SNIFF 0 //[WIP]
- JL701N V1.4.1 设置linein模拟增益,开机混响第一次进linein没效果 开linein之后重新设置一下linein的模拟增益
int audio_linein_open(struct adc_linein_ch *linein, u16 sample_rate, int gain)
{
#if TCFG_AUDIO_ADC_ENABLE
if (adc_mode_hdl == NULL) {
printf("%s %d hdl is NULL err !\n", __func__, __LINE__);
return -1;
}
if ((adc_mode_hdl->state == 1) || TCFG_MIC_EFFECT_ENABLE) {
//打开混响宏的情况下,不管后台混响是否开启,都开关一次adc,并打开mic和linein通道
audio_adc_mode_switch(ADC_LINEIN_MODE);
} else {
adc_mode_hdl->ch[0].enable = 0;
adc_mode_hdl->ch[1].enable = 1;
adc_mode_hdl->ch[2].enable = 0;
adc_mode_hdl->mode = ADC_LINEIN_MODE;
}
g_printf("---- liein open gain=%d----\r\n",gain);
audio_adc_mode_channel_open(1, linein, sample_rate, gain);
/*新增代码 start*/
audio_linein_set_gain(gain);
/*新增代码 end*/
return 0;
#endif // #if TCFG_AUDIO_ADC_ENABLE
return -1;
}
- JL701N V1.4.1 混响MIC增益设置 首先程序会根据一个宏定义决定MIC增益使用哪里得增益(SDK:默认使用是工具配置得增益)
#define AUDIO_ADC_PGA_CONFIG 1
- AUDIO_ADC_PGA_CONFIG 为1使用工具配置的增益

- JL701N V1.4.1 TWS对箱后消人声异常 【金山文档】 jl701n_soundbox_release_v1.4.1_解决TWS配对后消人声异常的问题
jl701n_soundbox_release_v1.4.1_解决TWS配对后消人声异常的问题.zip - JL701N V1.4.1 部分蓝牙测试仪发现连上没有声音,然后会断开问题处理
部分蓝牙测试仪不支持delay report,可能又没有忽略掉。导致解析出错出现异常
修改方法:
关闭delay report 去适配蓝牙测试仪
u8 a2dp_support_delay_report = 0; //置0
- JL701N V1.4.1 使能内置触摸按键出现异常死机 因为映射通道打开没有关闭,导致一直打开导致死机
修改方法
cpu\br28\plcnt.c
void plcnt_iomc_disable(struct touch_key_port *key)
{
//放电计数引脚选择intputchannel2
gpio_ich_disable_iutput_signal(key->port, INPUT_CH_SIGNAL_CAP, INPUT_CH_TYPE_GP_ICH);
/*gpio_set_fun_input_port(key->port, PFI_GP_ICH6);*/
/*SFR(JL_IOMAP->CON1, 8, 4, 6);*/
}
- JL701N V1.4.1 24BIT,小度APP无法识别语音问题处理 原因:因开启24bit mode,DAC和ADC模块均会设置为24BIT的输出和采集,且OPUS编码暂时不支持24bit,所以需要在开启编码前后修改 ADC模块的采集深度。
修改文件:cpu\br28\audio_enc\audio_mic_codec.c中的
audio_mic_enc_open(),audio_mic_enc_close()
extern struct audio_adc_hdl adc_hdl;
int audio_mic_enc_open(int (*mic_output)(void *priv, void *buf, int len), u32 code_type)
{
int err;
struct audio_fmt fmt;
switch (code_type) {
case AUDIO_CODING_OPUS:
//1. quality:bitrate 0:16kbps 1:32kbps 2:64kbps
// quality: MSB_2:(bit7_bit6) format_mode //0:百度_无头. 1:酷狗_eng+range.
// quality:LMSB_2:(bit5_bit4) low_complexity //0:高复杂度,高质量.兼容之前库. 1:低复杂度,低质量.
//2. sample_rate sample_rate=16k ignore
fmt.quality = 0 /*| LOW_COMPLEX*/;
fmt.sample_rate = 16000;
fmt.coding_type = AUDIO_CODING_OPUS;
break;
case AUDIO_CODING_SPEEX:
fmt.quality = 5;
fmt.complexity = 2;
fmt.sample_rate = 16000;
fmt.coding_type = AUDIO_CODING_SPEEX;
break;
default:
printf("do not support this type !!!\n");
return -1;
break;
}
audio_encoder_task_open();
if (!mic_enc) {
mic_enc = zalloc(sizeof(*mic_enc));
if (!mic_enc) {
printf("mic_enc NULL !!!\n");
}
memset(mic_enc, 0x00, sizeof(*mic_enc));
}
mic_enc_output_func_register(mic_output);
cbuf_init(&mic_enc->pcm_in_cbuf, mic_enc->in_cbuf_buf, MIC_ENC_IN_SIZE * 4);
os_sem_create(&mic_enc->pcm_frame_sem, 0);
audio_encoder_open(&mic_enc->encoder, &mic_enc_input, encode_task);
audio_encoder_set_handler(&mic_enc->encoder, &mic_enc_handler);
audio_encoder_set_fmt(&mic_enc->encoder, &fmt);
audio_encoder_set_event_handler(&mic_enc->encoder, mic_enc_event_handler, 0);
audio_encoder_set_output_buffs(&mic_enc->encoder, mic_enc->output_frame,
sizeof(mic_enc->output_frame), 1);
if (!mic_enc->encoder.enc_priv) {
log_e("encoder err, maybe coding(0x%x) disable \n", fmt.coding_type);
err = -EINVAL;
goto __err;
}
int start_err = audio_encoder_start(&mic_enc->encoder);
#if MIC_USE_MIC_CHANNEL
#if 1
if(mic_effect_get_status())
{
printf("close effect");
mic_effect_stop();//停止混响,linein等等关于ADC模块的东西
//不打开mic_ldo
}
#if (TCFG_AUDIO_DAC_BIT_WIDTH == DAC_24BIT_MODE)
extern struct adc_platform_data adc_data;
adc_data.bit_width = 0;
#endif
fmt.sample_rate = 16000;
if (TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_0) {
printf("audio_mic_enc_open mic 0");
audio_adc_mic_open(&mic_enc->mic_ch, TCFG_AUDIO_ADC_MIC_CHA, &adc_hdl);
} else if (TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_1) {
printf("audio_mic_enc_open mic 1");
audio_adc_mic1_open(&mic_enc->mic_ch, TCFG_AUDIO_ADC_MIC_CHA, &adc_hdl);
} else if (TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_2) {
printf("audio_mic_enc_open mic 2");
audio_adc_mic2_open(&mic_enc->mic_ch, TCFG_AUDIO_ADC_MIC_CHA, &adc_hdl);
} else if (TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_3) {
printf("audio_mic_enc_open mic 3");
audio_adc_mic3_open(&mic_enc->mic_ch, TCFG_AUDIO_ADC_MIC_CHA, &adc_hdl);
}
/* audio_adc_mic3_open(&mic_enc->mic_ch, TCFG_AUDIO_ADC_MIC_CHA, &adc_hdl); */
audio_adc_mic_set_sample_rate(&mic_enc->mic_ch, fmt.sample_rate);
app_var.aec_mic_gain = 15;
printf(">>>>>>>>>mic gain:%d \n", app_var.aec_mic_gain);
audio_adc_mic_set_gain(&mic_enc->mic_ch, app_var.aec_mic_gain);
audio_adc_mic_set_buffs(&mic_enc->mic_ch, mic_enc->adc_buf,
ENC_ADC_IRQ_POINTS * 2, ENC_ADC_BUF_NUM);
mic_enc->adc_output.handler = adc_mic_output_handler;
audio_adc_add_output_handler(&adc_hdl, &mic_enc->adc_output);
//app_audio_output_samplerate_set(44100);
//app_audio_output_start();
audio_adc_mic_start(&mic_enc->mic_ch);
#else
if (audio_mic_open(&mic_enc->mic_ch, 16000, 12) == 0) {
mic_enc->adc_output.handler = adc_mic_output_handler;
audio_mic_add_output(&mic_enc->adc_output);
audio_mic_start(&mic_enc->mic_ch);
audio_adc_mic_0dB_en(1);
}
#endif
#endif
printf("mic_enc_open ok %d\n", start_err);
return 0;
__err:
audio_encoder_close(&mic_enc->encoder);
local_irq_disable();
free(mic_enc);
mic_enc = NULL;
local_irq_enable();
audio_encoder_task_close();
return err;
}
int audio_mic_enc_close()
{
if (!mic_enc) {
return -1;
}
printf("audio_mic_enc_close\n");
#if MIC_USE_MIC_CHANNEL
audio_adc_mic_close(&mic_enc->mic_ch);
audio_adc_del_output_handler(&adc_hdl, &mic_enc->adc_output);
#endif
mic_enc_resume();
audio_encoder_close(&mic_enc->encoder);
audio_encoder_task_close();
free(mic_enc);
mic_enc = NULL;
#if (TCFG_AUDIO_DAC_BIT_WIDTH == DAC_24BIT_MODE)
extern struct adc_platform_data adc_data;
adc_data.bit_width = 1;
#endif
printf("audio_mic_enc_close end\n");
return 0;
}
JL701N 使能mic混响宏后,通话无法使用aec通话算法的处理
参考通话调试文档中的该处理方式:
【金山文档】 通话调试流程指南 https://kdocs.cn/l/ck1XA2TmirZX
PS:701 142 版本SDK 强制修改 中断点数为256的位置如下两处:

JL701N 通话单工宏后,通话仍然是双工通话模式问题 CONST_AEC_DLY_EST 在单工通话时需要置1

JL701N 关闭dac的修改办法
sound_pcm_ctl_ioctl(dac->way->stream, SNDCTL_IOCTL_POWER_OFF, NULL);
关闭后DAC引脚处于高阻态。
22. JL701N IIS输出,配置48K后无法输出 需要修改PLL时钟
23. JL701N v1.4.2 DAC输出配置DAC_OUTPUT_MONO_LR_DIFF 后频响没有作用 修改方法:
24. JL701N v1.4.2 开启MASSSTORAGE_CLASS后,在windows7电脑上播放歌曲过程中会异常掉设备,导致没有声音。 修改方法:
//这边将上图左边的代码拷贝下来,自行复制
{
const usb_dev usb_id = usb_device2id(usb_device);
usb_write_txcsr(usb_id, MSD_BULK_EP_IN, TXCSRP_SendStall);
u32 ot = 2000;
while (1) {
udelay(100);
if (ot-- == 0) {
break;
}
if (usb_otg_online(usb_id) == DISCONN_MODE) {
break;
}
static void stall_outep(const struct usb_device_t *usb_device)
{
const usb_dev usb_id = usb_device2id(usb_device);
usb_write_rxcsr(usb_id, MSD_BULK_EP_OUT, RXCSRP_SendStall);
u32 ot = 2000;
udelay(100);
while (1) {
if (ot-- == 0) {
break;
}
if (usb_otg_online(usb_id) == DISCONN_MODE) {
break;
- JL701N v1.4.2 PC模式下,在设备枚举过程中,按下按键发送HID信息出现除0错误 修改方法:

u8 global_hid_config_done = 0;
static void hid_endpoint_init(struct usb_device_t *usb_device, u32 itf)
{
const usb_dev usb_id = usb_device2id(usb_device);
usb_g_ep_config(usb_id, HID_EP_IN | USB_DIR_IN, USB_ENDPOINT_XFER_INT, 0, hid_ep_in_dma, MAXP_SIZE_HIDIN);
usb_enable_ep(usb_id, HID_EP_IN);
global_hid_config_done = 1;
/* usb_g_set_intr_hander(usb_id, HID_EP_OUT, hid_rx_data); */
/* usb_g_ep_config(usb_id, HID_EP_OUT, USB_ENDPOINT_XFER_INT, 1, ep_buffer, MAXP_SIZE_HIDOUT); */
}
void hid_key_handler(struct usb_device_t *usb_device, u32 hid_key)
{
const usb_dev usb_id = usb_device2id(usb_device);
if (usb_get_ep_status(usb_id, HID_EP_IN)) {
return;
}
if(!global_hid_config_done) {
return;
}
u16 key_buf = hid_key;
hid_tx_data(usb_device, (const u8 *)&key_buf, 2);
os_time_dly(2);
key_buf = 0;
hid_tx_data(usb_device, (const u8 *)&key_buf, 2);
}
- JL701N v1.4.2 打开歌词显示功能后,没有歌词数据,打印lrc analazy err。 在isd_config_rule.c中增加以下代码
//forprotect area cfg
PRCT_ADR = CONFIG_PRCT_ADDR;
PRCT_LEN = CONFIG_PRCT_LEN;
PRCT_OPT = CONFIG_PRCT_OPT;
//for volatile memory area cfg
//VM大小默认为CONFIG_VM_LEAST_SIZE,如果代码空间不够可以适当改小,需要满足4*2*n; 改小可能会导致不支持测试盒蓝牙升级(不影响串口升级)
VM_ADR = CONFIG_VM_ADDR;
VM_LEN = CONFIG_VM_LEAST_SIZE;
VM_OPT = CONFIG_VM_OPT;
/********增加部分**********/
LRIF_ADR=AUTO;
LRIF_LEN=0x1000;
LRIF_OPT=1;
/********增加部分**********/
JL7012F 当屏幕驱动分辨率高于360360后,打印this chip need widthheight <360360,屏幕无法显示。 芯片设计规格限制F型号的最大分辨率只能到360360. JL7013A系列可以支持最大分辨率为480*480.
JL701N歌词文件为UNIX时出现复位的情况。
需要修改ui.ld中的font_utf8_2_unicode改为utf8_2_unicode,链接文件中的函数名字不对
demo_701142_OLED_lrc.zipJL701N SDK打开BLE 编译报错 BLE从机修改方法
(补充:按照此方法修改,在关闭蓝牙后台情况下连接ble调试助手后,插卡进音乐模式播歌发现会异常复位。修改建议:直接打开CONFIG_APP_BT_ENABLE // AI功能、流程总开关)JL701N SDK打开UI使能后,OLED和LCD都会出现按键事件SYS_KEY_EVENT无作用问题。
程序中做了事件屏蔽,类似于手表的屏幕背光唤醒功能,第一次按键无作用,用来唤醒屏幕背光,音箱SDK中普遍没有操作背光的需求,导致所有消息都跑到这里被屏蔽掉,建议注释这个事件注册。701_142_SDK配置IIS_48k输出,播放一段时间后出现卡顿问题 对比公版此文件,将区别点修改:
【金山文档 | WPS云文档】 audio_way
https://kdocs.cn/l/crVuzyNGf9pHJL701_142_SDK增加AAC能量检测功能,修复1T2抢播需要等待时间偏长问题
//抢播参数设置:
__set_a2dp_sound_detect_counter(30,30);//第一个参数:后台持续多久音频后抢播;第二个参数:抢播后持续多久后允许被抢播
//补丁使用api:
#if TCFG_BT_SUPPORT_AAC
void aac_decoder_energy_det_close();
aac_decoder_energy_det_close();
#endif
extern void free_a2dp_using_decoder_conn();
free_a2dp_using_decoder_conn();
补丁:
patchJL701N_soundbox_release_V1.4.2_AAC能量检测补丁_20240607.rar
JL701_142_sdk切换音效文件时出现死机问题修改 701_142_sdk切换eq文件死机问题修改.rar
处理打补丁后音乐模式上下曲死机
28 sound 142 切换eq文件死机问题补充修改.zip
替换了 G3 音效补丁的使用:
三代音效添加eq文件切换异常问题.zipJL701_142_sdk动态eq增益修改时存在杂音问题修改 【金山文档 | WPS云文档】 Dynamic_701_142_sdk_修复切换文件时出现杂音问题
https://kdocs.cn/l/cu8GzKcAim1DJL701_142_sdk 广播TCFG_BROADCAST_ENABLE和CONFIG_APP_BT_ENABLE宏同时打开,编译完成后无法生成fw文件 打开TCFG_BROADCAST_ENABLE以及CONFIG_APP_BT_ENABLE宏之后,编译会报错缺少config.dat文件,拷贝一份config.dat到对应路径下即可
JL701_142_sdk 打开广播TCFG_BROADCAST_ENABLE后ble无法连接 打开TCFG_BROADCAST_ENABLE宏后,le server以及client角色连接个数会被置0,导致无法连接ble,需修改下图位置 server以及client角色连接个数为1

JL701_142_sdk 使用fget_file_byname_indir函数会造成死机问题 死机打印如下:

复现方法:
修改方法:
system_BR28_142_20240716_修复获取lrc歌词名字死机问题.rarJL701_142_sdk 测试盒子任意数字IO串口升级失败处理方法 下载以下的文件,跟进说明修改。需要注意如果是用了ota_debug.bin会出现因数据过多导致的串口超时,最终升级失败。所以请使用ota.bin文件。
jl701n_soundbox_release_v1.4.2_测试盒串口升级_修改点.rarJL701_142_sdk 强制同时使能声卡和混合录音功能 处理方法 SDK默认不支持同时使能声卡和混合录音,强制同时使能,可适用于业务场景:“强制混合录音文件只能存储于 TF 卡中”
修改如下:
// apps/soundbox/include/build_error.h
#if SOUNDCARD_ENABLE && RECORDER_MIX_EN
// #error "声卡功能和混合录音功能暂不支持同时开启"
#endif
// cpu/br28/audio_enc/audio_recorder_mix.c -> __recorder_mix_start()进行如下修改:
static int __recorder_mix_start(struct __recorder_mix *recorder)
{
xxxxxx
char *logo = {"sd0"}; // 直接修改为 sd0 或者 sd1,根据需要调整
// char *logo = dev_manager_get_phy_logo(dev_manager_find_active(0));//普通设备录音,获取最后活动设备
xxxxxx
}
在//cpu/br28/audio_enc/audio_dec_file.c -> file_dec_close进行如下修改:
- 切换到music模式开始解码时,调用file_dec_start接口会执行rec_mix_fifo_ch_open,但退出时调用file_dec_close并没相应执行rec_mix_fifo_ch_close。
- 所以修改file_dec_close函数实现,使其能够相应关闭 rec_mix_fifo
- 这样切出music模式,再切入蓝牙模式,则能够正常打开 rec_mix_fifo 通道进行混合录音

- JL701_142_sdk RTC模式省32K晶振处理方法


- JL701_142_sdk 开广播和BLE后,BLE无法连接(杰理之家,BLE OTA升级无法使用)
SDK开广播会将BLE server数量设置为0,导致无法连接配对上,需要和141SDK一样打开。 - JL701_142_sdk 设置DAC输出为24Bit,连接小度APP后会变调 小度开启语音功能时,会将ADC设置为16bit,在关mic时改回即可。


- JL701_142_sdk 开启小度后无法生成不同的蓝牙名和BLE名字 处理方法:可通过以下接口重新配置ble名字
extern void dma_set_custom_ble_name(char *name,uint8_t len);
44. JL701_142_sdk 动态调节ble功率接口编译报ble_set_fix_pwr没定义 btctrler_for_ac701n_sounbox_142_add_ble_fix_pwr_api_250613-志彬.zip
45. JL701_142_sdk 蓝牙1T2连接时,如何实现 后接听通话 的设备抢占蓝牙通话 处理方法: 需开启通话抢断使能。 __set_hfp_switch(1);
46. JL701_142_sdk 快速获取播放状态avrcp btstack-701-v142-20250611.zip
//底层会调用该函数
void user_avrcp_status_callback(u8 *addr,u8 flag)
{
//flag = 0 是暂停,1是播放
put_buf(addr,6);
}
- JL701_143_beta2_sdk 播放提示音时,叠加播放手机音乐,手机音乐无声 处理方法:固定采样率。

- JL701_1.4.2 增加FAT多扇区读取功能,用于解决文件解高码率的文件进行扫盘操作的时候出现音频卡顿 jl701n_soundbox_release_v1.4.2_FAT多扇区读取.zip
49. JL701_1.4.2 外部使用多算法授权或者使用到了CRC校验概率会导致80S时间点上otp_api_verify死机。
去掉这一行。
在工程中补充下面的函数定义。
u16 chip_crc16(void *ptr, u32 len)
{
return CRC16(ptr,len);
}
- JL701_1.4.2 修改pc下设备图标 把音箱图标改耳机图标

static const u8 uac_spk_output_terminal_desc[] = {
///USB Speaker OT
0x09, //Length
USB_DT_CS_INTERFACE, //DescriptorType:audio interface descriptor
UAC_OUTPUT_TERMINAL, //DescriptorSubTYpe:Output Terminal
SPK_OUTPUT_TERMINAL_ID, //TerminalID
// LOBYTE(UAC_OUTPUT_TERMINAL_SPEAKER), HIBYTE(UAC_OUTPUT_TERMINAL_SPEAKER), //TerminalType:Speaker
LOBYTE(UAC_OUTPUT_TERMINAL_HEADPHONES), HIBYTE(UAC_OUTPUT_TERMINAL_HEADPHONES), //TerminalType:Speaker
0, //AssocTerminal:
SPK_FEATURE_UNIT_ID, //SourceID: Feature UNIT
/* SPK_SELECTOR_UNIT_ID, //SourceID: Selector UNIT */
0x00, //Terminal String
};

- JL701_142 usb音箱低概率出现杂音问题(需要电脑端异常才能触发) 根本原因:
电脑端有一包或者几包数据错误导致数据长度异常,导致后续音频采点异常,
处理方案:
if (rx_len != spk_frame_len) {
memset(ep_buffer, 0, spk_frame_len);
rx_len = spk_frame_len;
}
适用于spk_frame_len是固定长度大小的情况;
51. JL701_142 蓝牙测试盒升级成可视化程序包出现堆栈溢出死机,后续使用BR28_EDR_UPDATE升级问题。 ota_debug.bin打印情况:
处理方案:
emu_stack_limit_set(1, 0, 0xFFFFFFF);
emu_stack_limit_set(0, 0, 0xFFFFFFF);
JL701_142 MAC上看不到刚录到EMMC卡的音频文件 MAC系统版本:macOS Tahoe 26.0.1
EMMC卡文件系统:exfat
操作步骤:EMMC卡录音完了之后插入MAC没发现刚才录的音频文件
补丁下地址:system_BR28_20251110_更新exfat文件名校验码算法.rarJL701_120 iphone 16 杰理小程序OTA app 升级失败 OTA_debug:
方案更换OTA.bin
jl701_120 iphone16 杰理OTA小程序升级失败OTA.rarJL701_143_beta2_SDK 配置IIS输入,IIS模式下打开BIG广播,关掉BIG广播,再打开广播,会报死机——20260418-CJD 死机日志:
报[1-HCORE] hmem err msg : cpu1 instruction fetch hmem excption死机。
报[1-HCORE] mmu err msg : audio access mmu excption死机
原因:
IIS模式下关闭广播,执行sound_iis_capture_close-> alink_uninit(iis->hw_alink);,没有把对应的全局变量hw_alink清零,再次开启广播时,判断hw_alink为true,导致没有去打开IIS相关资源导致死机
增加修改如下所示:
55. JL701_143_beta2_SDK 打开LLNS 使能后会有滋滋滋的杂音 处理办法:将1.4.2版本sdk 的 libjlsp.a 跟 libllns.a 替换到 1.4.3版本的中
②若使能WIRELESS_MIC_CONFIG_LLNS 后,算法生效后喊话带有杂音,需要将stream_llns.c 文件下的 48K采样率对应的中断点数及申请buff 大小做修改
56. JL701_142 添加每次写同步目录项使能 替换修改附件文件:system.a
新增了一系列FATFS文件系统功能控制的配置宏,包括读写开关、长文件名支持
feature_1.4.2_每次写同步目录项使能_修改文件.7z
资料下载
案例分享:
- TWS音箱:
功能说明:
1、TWS区分主从
2、修复从机切模式会回连手机等问题
3、1.4.1SDK支持广播、TWS分时互斥使用:切换模式参考:KEY_WIRELESS_TRANS_MODE_SW 消息处理
soundbox_701(TWS_DEMO_1.3.0)——Git链接
soundbox_701(TWS_DEMO_1.4.1).zip(2023年10月8日更新)——Git链接
2023年10月8日更新:修复从机关机上电使用TWS地址问题
- cig模拟tws对箱:
CIG模拟TWS对箱功能demo说明:
1、上电开机默认以从机角色开启CIG,若有蓝牙连接、U盘插入或AUX插入事件发生,则自动切换跳转到对应蓝牙、music或linein模式做为主机开启CIG;
2、ADKEY AD0按键双击调用app_connected_role_switch()可主动切换CIG主从角色;
3、ADKEY AD1按键三击调用app_connected_switch()可主动开关CIG;
4、需有一主一从同时开启CIG才可完成CIG连接;
5、蓝牙模式,CIG未连接状态下,主从机均开启经典蓝牙可发现可连接
6、蓝牙模式,CIG已连接状态下,主机开启经典蓝牙可发现可连接,从机则关闭经典蓝牙可发现可连接;
7、关闭蓝牙后台,在music、linein模式下经典蓝牙不可发现不可连接;
8、只有CIG主机角色才可转发蓝牙、MUSIC或AUX音频到CIG从机,主机输出左声道,从机输出右声道;
9、已实现CIG主从机音量同步;
10、CIG完成连接后会记录地址绑定配对,若需要配对新设备,可通过ADKEY AD0按键三击调用app_connected_remove_pairs_addr()清除配对信息,并重新配对;
jl701n_soundbox_release_v1.4.2_cig模拟tws对箱功能demo_bt&aux&music_20240115.rar(使用可视化工程开发)
需要打上共性问题72点的补丁。
3. cig模拟tws&big双模式切换:
cig模拟tws&big双模式切换功能demo说明:
1、上电开机进经典蓝牙模式,按键调用KEY_WIRELESS_TRANS_MODE_SW切换经典蓝牙(即关闭BIG与CIG)、BIG或CIG模式;
2、在BIG模式下,需有一发一收同时开启BIG才可完成BIG连接:
//(1)处于蓝牙模式并且已连接手机设备时,播歌作为广播发送设备,暂停作为广播接收设备。
//(2)插入linein或U盘时,自动切换到linein或music模式做为广播发送设备;
3、在CIG模式下,需有一主一从同时开启CIG才可完成CIG连接:
//(1)处于蓝牙模式,已连接手机设备时作为主机角色发起连接,未连接手机设备时作为从机角色发起连接;
//(2)插入linein或U盘时,自动切换到linein或music模式做为主机角色发起连接;
4、关闭蓝牙后台,在music、linein模式下经典蓝牙不可发现不可连接;
5、蓝牙模式,CIG&BIG未连接状态下,CIG主从机、BIG广播发送设备与接收设备均开启经典蓝牙可发现可连接;
6、蓝牙模式,CIG&BIG作为从机角色/广播接收设备完成连接后关闭经典蓝牙可发现可连接,断开连接恢复经典蓝牙可发现可连接;
7、只有CIG主机角色才可转发蓝牙、MUSIC或AUX音频到CIG从机,主机输出左声道,从机输出右声道;
8、只有BIG广播发送设备才可转发蓝牙、MUSIC或AUX音频到BIG广播接收设备;
9、已实现BIG&CIG主从机/广播接收端音量同步;
10、CIG完成连接后会记录地址绑定配对,若需要配对新设备,可通过按键调用app_connected_remove_pairs_addr()清除配对信息,并重新配对;
jl701n_soundbox_release_v1.4.2_cig模拟tws&big双模式切换_bt&aux&music_20240131.rar(使用可视化工程开发)
需要打上共性问题72点的补丁。
4. IIS做输入同时实现usbmic与dac输出: jl701n_soundbox_release_v1.4.2_iis输入_usbmic&dac输出_20231117.rar
5. big广播模式下同时支持ble发包(没有ble接收功能): jl701n_soundbox_release_v1.4.2_广播模式下同时支持ble发包补丁_20240625.rar
6. 多文件叠加播放:
功能说明:
1、提供同时叠加播放多个音频文件的功能:接口如下
void tone_multi_file_play(u8 num);
注意:叠加播放的文件的数量取决于系统能不能跑得过来。使用相同采样率的文件避免变采样可以减少系统占用
soundbox_701(多路音频播放_1.4.1)
7. 添加一路AUX叠加播放 
功能说明:
1、添加一路AUX叠加输出功能
2、添加《jl701n_soundbox_release_v1.4.1_patch(RECORD_MIX)》补丁
soundbox_701(添加AUX采集_1.4.1).zip——Git链接
8. 添加PSRAM驱动 注意:芯片选型需要选择内封psram的芯片
【金山文档】 soundbox_701(添加PSRAM驱动_1.4.1)
soundbox_701(添加PSRAM驱动_1.4.1).zip——Git链接
9. 单线串行控制幻彩灯珠使用 UI相关应用.otl
10. 彩屏UI简单使用 UI相关应用.otl
11. 提示音外置到外挂Flash JL701N音箱 - 提示音外置到外挂Flash.otl
12. 文件系统录音时创建文件的时间设置 内部git地址
在创建文件之前设置文件系统的时间调用接口如下
/* --------------------------------------------------------------------------*/
/**
* @brief 设置文件的创建时间
*
* @param year 年
* @param month 月
* @param day 日
* @param hour 小时
* @param minute 分钟
* @param second 秒
*/
/* ----------------------------------------------------------------------------*/
void fat_set_datetime_info(u16 year, u8 month, u8 day, u8 hour, u8 minute, u8 second);
exFAT:
- 需要换system.a https://kdocs.cn/l/clvFLF2YO9mn
- 定义 const int FATFS_GET_SPACE_USE_RAM=0;
- IIS应用 如果IIS 配置48K输出需要把PLL改成 240M:clock_set_pll_target_frequency(240000000);

IIS输出1.3.0 SDK:
【金山文档】 jl701n_soundbox_release_v1.3.0_IISOUT_64SCLK
jl701n_soundbox_release_v1.3.0_IISOUT_64SCLK.7z
IIS输出1.4.2(支持广播+48K IIS+DAC+32K混响):
参考代码:
ac701n_soundbox_sdk(feature_1.4.2_混响_广播).zip——内部git
IIS输入(混响)+IIS输出
参考代码:
soundbox_701(IIS输入当混响_1.4.2).zip——Git链接
14. 通话和混响使用两路不同的麦通路: 701_141SDK_feature_混响和通话分别使用两个麦通道.zip
- 添加FM RTC6222驱动: feature_FM_rtc6222-jl701n_soundbox_release_v1.4.1.7z
- 蓝牙广播MIC soundbox_701(蓝牙广播MIC_2023年12月6日).zip
- OLED歌词显示 demo_701142_OLED_lrc.zip
- 维持IO跳转升级 cpu\br28\tools\isd_config_rule.c
PB02&1 :代表 PB02 维持高
PB08&0 :代表 PB08 维持低
soundbox_701_1.4.2(维持IO升级支持设置IO状态).zip - 使用 SPI + DMA 模拟 UART 发送
- 原理: 串口每一帧时序(每帧发送一个字节),完成一帧发送总共需要模拟11 bit 的数据(包含校验位);
UART 通信时序:
常见的 4 线SPI 通信时序:
模式:(模拟 uart 的 tx 单线发送,模式无关紧要)
CPOL:0—SCL空闲为低电平 1—SCL空闲为高电平
CPHA:0—SCL基数边沿采样 1—SCL偶数边沿采样


如模拟 19,200 波特率的 uart 发送,mosi 则用于模拟 uart 的 tx 脚。如果1个 spi 时钟周期模拟一个bit,发送1 Octet 的 uart 数据需要模拟11 bit,则至少需要2 Octet 的 spi 数据,余 5 bit 全部用于空闲位;
1个 spi 时钟周期模拟一个bit 需要 spi 时钟周期 19,200 Hz ≈ 52 us,但一般spi 通常在几百kHz到几百MHz之间。如果选择 8 个 spi 时钟周期模拟 uart 的一个bit,spi 时钟需要 153,600 Hz(即发送 1 Octet 数据时间 ≈ 52 us)。如发送 uart 数据 0x18, 即发送 spi 数据:
{0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF}
- 701 的 spi 时钟速率计算 701 sdk 的系统时钟 sys_clk 最大为 160 MHz, spi 最大分频为 256;sys_clk 在 24 ~ 160 MHz 内变频,则 SPI 时钟频率最小值会在 (24 MHz / 256 ~ 160 MHz / 256 ) = 93,750 ~ 625,000 Hz 变化。如果跑满主频的情况下 625,000 > 153,600,因此至少需要 spi 发送 5 Octet 的数据才能完成 52us 模拟一个 bit:
spi 时钟 = 5 * 153,600 = 768,000 - DEMO 示例
- 板级配置
#define TCFG_HW_SPI1_ENABLE ENABLE_THIS_MOUDLE
#define TCFG_HW_SPI1_PORT_CLK NO_CONFIG_PORT // 可不用
#define TCFG_HW_SPI1_PORT_DO IO_PORT_02
#define TCFG_HW_SPI1_PORT_DI NO_CONFIG_PORT // 可不用
#define TCFG_HW_SPI1_BAUD 461538L // 必须为 153600 的整数倍
#define TCFG_HW_SPI1_MODE SPI_MODE_BIDIR_1BIT
#define TCFG_HW_SPI1_ROLE SPI_ROLE_MASTER
#if TCFG_HW_SPI1_ENABLE
struct spi_platform_data spi1_p_data = {
.port = {
TCFG_HW_SPI1_PORT_CLK,
TCFG_HW_SPI1_PORT_DO,
TCFG_HW_SPI1_PORT_DI,
},
.mode = TCFG_HW_SPI1_MODE,
.clk = TCFG_HW_SPI1_BAUD,
.role = TCFG_HW_SPI1_ROLE,
};
#endif
- 关键发送函数实现
#define DUMMY_BYTE 0xff
#define BUF_MAX_LEN 512U
#define TIME_BYTE 10 // 填充包尾,可延长空闲位高电平时间
static u8 g_tx_buff[BUF_MAX_LEN] __attribute__((aligned(4)));
/**
* @brief 模拟组包
* @param spi_tx spi 发送缓存 buffer
* @param data 实际需要发送的数据
* @param dLen 数据长度
* @return 0 组包失败,其他 组包长度
*/
static u16 soft_uart_pkt_create(u8 *spi_tx, u8 const* data, u16 dLen) {
u8 bit = 0;
u8 odd = 0;
u16 pkt_len = 0;
u8 bit_byte = DUMMY_BYTE;
size_t i, j;
if ((dLen * g_bit_per_byte + TIME_BYTE) > BUF_MAX_LEN) return 0;
while (dLen--) {
// start bit
bit_byte = 0x00;
for (j = 0; j < g_bit_per_byte; j++) spi_tx[pkt_len++] = bit_byte;
// data bit
for (i = 0; i < 8; i++) {
bit = (*data >> i) & 0x01;
bit_byte = bit ? DUMMY_BYTE : 0x00;
for (j = 0; j < g_bit_per_byte; j++) spi_tx[pkt_len++] = bit_byte;
odd ^= bit;
}
// parity bit 奇校验
bit_byte = (odd == 0) ? DUMMY_BYTE : 0;
for (j = 0; j < g_bit_per_byte; j++) spi_tx[pkt_len++] = bit_byte;
// stop bit
bit_byte = DUMMY_BYTE;
for (j = 0; j < g_bit_per_byte; j++) spi_tx[pkt_len++] = bit_byte;
odd = 0;
data++;
}
// time delay 空闲位
memset(&spi_tx[pkt_len], DUMMY_BYTE, TIME_BYTE);
pkt_len += TIME_BYTE;
return pkt_len;
}
/**
* @brief 串口数据 spi 发送
* @param data 数据
* @param len 数据长度
* @param remap_port 映射端口,非 NULL 时会重新映射到输入的端口,
其中 NO_CONFIG_PORT 会忽略
顺序: CLK, DO, DI, D2(wp), D3(hold)
*/
int uart_spi_send(spi_dev spi, u8 const *data, u16 len, spi_remap_port *const remap_port) {
int ret = 0;
static u32 __sys_clk = 0;
u32 cur_sys_clk = 0;
// 处理变频情况,系统时钟发生改变需要重新设置一遍 spi 时钟
cur_sys_clk = clk_get("spi");
if (__sys_clk != cur_sys_clk) {
__sys_clk = cur_sys_clk;
ret = spi_set_baud(spi, spi_get_info_clock(spi));
if (ret < 0) goto __exit;
}
// uart 组包
u16 spi_tx_len = soft_uart_pkt_create(g_tx_buff, data, len);
// spi pin 重映射
if (remap_port != NULL) spi_remap_port_fn(spi, remap_port);
// spi dma 阻塞发送
ret = spi_dma_send(spi, g_tx_buff, spi_tx_len);
__exit:
return ret;
}
- 发送测试
#include "system/timer.h"
#define SPI_DEV SPI1
void uart_spi_send_test(void *priv) {
spi_remap_port *io = (spi_remap_port *)priv;
int ret = 0;
u8 cmd_data[7] = {0x08, 0x1, 0x3, 0x5, 0x7, 0xff, 0xff};
static u8 index = 0;
if (index++ > 1) index = 0;
#if UART_SPI_INTERRUPT_ENABLE
ret = uart_spi_send_for_isr(SPI_DEV, cmd_data, sizeof(cmd_data), &io[index], 10);
#else
ret = uart_spi_send(SPI_DEV, cmd_data, sizeof(cmd_data), &io[index]);
#endif
if (ret < 0) {
log_info("%s, %d", __func__, ret);
}
}
void uart_spi_send_demo(void) {
int ret = 0;
static spi_remap_port io[2] = {
{
.port[0] = NO_CONFIG_PORT,
.port[1] = TCFG_HW_SPI1_PORT_DO,
.port[2] = NO_CONFIG_PORT,
.port[3] = NO_CONFIG_PORT,
.port[4] = NO_CONFIG_PORT,
},
{
.port[0] = NO_CONFIG_PORT,
.port[1] = IO_PORTA_00,
.port[2] = NO_CONFIG_PORT,
.port[3] = NO_CONFIG_PORT,
.port[4] = NO_CONFIG_PORT,
},
};
for (size_t i = 0; i < 2; i++) {
gpio_set_direction(io[i].port[1], 0);
gpio_set_pull_up(io[i].port[1], 0);
gpio_set_pull_down(io[i].port[1], 0);
gpio_set_output_value(io[i].port[1], 1);
}
ret = uart_spi_open(SPI_DEV);
if (ret < 0) return;
(void)sys_timer_add(io, uart_spi_send_test, 50);
log_info("%s", __func__);
}
现象:两线分时发送,且解码正确;
参考代码:
uart_spi_tx.zip
20. 蓝牙和mic 混响的声音同时混合广播出去的demo 使用以下SDK包实现功能:
【金山文档 | WPS云文档】 ac701n_soundbox-jl701n_soundbox_v1.4.3beta1_BT混合mic广播.rar
ac701n_soundbox-jl701n_soundbox_v1.4.3beta1_BT混合mic广播.rar
21. 录音加通话降噪 jl701n_soundbox_release_v1.4.2_录音加通话降噪.rar
22. 小度APP
Gitlab地址:Files · feature_小度demo · 自由品牌 / 客户支持 / SOUNDBOX / ac701n_soundbox_sdk · GitLab
demo程序
jl701n_soundbox_release_v1.4.2_小度_20251202.rar
最新蓝牙库及小度库
修复问题
修复关闭蓝牙后台后,由其他模式切回蓝牙模式时无法回连小度的问题。
修复安卓手机无法提前用按键暂停语音唤醒录音的问题。
修复语音唤醒播报天气预报时,会出现无声播报的问题。
增加电量显示配置接口。

增加修改ble名称的接口,使其与EDR不同名。

增加修改小度设备名称接口

增加歌词获取功能

蓝牙模式广播&live_mic模式广播 demo sdk 包:142_1TN_TX_sdk_mic&bt_20250729.rar
低延时linein模式广播demo 外网:Files · feature_sdk_1.4.2_AUX_1TN · SOUNDBOX / 非可视化 / ac701n_soundbox_sdk · GitLab
demojl701n_soundbox_v1.4.3beta2 版本sdk 使用 2T1_duplex应用 通过自动主从切换实现单程序对讲机应用功能修改办法 gitlab 链接:文件 · feature_sdk_1.4.3_beta2_单程序对讲 · 自由品牌 / 客户支持 / SOUNDBOX / ac701n_soundbox_sdk · GitLab
demo sdk 包:jl701n_soundbox_v1.4.3beta2主从自动切换对讲机20241123.rar捕获外部io上升沿、下降沿 中断 相关资料:TIMER.otl
代码:Files · case_外部io上下沿捕获(中断) · SOUNDBOX / 非可视化 / ac701n_soundbox_sdk · GitLab