702相关应用
📎 原始文档:https://www.kdocs.cn/l/ccnIGhEwR8NX 702相关应用
文档简介
该文档主要描述 AC702N开发相关的使用说明和注意事项,收集并持续更新开发调试过程中的相关疑问和解答,对SDK介绍文档做一个补充说明,为用户进行二次开发提供参考。
由于版本较多,如本文档有与SDK包内文档或代码注释说明冲突,以后者为标准。
一、芯片和工程特性
D0芯片相较于常规的芯片代码存储在 FLASH,SDK 代码的存储介质是 ROM 介质。因为代码已经固化到 ROM,不可编辑,只可通过配置 efuse 位来进行控制。适合程序固定不变的应用场合。
D0芯片没有flash,断电后无法保存TWS配对信息,如需长时间仓储,要把自动配对打开,或者使用按键配对,避免因为长时间存放、电池没电导致TWS掉配对和不配对
D2芯片增加了一个外置 flash,依托于 ROM 内代码资源可以被 FLASH 代码调用的特性,可以组成断点工程【ROM+FLASH】。则相对比与需要配置工具进行配置的 ROM 工程,增加更多的可修改性,可反复擦写,灵活性很强,适合做开发用途。
注意:并非所有的功能都可以通过断点方式增加,能插断点的前提条件是能找到要插断点位置的地址,其次,断点的数量是有限的 ,过于复杂的功能无法通过断点方式实现。
二、芯片型号和SDK选用说明
AC702N芯片本版识别
芯片丝印: 第一排:logo
第二排:批次号+芯片版本(字母‘C’就是C版芯片,字母‘B’就是B版芯片)
第三排:芯片型号+flash/OTP(数字是0则为OTP芯片;数字是2则是2M的falsh的芯片)

例如: (1)丝印为BP19869C- AC7023D0则这个芯片是C版的OTP芯片。
(2)丝印为BP1F978TKC- AC7023D2则这个芯片是C版的2M带flash的芯片。
(3)丝印为BP14183TKB- AC7023D2则这个芯片是B版的2M带flash的芯片。SDK包的选择 版本发布约定: v1.x.x 只用于b版 v2.x.x 只用于c版
例:
SDK | 对应芯片 | ||
|---|---|---|---|
| B版 (带flash版本) | C版 (OTP版本) | C版 (带flash版本) | |
| AC702N_FLASH_SDK_v1.0.2 【配置存在flash,可以重复更新】 | Y | × | × |
| AC702N_FLASH_SDK_v2.0.0 【配置存在flash,可以重复更新】 | × | × | Y |
| AC702N_FLASH_SDK_v2.0.1 【配置存在flash,可以重复更新】 | × | × | Y |
| AC702N_FLASH_SDK_v2.1.0 【配置存在flash,可以重复更新】 | × | × | Y |
| AC702N_release_v1.0.4 【配置存在flash,可以重复更新】 | Y | × | × |
| AC702N_release_v2.0.2 【配置存在efuse,不可重复更新】 | × | Y | 特殊 |
| AC702N_release_v2.0.3 【配置存在efuse,不可重复更新】 | × | Y | × |
备注:
"×"表示不支持,
"Y"表示支持;
”特殊“表示该程序能够烧录到C版(带 flash)的芯片,但是烧录后,该芯片成OTP的芯片,不再支持flash重新烧录。
注意:C版芯片带flash使用AC702N_FLASH_SDK_v2.x.x的SDK,
OTP芯片使用AC702N_release_v2.x.x的SDK
1、AC702N芯片的B版芯片可使用的SDK版本:
AC702N_release_v1.x.x ( 版本支持B版芯片的flash版本,但release_V1.x.x 版本没有代码,仅支持配置工具选配功能。flash 版本支持重复更新(升级或烧录))
AC702N_FLASH_SDK_v1.x.x( 版本支持B版芯片的flash版本,带有部分代码,可修改部分功能。flash 版本支持重复更新(升级或烧录))
注意:B版芯片没有OTP版本,全都是带flash的。
2、AC702N芯片的C版OTP芯片可使用的SDK版本:
AC702N_release_v2.x.x
注意:
1、release_V2.x.x 版本若使用到带flash版本的C版芯片上,只能当OTP使用,不支持重复更新(升级或烧录修改功能)
2、release_v2.0.2支持蓝牙名称修改(需要测试盒版本为 V1.2.9 及以上),OTP/flash版本的C版芯片都支持修改,但修改次数有限制,规则如下:
可被修改的蓝牙名称efuse长度是16个byte,第一次烧写的蓝牙名称会被算2倍长度,之后再更新就是挨着写多少就多少,所以第一次名字尽量短,就可以写多次。
三、升级烧录说明
+烧录器的注意事项
不能使用B版-flash的程序去烧录C版带flash的芯片,烧录时会报错,并且烧录后的芯片不能重烧,该芯片无法使用了。
使用C版-OTP的程序,能够烧录进去C版带fLash的芯片,但是烧录后该芯片没有用到flash。相当烧录后变成OTP的芯片,该芯片无法重新烧录。
重点注意事项 ① C版OTP芯片,只能使用C版OTP的程序烧录。
② C版带flash的芯片,目前SDK已发布,请务必使用芯片对应的软件版本开发。程序升级注意事项
702空片第一次烧写需要使用烧写器烧写任意程序版本的 fw 文件,进行芯片初始化才能够正常启动,(D2芯片需要完成第一次烧写后才能使用强升工具升级);
空片直接上电跑的是默认rom程序,是一个无按键,无关机时间的的tws方案,蓝牙名是BT_music;
702目前暂无SD卡升级和无线升级,只支持测试盒串口有线升级;
测试盒升级常见错误;

测试盒升级报错10,检查chip_name、pid、vid
重点检查VID,公版程序默认是0.01,demo程序一般是2.00,用户需要自行统一到相同VID
6.串口升级使用任意io升级时,不支持升级过程中耳机断电重新升级;
重要:
702系列芯片第一次烧写必须要通过烧录器烧写(一拖二、一拖八)!!!
有些版本用flashSDK即使未使用烧录器烧过,使用强升工具升级也显示成功,但因为没过烧录器,实际运行的是ROM里的默认程序,是一个无按键,无关机时间的的tws方案,蓝牙名是:BT_music
四、开发说明
- D0工程 D0工程使用对应SDK包内配置工具开发,配置前请检查依赖的软件包确保更新到最新版本


配置工具详细使用说明请参考对应SDK包内文档《AC702N_配置工具说明.pdf》
2. D2工程
D2工程有两种:
① 配置工具版本:
SDK命名为AC702N_release_v1.0.x,使用方式同D0工程一样,可以反复烧写。工程配置项可视化,操作上手简单;
② 代码版本:
即flashSDK,SDK命名为AC702N_FLASH_SDK_v1.0.x或v2.0.x,该工程开放部分常用文件和接口,用户开发操作相对配置工具工程更灵活。目前D2芯片使用的基本是C版flashSDK。以下对D2工程介绍主要是围绕C版代码版本最新的flashSDK展开。
D2flashSDK开发使用与其他系列芯片的标准SDK基本一样,基本设置在板级文件更改;
与D0配置工具相比,D2flashSDK配置工具只保留提示音修改功能;
原D0工程配置工具内的配置项需在代对应板级文件.c文件修改,代码内配置项有详细注释说明,所有板级都约定使用虚拟 efuse 进行功能配置,只有部分配置项(声道、频偏)存储在物理efuse 进行数据固化处理。
SDK 配置起效优先级 efuse 配置>板级配置>board_ac702x_default_cfg.h
注意:board_ac702x_default_cfg.h 该文件为默认配置,不建议修改
3. 板级选择相关补充
- 根据型号或方案(SD、TWS、lighting)选择对应板级
- 7029A、7025F暂时没有对应板级,可选7026A板级关SD卡功能后使用
五、常用功能使用说明
- 蓝牙名
1.1 D0工程蓝牙名修改说明
SDK版本 release_v2.0.2支持蓝牙名称修改(需要测试盒版本为 V1.2.9 及以上)
① 配置工具加载原来的配置文件;
② 修改蓝牙名;
③ 保存配置文件;
④ 双击download.bat生成.ufw文件;
⑤ 使用测试盒串口升级,升级完成后取出重启即使用新蓝牙名;
注意事项:
1. 存储蓝牙名的efuse空间为16byte,因此修改新旧蓝牙名长度总和不能超过16字符,蓝牙名可修改次数由蓝牙名长度决定; 2. 现版本D0芯片因修复蓝牙名获取异常需要,实际蓝牙名可使用空间可能少于16byte; 3. 蓝牙名修改原理为把上一次写入的efuse内容全部烧为0,然后在上一次蓝牙名后面重新扫入新的蓝牙名到物理efuse,该过程不可逆;
1.2 D2flashSDK蓝牙名修改说明
D2芯片蓝牙名存储在flash中,可视为不限次数擦写修改,修改蓝牙名位置:对应板级.c文件.bt_name中
补充:
a. 16 个字符的蓝牙名长度不够,支持修改更长蓝牙名:
参考下图添加如下代码进行修改 32 个字符的蓝牙名修改
#include "user_cfg.h"
extern BT_CONFIG rom_bt_cfg;
const u8 bt_vm_name[] = "BT_NAME_VM";
memcpy(rom_bt_cfg.edr_name, bt_vm_name, sizeof(bt_vm_name));
b. D2flash支持动态修改蓝牙名:
1.3 D0芯片升级蓝牙名,升级成功后手机搜索蓝牙名变地址
已修复
请升级到最新版本SDK,或将最新版本SDK的ota.bin文件替换到当前工程下载目录。
- 按键
2.1 按键类型
702按键的类型主要有:IOKEY,ADKEY,TOUCHKEY;
按键类型详细介绍参考对应SDK包内文档《AC702N_SDK_介绍.pdf》
2.2 按键配置
a.设置按键类型,按键类型设置位置:对应板级.c文件的.key_type配置项
如果不是TOUCHKEY,需要在板级.h关闭TOUCHKEY按键使能
KEY_TYPE_CFG_IO_KEY = 0, //IO按键
KEY_TYPE_CFG_AD_KEY, //AD按键
KEY_TYPE_CFG_TOUCH_KEY, //内置触摸
KEY_TYPE_CFG_NONE = 0b11, //不烧efuse, 无按键
b. 如果需要修改按键扫描驱动参数则需要在对应的板级关闭使用默认的固定按键扫描参数的 宏定义
TCFG_USE_DEFAULT_KEY_SCAN_PARA,并且在对应按键文件配置 ex_xxkey_scan_para 参数调试按键效果:
c. 修改按键事件列表,对应板级.c文件ex_key_table
d. 如需对按键事件做更深入的功能修改,请在key_event_deal.c对应事件case内进行修改;
2.3 多按键设置
设置多个按键导致系统越界死机解决方法:

2.4 触摸按键相关补充
(1)触摸按键调试工具:
触摸按键调试请参考对应SDK包内文档《AC702N_内置触摸调试工具帮助文档.pdf》
(2)滑动触摸
该功能已开发完成,后续版本AC702N_FLASH_SDK_v2.2.0发布,当前开发可使用beta版本
demo链接: 【金山文档】 AC702N_FLASH_SDK_v2.2.0_beta(支持滑动触摸) AC702N_FLASH_SDK_v2.2.0_beta(支持滑动触摸).zip
(3)触摸按键和io按键共用
使用 AC702N_FLASH_SDK_v2.2.0_beta版本,板级选用io按键,在io按键初始化后手动添加触摸按键初始化
补充:
1. 702虽然有多个触摸通道,但AC702N_FLASH_SDK_v2.2.0之前版本驱动只支持单个触摸按键,故不支持设置多个触摸按键,只能两个通道2选1。 2. AC702N_FLASH_SDK_v2.2.0_beta版本目前只支持滑动触摸功能,驱动消息统一使用 key0 ,暂不支持将两路触摸通道做成两个单独的触摸按键。
(4)开智能充电仓出仓概率触摸失效
修改方法:删除了没有需求的【在仓长按10s取消配对】的功能,精简充电流程,提高对充电仓的兼容性( 2.2.0后公版已修复该问题)
diff --git a/apps/earphone/override/app.c b/apps/earphone/override/app.c
index ef50388..42bd21c 100644
--- a/apps/earphone/override/app.c
+++ b/apps/earphone/override/app.c
@@ -332,6 +332,20 @@ void app_poweron_check_skip(int update)
#endif/* #ifndef CFG_PERFORMANCE_TEST */
}
+void charge_ldo5v_in_deal_part_skip(void)
+{
+ ex_sdk_printf(" %s>>>>>>>>>>>\n", __func__);
+ if (get_cfg_touchkey_enable()) {
+#if (TCFG_LP_TOUCH_KEY_ENABLE)
+ extern void rom_lp_touch_key_charge_mode_enter();
+ rom_lp_touch_key_charge_mode_enter();
+#endif
+ }
+
+}
+
+
+
#include "user_cfg.h"
#undef __this
diff --git a/apps/earphone/override/override.c b/apps/earphone/override/override.c
index 61b0250..57fa9d8 100644
--- a/apps/earphone/override/override.c
+++ b/apps/earphone/override/override.c
@@ -391,6 +391,14 @@ const BP_ST break_point_table[BREAKPOINT_MAX_NUM] = {
{BREAKPOINT_INSERT_MODE, (void *)0x166774, charge_full_detect_insert},
#endif
+// 删除【在仓长按10s取消配对】的功能
+ {
+ .mode = BREAKPOINT_PART_REWRITE_MODE,
+ .part_rewrite_target_addr = (void *)0x1702b4,
+ .part_rewrite_fun = charge_ldo5v_in_deal_part_skip,
+ .part_rewrite_fun_return_addr = (void *)0x1702ce,
+ },
+
#if TCFG_TEST_BOX_ANY_IO_UPDATE
#if TCFG_POWER_ON_NEED_KEY
/* 任意IO串口升级唤醒直接开机 */
2.5 红外遥控irkey
demo链接: 【金山文档】 AC702N_FLASH_SDK_v2.1.0_添加irkey_20230722 https://kdocs.cn/l/cmbMPInVyqCp
2.6 多击按键相关补充
(1)flashSDK连击被过滤
app层为了rom设计做了特殊处理
实际上SDK支持五击和六击事件,功能可直接添加在user_app_event_prepare_handler
(2)OTP芯片操作≥5击会触发的是三击功能
OTP芯片出厂时该功能已固化,不可修改
2.7 长按复位相关补充
(1)关闭长按复位功能
在需要关闭的地方调用long_reset0_disable()即可,参考lighting方案
(2)动态修改长按复位的复位电平
//level:1是高电平复位,0是低电平复位
//gpio:必须与使能长按复位的IO一样,比如板级文件配置的长按复位口是PB1,
//那么这里就是填IO_PORTB_01
void reset_long_reset0_level(u8 level, int gpio)
{
long_reset0_disable();
if(level){
gpio_set_pull_down(gpio, 1);
gpio_set_pull_up(gpio, 0);
P3_PINR_CON |= BIT(2);
}
else{
gpio_set_pull_down(gpio, 0);
gpio_set_pull_up(gpio, 1);
P3_PINR_CON &= ~BIT(2);
}
long_reset0_enable();
}
- 灯效
3.1 标准场景灯效设置
公版SDK有10 个标准的 led 模式,用户可设置对应的灯效模式变化
标准场景灯效设置位置:对应板级.c文件的 .led_ui_config.charge.xxx
LED_UI_ALL_OFF = 1, //mode1: 全灭
LED_UI_LED_ALL_ON, //mode2: 全亮
LED_UI_LED1_ON, //mode3: 红亮
LED_UI_LED1_SLOW_FLASH, //mode4: 红慢闪
LED_UI_LED1_FAST_FLASH, //mode5: 红快闪
LED_UI_LED1_DOUBLE_FLASH_5S, //mode6: 红灯5秒连闪两下
LED_UI_LED1_ONE_FLASH_5S, //mode7: 红灯5秒闪1下
LED_UI_LED0_ON, //mode8: 蓝亮
LED_UI_LED0_SLOW_FLASH, //mode9: 蓝慢闪
LED_UI_LED0_FAST_FLASH, //mode10: 蓝快闪
LED_UI_LED0_DOUBLE_FLASH_5S, //mode11: 蓝灯5秒连闪两下
LED_UI_LED0_ONE_FLASH_5S, //mode12: 蓝灯5秒连闪1下
LED_UI_LED0_LED1_FAST_FLASH, //mode13: 红蓝交替闪(快闪)
LED_UI_LED0_LED1_SLOW_FLASH, //mode14: 红蓝交替闪(慢闪)
LED_UI_LED0_BREATHE, //mode15: 蓝灯呼吸灯模式
LED_UI_LED1_BREATHE, //mode16: 红灯呼吸灯模式
LED_UI_LED0_LED1_BREATHE, //mode17: 红蓝交替呼吸灯模式
//特殊UI:
LED_UI_LED1_FLASH_THREE, //自定义状态,不能通过pmd_led_mode去设置
LED_UI_LED0_FLASH_THREE, //自定义状态,不能通过pmd_led_mode去设置
LED_UI_LEFT_OFF_RIGHT_LED0_LED1_FAST_FLASH, //左耳熄灭右耳红蓝灯快速闪
LED_UI_RIGHT_OFF_LEFT_LED0_LED1_FAST_FLASH, //右耳熄灭左耳红蓝灯快速闪
LED_UI_NULL = 0b11111, //不烧写efuse, 不改变灯状态
3.2 自定义灯效设置
(1)除了 10 个标准的 led 场景模式之外,其余场景下的 led 是否可配?
目前是不支持配置标准 led 模式之外的其他 led 模式的,原因是 AC702N 的代码是代码固化 ROM里面,不可修改。
补充:
a. 用户可通过pwm_led_mode_set接口自行开发,在需要设置的地方更改灯效;
b.pwm_led_mode_set接口设置无效果,可能是该部分代码并未跑到,或者被其他地方重新设置灯效覆盖;
(2)更改推灯模式:两个IO推两个灯
相关驱动固化在ROM中无法修改,暂不支持推灯模式修改
3.3 更改推灯IO
AC702N_FLASH_SDK_v2.0.0后版本SDK可支持,板级.h修改TCFG_LED_IO_PORT_CFG宏
对于部分板级.h没有LED配置的旧版本SDK,需要在板级.c文件.led_io_sel 处修改虚拟efuse配置
虚拟efuse只支持更改以下引脚:
LED_IO_CFG_PB3 = 0,
LED_IO_CFG_PB2, //备用
LED_IO_CFG_PB6,
LED_IO_CFG_PB7, //备用
LED_IO_CFG_PC4,
LED_IO_CFG_PC5, //备用
LED_IO_CFG_DM,
LED_IO_CFG_NONE = 0b111, //不烧efuse, 无LED
3.4 充电满电灯效设置
(1)B版修改方法
板级.c文件 .led_ui_config.charge_full设对应的满电灯效
但由于充满电系统空闲可能会马上关机,导致满电灯效显示不出来
处理方法:
charge_full_detect_hook里将注释掉sdx_dev_detect_time_del,然后加一个定时器让系统满电不马上关机,定时器挂个空函数即可
补充:
部分SDK看打印不跑charge_full_detect_hook,检查是否有添加断点,若没有需自行添加
{BREAKPOINT_NORMAL_SKIP_MODE, rom_charge_full_detect, charge_full_detect_skip},//*添加断点
(2)C版修改方法
C版修改逻辑同B版一样,但由于B版断点不通用于C版,需要自行添加断点如下
{BREAKPOINT_INSERT_MODE, (void*)0x174674, charge_full_detect_insert},//*添加断点



3.5 灯的亮度修改
ac702n_flash_sdk_v2.1.0已支持该功能
demo链接: 【金山文档】 ac702n_flash_sdk_v2.0.1_支持灯亮度调节_20230425 https://kdocs.cn/l/culPPB2K2uDS
3.6 LED常用接口
pwm_led_mode_set() /*切换led模式*/
pwm_led_mode_set_insert() /*获取当前状态*/
- 提示音
4.1 提示音设置
使用外部配置工具添加音源,默认是加载下载目录下的提示音 tone.cfg,如果有一个新的 tone.cfg 文件,点击加载按钮可以把该提示音文件加载进来。如果想更换提示音,直接把对应的提示音文件拉到对应选项即可。
注意:
目前只支持添加 wts 格式和 sin 格式的提示音
同时需要保持 SDK 的TCFG_EX_RES_IN_FLASH_ENABLE 宏处于开启状态
4.2 语言设置和切换
(1)默认语言设置
设置位置:对应板级.c文件的.default_language
LANG_TYPE_ENGLISH = 0,
LANG_TYPE_CHINESE,
(2)部分旧SDK存在来电报号无法语言切换
需要做如下修改
(3)语言切换
配置按键事件LANGUAGE_SWITCH或通过rom_language_switch_deal接口进行切换
4.3 模式提示音前添加poweron提示音
已支持
demo链接: 【金山文档】 ac702n_flash_sdk_v2.0.1_模式提示音前添加poweron提示音_20230505 https://kdocs.cn/l/cnoxu1stQKHq
4.4 按键提示音
(1)io、ad按键
该功能ac702n_flash_sdk_v2.1.0已支持
(2)触摸按键
该功能已支持
demo链接: 【金山文档】 ac702n_flash_sdk_v2.0.1_添加触摸按键提示音_20230424 https://kdocs.cn/l/cgZAk6uhZI4S
注意:该音源不建议修改,702不支持叠加播放提示音,修改音源后只能打断
4.5 提示音叠加播放
702系列暂不支持
4.6 修改TWS配对提示音
公版程序默认使用rom内部正弦波提示音,外部配置工具添加tws_conn提示音不生效
demo添加修改tws配置提示音功能
demo链接: 【金山文档】 ac702n_flash_sdk_v2.0.1_添加修改TWS配对提示音功能_20230427 https://kdocs.cn/l/cjXCI1k1xD2M
4.7 提示音音量设置
(1) 提示音音量
(2)单独修改sin提示音音量
默认sin提示音音量与提示音音量一致 , 如需使用独立的sine提示音音量 , 需使能宏TCFG_SIN_VOL_CONFIG_ENABLE后,通过配置 SYS_DEFAULT_SIN_VOL修改SINE 提示音音量
联合音量sin提示音叠加音乐播,不支持单独设置音量大小,需要改到软件数字音量
5. TWS相关功能 注意:本章节介绍基于AC702N_FLASH_SDK_v2.0.1版本SDK,新版本经优化后通常与旧SDK存在差异,若与其他版本SDK文档有冲突,以后者为标准。
5.1 TWS配对方式选择
(1)按键发起配对的作为左声道
将【tws 配对方式】选择为【按键配对】,按键配对应用需要在【按键配置】的【KEY_0 配置】添加按键配对流程。则通过双击发起配对的那个耳机作为主机和左声道,被配对上的为右声道。
(2)自动配对时,主机作为左声道
自动交叉配对:利用蓝牙名结合配对码生成公共地址,左右耳通过公共地址进行配对。
如果没有固定左右耳或者通过上下拉区分左右耳的话,自动配对中,主机将作为左声道,从机作为右道,不会随着主从切换而改变。
(3)自动不交叉配对(c 版新增)
自动不交叉配对:利用蓝牙名生成公共地址,左右耳通过公共地址进行配对,配对后记住对方的地址。如果超过 20s 没有回连到对方,则忘记对方的地址,配对方式变为自动交叉配对。
注意:
1.自动配对可以和固定左右、上下拉电阻区分左右这两种方式结合,在上电后自动配对,左右耳由【声道检测方式】决定。如果【声道检测方式】选择【智能充电仓决定左右耳】,开机后将会自动配对。
2.自动配对 - TWS 未连接情况下,进行搜索配对。(产线多设备情况下,容易出现交叉配对情况)
补充:
a.使用交叉配对时,SDK默认同边(同声道)耳机不支持交叉配对,D0详见本文档5.4章节
5.2 TWS配对声道选择
TWS 配对和声道选择方式如下图所示:
以下的声道选择均为虚拟 efuse 的配置,如果使用了测试盒对耳配对功能(章节《对耳配对功能注意事项》)把物理 efuse 的声道烧写为【固定左右耳】,则取物理 efuse 的声道来覆盖虚拟 efuse的配置。
注意:
C版FlashSDK工程在使用测试盒配对的同时会烧写物理efuse固定声道;
测试盒对耳配对功能添加左右声道烧efuse的宏TCFG_EFUSE_WR_CHANNEL_ENABLE相关功能只用于B版FlashSDK工程,C版部分板级虽未删除但无实际作用。
左右声道选择主要有以下几种情况:
(1)测试盒分配左右耳(默认)
【声道检测方式】选择【测试盒分配左右耳(默认)】,第一次上电开机声道默认声道为"U",如果没有使用测试盒配对,则根据配对方式进行声道分配策略,tws 配对成功后,随机分配声道后则固定声道到 RAM,每次开机都是固定后的声道。只有绝对断电才会重新配对。
注意:
a. 使用该方式建议通过测试盒搭配模具进行配对烧写【声道检测方式】为【efuse 固定左右耳】,否则 tws 首次配对可能存在左右耳声道颠倒的现象。
b. 使用该选项后,【TWS 区分左右耳按键配置】的配置可能会出现颠倒现象。
c. 如果 L/R 跟 U 配对,则 L/R 的一边会保留,U 会变为另一边进行适配。
(2)固定左右耳
固定为左声道或者右声道。但生产需要注意要分两个程序进行生产。
(3)智能充电仓选择
【声道检测方式】选择【智能充电仓决定左右耳】,耳机放入充电仓之后,通过充电仓分配左右耳。
(4)通过下拉电阻决定左右耳
【声道检测方式】选择【硬件电阻决定左右耳】,并且把【入耳检测的 IO 选择】改为检测外部电阻的 io 口,则贴了外部 1k 下拉电阻的耳机作为右声道,没贴的作为左声道。
(5) 保留
【声道检测方式】选择【保留位’U’】,第一次上电开机声道默认声道为"U",根据配对方式进行声道分配策略。
注:该方式属于补救策略,不能再通过测试盒搭配模具进行配对烧写【声道检测方式】为【efuse固定左右耳】
OTP芯片烧写保留后,相当于回到使用测试盒分配左右耳且未用测试盒固定左右耳的状态,左右耳声道信息由配对方式决定;
补充:
a.SDK默认同边(同声道)耳机不支持交叉配对,详见本文档5.4章节
b.不使用物理efuse,将声道信息保存在VM区,见本文档本文档5.6章节
5.3 TWS重新配对
以下描述只适用于第一次上电开机声道默认声道为"U",根据配对方式进行声道分配策略。
重新配对左右耳的方式:
(1)测试盒重新配对
(2)按键重新配对。当处于配对状态时,第一次按键触发是取消配对,第二次按键触发是发起配对。当处于未配对状态时,第一次按键触发则是发起配对。
(3)智能充电仓重新配对
可以清除配对左右耳的方式:
(1)在充电仓的状态下,长按 10s,灯 ui 为快交替闪。(需要模具支持在仓时候能触摸到按键)
5.4 同边交叉配对
现有公版SDK默认程序不支持同边交叉配对
例: 耳机A左右耳配对上,耳机B左右耳配对上
1.此时拿耳机A的左耳(左声道)跟耳机B的右耳(右声道)是可以交叉配对上的。
2.而拿耳机A的右耳(右声道)跟耳机B的右耳(右声道)是不能交叉配对(同边)
D0工程暂不支持,flashSDK可通过如下方式修改:
5.5 对耳配对慢相关补充
(1)耳机左右耳已配对过,但仍觉得回连速度慢
TWS配对方式使用【自动不交叉配对】,开机先回连,再交叉配对,提高回连速度
(2)耳机A左右耳已配对,耳机A左耳与新耳机配对慢
检查TWS配对方式,使用【自动不交叉配对】要先完成回连搜索再进行交叉配对,会导致交叉配对慢
自动不交叉配对:利用蓝牙名生成公共地址,左右耳通过公共地址进行配对,配对后记住对方的地址。如果超过 20s 没有回连到对方,则忘记对方的地址,配对方式变为自动交叉配。
5.6不使用EFUSE保存CHANNEL
不使用物理efuse,将声道信息保存在软件VM区,声道由软件设置决定;
配置成声道信息使用VM后,测试盒读写的是VM的声道
demo链接: 【金山文档】 ac702n_flash_sdk_v2.0.1_支持声道信息保存到VM_20230519 https://kdocs.cn/l/cb7KrKRPZxDL
注意:
C版FlashSDK工程在使用测试盒配对的同时会烧写物理efuse固定声道;
测试盒对耳配对功能添加左右声道烧efuse的宏TCFG_EFUSE_WR_CHANNEL_ENABLE相关功能只用于B版FlashSDK工程,C版部分板级虽未删除但无实际作用。
对于已经烧写过物理efuse的芯片,由于efuse设置优先级高于软件,所以最终使用的还是efuse的声道信息,可以修改如下注释efuse读取代码:
5.7关闭交叉配对
公版的自动不交叉配对模式:利用蓝牙名生成公共地址,左右耳通过公共地址进行配对,配对后记住对方的地址。如果超过 20s 没有回连到对方,则忘记对方的地址,配对方式变为自动交叉配对。
这种方式20s未配对,依然会打开交叉配对,若希望完全关闭交叉配对功能,20s后不切换公共配对码自动配对即可;
配对模式选择自动不交叉配对,再注释掉如下
- EQ和通话
6.1 EQ调试
D0芯片在线调试版本 EQ 参数取在线调试下来的参数,不读取 efuse 的配置参数,在线调试完后需自行记录EQ参数,通过配置工具填入烧写;
D2芯片完成EQ调试后,需自行记录EQ参数,在工程代码对应板级.c文件里修改结构体.eq_tab和.ul_eq_tab完成配置。
注意:
AC702N 芯片各个频点中心截止频率范围在 20~20000Hz 之间;增益调节范围在-12~12dB 之间;eq总增益调节范围在-20~20dB 之间。
EQ在线调试使用方法请参考对应SDK包内文档《AC702N_SDK_介绍.pdf》在线EQ调试章节 手机APP调试请参考《AC702N_AudioTools使用手册.pdf》
补充:
- 702暂不支持通话下行EQ
- 部分版本在线EQ调试连接一直超时,需要开十段EQ宏才能连接;检查是否有下宏做分成处理,没有则加上;

注意:702已支持通过外部eq.bin文件读取EQ参数
6.2 通话调试
通话调试同EQ调试一样,完成调试后需要需自行记录调试参数,填入配置工具或工程代码对应板级.c文件里
具体调试方法,请参考对应SDK包内文档《JL 通话调试手册.pdf》
注意:APP在线调试的设置范围与代码虚拟efuse设置范围不一致,以代码注释为准
6.3 SD卡方案EQ
该功能已支持
demo链接: 【金山文档】 ac702n_flash_sdk_v2.0.1_支持SD卡方案EQ_20230427 https://kdocs.cn/l/cbYS5ZWImt1H
6.4 EQ模式切换
该功能已支持,demo如下:
//hzb-20230310
const struct eq_seg_info eq_tab_normal_111[] = {
{0, EQ_IIR_TYPE_BAND_PASS, 22, -12 << 20, (int)(0.7f * (1 << 24))},
{1, EQ_IIR_TYPE_BAND_PASS, 800, 3 << 20, (int)(0.5f * (1 << 24))},
{2, EQ_IIR_TYPE_BAND_PASS, 10000, 3 << 20, (int)(1.6f * (1 << 24))},
{3, EQ_IIR_TYPE_BAND_PASS, 432, 0 << 20, (int)(0.7f * (1 << 24))},
{4, EQ_IIR_TYPE_BAND_PASS, 821, 0 << 20, (int)(0.7f * (1 << 24))},
};
const struct eq_seg_info eq_tab_country_111[] = {
{0, EQ_IIR_TYPE_BAND_PASS, 22, -12 << 20, (int)(0.7f * (1 << 24))},
{1, EQ_IIR_TYPE_BAND_PASS, 70, -9 << 20, (int)(0.8f * (1 << 24))},
{2, EQ_IIR_TYPE_BAND_PASS, 130, -16 << 20, (int)(0.7f * (1 << 24))},
{3, EQ_IIR_TYPE_BAND_PASS, 2500, -20 << 20, (int)(0.8f * (1 << 24))},
{4, EQ_IIR_TYPE_BAND_PASS, 821, -15 << 20, (int)(0.7f * (1 << 24))},
};
#define STEP_GAIN (0.1f*(1<<20)) //增益步进
#define STEP_Q (0.1f*(1<<24)) //Q值步进
struct eq_seg_info eq_tab_temp[] = {
{0, EQ_IIR_TYPE_BAND_PASS, 22, -12 << 20, (int)(0.7f * (1 << 24))},
{1, EQ_IIR_TYPE_BAND_PASS, 800, 3 << 20, (int)(0.5f * (1 << 24))},
{2, EQ_IIR_TYPE_BAND_PASS, 10000, 3 << 20, (int)(1.6f * (1 << 24))},
{3, EQ_IIR_TYPE_BAND_PASS, 432, 0 << 20, (int)(0.7f * (1 << 24))},
{4, EQ_IIR_TYPE_BAND_PASS, 821, 0 << 20, (int)(0.7f * (1 << 24))},
};
extern void *rom_get_eq_cfg_hdl(void);
extern int rom_eq_mode_set(EQ_MODE mode);
void eq_step_timer_handle(void *priv)
{
EQ_CFG *eq_cfg = rom_get_eq_cfg_hdl();
/* struct eq_seg_info *seg = eq_cfg->cfg_parm[song_eq_mode].song_eq_parm.parm.seg; */
extern struct eq_seg_info rom_eq_tab_custom[];
static u8 need_change = 0; //该值为1说明参数还需要调整
for(int j = 0; j < eq_cfg->seg_num[song_eq_mode]; j++){
if(rom_eq_tab_custom[j].iir_type != eq_tab_temp[j].iir_type){
need_change = 1;
break;
}
if(rom_eq_tab_custom[j].freq != eq_tab_temp[j].freq){
need_change = 1;
break;
}
if(rom_eq_tab_custom[j].gain != eq_tab_temp[j].gain){
need_change = 1;
break;
}
if(rom_eq_tab_custom[j].q != eq_tab_temp[j].q){
need_change = 1;
break;
}
}
if(need_change){
//实时 将rom_eq_tab_custom 和eq_tab_temp 做对比, 实时更新rom_eq_tab_custom
for(int j = 0; j < eq_cfg->seg_num[song_eq_mode]; j++){
rom_eq_tab_custom[j].iir_type = eq_tab_temp[j].iir_type;
rom_eq_tab_custom[j].freq = eq_tab_temp[j].freq;
if(rom_eq_tab_custom[j].gain < eq_tab_temp[j].gain){
if(rom_eq_tab_custom[j].gain + STEP_GAIN < eq_tab_temp[j].gain){
rom_eq_tab_custom[j].gain += STEP_GAIN;
} else {
rom_eq_tab_custom[j].gain = eq_tab_temp[j].gain;
}
printf("eq_tab[%d].gain:%d, rom_eq_tab_custom[%d].gain(+):%d\n",j, eq_tab_temp[j].gain,j, rom_eq_tab_custom[j].gain);
} else if(rom_eq_tab_custom[j].gain > eq_tab_temp[j].gain){
if(rom_eq_tab_custom[j].gain - STEP_GAIN > eq_tab_temp[j].gain){
rom_eq_tab_custom[j].gain -= STEP_GAIN;
} else {
rom_eq_tab_custom[j].gain = eq_tab_temp[j].gain;
}
printf("eq_tab[%d].gain:%d, rom_eq_tab_custom[%d].gain(-):%d\n",j, eq_tab_temp[j].gain,j, rom_eq_tab_custom[j].gain);
}
if(rom_eq_tab_custom[j].q < eq_tab_temp[j].q){
if(rom_eq_tab_custom[j].q + STEP_Q < eq_tab_temp[j].q){
rom_eq_tab_custom[j].q += STEP_Q;
} else {
rom_eq_tab_custom[j].q = eq_tab_temp[j].q;
}
printf("eq_tab[%d].q:%d, rom_eq_tab_custom[%d].q(+):%d\n",j, eq_tab_temp[j].q,j, rom_eq_tab_custom[j].q);
} else if(rom_eq_tab_custom[j].q > eq_tab_temp[j].q){
if(rom_eq_tab_custom[j].q - STEP_Q > eq_tab_temp[j].q){
rom_eq_tab_custom[j].q -= STEP_Q;
} else {
rom_eq_tab_custom[j].q = eq_tab_temp[j].q;
}
printf("eq_tab[%d].q:%d, rom_eq_tab_custom[%d].q(-):%d\n",j, eq_tab_temp[j].q,j, rom_eq_tab_custom[j].q);
}
}
rom_eq_mode_set(1);
need_change = 0;
}
}
void eq_mode_sw_test(u8 mode)
{
extern struct eq_seg_info rom_eq_tab_custom[];
static float global_gain = 10.0f;
extern float rom_cp_efuse_music_eq_tab_to_user_tab(void *user_tar);
extern void rom_set_global_gain(EQ_CFG *eq_cfg, MUSIC_MODE mode, float global_gain);
EQ_CFG *eq_cfg = rom_get_eq_cfg_hdl();
static u8 eq_mode_idx = 0;
/* const u8 EQ_TAB_NUM = 6; */
switch(eq_mode_idx){
case 0:
eq_mode_idx = 1;
puts("uuuuuuu ---------- 0\n");
/* memcpy(rom_eq_tab_custom, eq_tab_normal_111, sizeof(eq_tab_normal_111)); */
memcpy(eq_tab_temp, eq_tab_normal_111, sizeof(eq_tab_normal_111));
break;
case 1:
eq_mode_idx = 0;
puts("uuuuuuu ---------- 1\n");
memcpy(eq_tab_temp, eq_tab_country_111, sizeof(eq_tab_country_111));
break;
}
static u16 ttime_id = 0;
if(!ttime_id){
ttime_id = sys_timer_add(NULL, eq_step_timer_handle, 200);
}
}
补充:浮点型数值设置增益
6.5 10段EQ调节
ac702n_flash_sdk_v2.1.0已支持离线 10 段 EQ 全精度功能
使用方法
(1) 在对应的板级文件开启该宏
(2) 加入离线 eq 文件资源
在 download.bat 文件里面加入以下字段 -res
注意事项:
a.离线编辑生成 eq 需要使用 AD698N 的格式文件
b.通话下行 EQ 部分不起效
c.DRC 设置只有限幅器起作用
6.6 三方通话功能
需更换btstack库文件
【金山文档】 702三方通话btstack
https://kdocs.cn/l/cqF3LpzOfy1H
- 开关机相关补充
7.1 上电开机和按键开机
按键开机时长设置:
IO按键:
触摸按键:
void lp_touch_key_timer_reinit(void)
{
//长按开机时间配置
M2P_CTMU_CH0_SOFTOFF_LONG_TIMEL = (CFG_M2P_CTMU_CH0_SOFTOFF_LONG_TIME & 0xFF);
M2P_CTMU_CH0_SOFTOFF_LONG_TIMEH = ((CFG_M2P_CTMU_CH0_SOFTOFF_LONG_TIME >> 8) & 0xFF);
}


7.2 拔出开机

7.3 关闭按键开关机功能
关闭按键开机:在开机断点中添加关机函数
关闭按键关机:在板级.c按键列表移除关机事件
7.4 升级拔出不开机
测试盒SD卡串口升级完成拔出不开机
该功能已支持
demo链接: 【金山文档】 ac702n_flash_sdk_v2.0.1_添加升级拨出不开机功能_20230425 https://kdocs.cn/l/cktpRf7wIywu
补充:对于升级完成后不及时拔出,仍接着测试盒串口线一段时间后才拔出,存在不关机问题
extern void rom_power_wakeup_disable_with_port(u8 port_io);
rom_power_wakeup_disable_with_port(IO_LDOIN_DET);
实际上是升级完成复位后进关机了,但是测试盒一直接着所以又马上唤醒了,之后拔出就不是升级完成的状态就不会走关机了,处理方法可以在升级完成复位进关机前把LDO5V的唤醒关闭,这样即使接着测试盒也不会被唤醒,但需要注意的是,这个时候拔出不会唤醒,需要按键唤醒或者进仓才能再次唤醒。
7.5 插入5v直接关机
用于外部充电时,5V插入关机
该功能已支持
demo链接: 【金山文档】 ac702n_flash_sdk_v2.0.1_添加5V插入关机功能_20230426 https://kdocs.cn/l/cplxE1JTsVlD
7.6 无蓝牙连接自动关机
D0工程:
D2工程:
对应板级.c文件的.auto_off_time,单位为分钟,最大关机时间:15分钟,设置为0不自动关机;
注意:
board_ac702x_default_cfg.h文件的宏TCFG_AUTO_SHUT_DOWN_TIME只用于保证建议能正常通过,无实际作用
7.7 测试盒配对完毕后关机
公版默认rom程序内无该功能,故测试盒此处设置无效。flashSDK更新到v210版本以上可支持,OTP芯片程序已固化无法修改,暂不支持;
ac702n_flash_sdk_v2.1.0已支持
7.8 ADkey按键开机功能
公版按键使用ADkey时,默认流程上电即开机;需要ADkey按键开机功能按以下思路添加:
- 添加长按开机时间宏TCFG_POWERON_TIME ,板级.h将TCFG_POWER_ON_NEED_KEY置零

- 在app.c文件check_power_on_key_skip函数内修改自己的开机按键判断逻辑

7.9获取唤醒IO
wakeup_pnd_data的BIT位对应rom_wk_param.port数组的索引,也就是wakeup_pnd_data的BIT(0)对应rom_wk_param.port[0],BIT(1)对应rom_wk_param.port[1],以此类推。
8. 电量和功耗相关补充
8.1 低电提示和关机电压


8.2 船运仓储模式
(1)外置船运模式
配置宏定义参数说明:
TCFG_EXTERN_STORAGE_MODE_ENABLE 宏能够使能或关闭外置芯片船运仓储模式
TCFG_EXTERN_STORAGE_MODE_BOAT_PL_PORT 选择控制外置船运芯片的 IO 端口
注意:不支持配置为 IO_PORT_DP 和 IO_PORT_DM,否则导致关机功耗变高。
外置芯片船运仓储模式配置的原理图对应
使能外置芯片船运仓储模式后:
a. 开机和关机,配置的船运仓储模式 EN 口即 BOAL_PL 都将保持高电平。
b.测试盒配置仓储模式命令使能后,可控制耳机进入船运模式
耳机开机或关机状态下放入串口通讯模具中,当通讯成功,即测试盒显示“命令应答”,并伴有“滴”一声提示后过几秒将耳机拿出通讯模具,耳机将进入船运模式
配置的船运仓储模式 EN 口即 BOAL_PL 被拉低,外置船运芯片收到信号会控制切断耳机的供电电源,进入船运仓储模式,此时整个耳机断电,无法通过按键开机唤醒耳机。只有在充电口额外供电的情况下,芯片才有电,拉高船运仓储模式 EN 口即 BOAL_PL,控制外部船运芯片一直对芯片供电。
c. 耳机放入充电仓再拿出将退出船运仓储模式。
(2)内置船运模式
该功能已支持,船运模式内理论功耗可做到4uA左右,使用方法同外置船运模式一样通过测试盒仓储命令进入。
配置宏定义参数说明:
TCFG_STORAGE_MODE_ENABLE 宏能够使能或关闭内置船运仓储模式。
使能内置置芯片船运仓储模式后:
a. 测试盒配置仓储模式命令使能后,可控制耳机进入船运模式,耳机开机或关机状态下放入串口通讯模具中,当通讯成功,即测试盒显示“命令应答”,并伴有“滴”一声提示后,将耳机拿出通讯模具,耳机将进入船运模式,此时耳机深度关机,无法通过按键开机唤醒耳机。
b. 耳机放入充电仓再拿出将退出船运仓储模式。
注意:当前 SDK 没有使用到 nvram,进入船运模式关闭了 nvram 以达到最小功耗,
如果方案要使用到 nvram,则需要开启回来,但功耗会有所升高。
B版demo链接: 【金山文档】 ac702n_flash_sdk_v1.0.2_B版添加tws内置船运模式_20230524 https://kdocs.cn/l/ctwXf3OtzR0f
C版demo链接: ac702n_flash_sdk_v2.1.0版本SDK公版已添加
(3)D0工程船运模式
D0工程暂不支持其他系列的船运模式,故使用测试仓储指令无应答;
为了让耳机从充电仓拿出来都是保持满电状态,702系列提供了一种vbat_det_teim的功能替代船运模式(基于充电仓一直有电可以充进去的前提)。
例:
假设一开始耳机电池充满为4.2v,充满后进入关机状态,电池缓慢放电。
当耳机芯片检测到电池电压低于3.8v的时候,会唤醒系统进行充电至充满电压4.2后关机。
然后在充电仓内重复该流程,以保证耳机从仓拿出来都是保持满电状态。
8.3 充电仓相关问题
(1)耳机满电入仓无法唤醒充电
部分充电仓存在耳机电池满电时放入,耳机检测到满电状态直接退出充电,导致无法唤醒充电仓5V和充电灯效;
处理方法:
添加以下代码,开始充电时调用user_ldo_isr_incres(1) 放电增加功耗,2s后关闭;(需保证PB3引脚不被占用)
void user_ldo_isr_incres(u8 en)
{
if(en)
{
EVD_EN(1);
EVD_SHORT_PB3(1);
gpio_set_pull_up(IO_PORTB_03, 0);
gpio_set_pull_down(IO_PORTB_03, 1);
gpio_set_direction(IO_PORTB_03, 0);
gpio_set_hd0(IO_PORTB_03, 1);
gpio_set_hd(IO_PORTB_03, 1);
gpio_set_output_value(IO_PORTB_03, 0);
}else{
EVD_EN(0);
EVD_SHORT_PB3(0);
gpio_set_pull_up(IO_PORTB_03, 0);
gpio_set_pull_down(IO_PORTB_03, 0);
gpio_set_die(IO_PORTB_03, 0);
gpio_set_dieh(IO_PORTB_03, 0);
gpio_set_direction(IO_PORTB_03, 1);
}
}
8.4 不进入低功耗模式
添加该断点实现不进入低功耗模式
8.5耳机充满时出现复充问题处理
AC702N:
关闭“开始充电后关闭LDOIN下拉电阻”
开启“在仓关机是否保持LDOIN下拉电阻”
如图所示:
备注:
保持下拉电阻带来的副作用:
1、整机在仓关机功耗会变高30uA左右(2 * 3V / 200K)。
2、一只耳机充满后,再放入另一只耳机时,不能进行充电。需要两只耳机拿起后再放入才能充电
8.6使用AC961的智能仓耳机充满时无法关机
低功耗时钟源修改
备注:耳机进入低功耗状态下,功耗会比用LRC的略大一点
9. 游戏模式 B版SDK不支持,C版SDK已开发完成

- 频偏
10.1 频偏相关说明
a. 详细功能使用说明请参考测试盒的附带文档的对应章节,该章节只描述涉及AC702N的操作注意
事项。
b. 频偏自动校正测试项只支持两次频偏写入,但是只有测试盒测试出来的频偏比第一次写入的频偏rf_fre_off_0 相差大于 2 才会第二次写入频偏rf_fre_off_1,没有大于 2 则是不会写入。
10.2 软件改频偏

//物理efuse没烧频偏就用虚拟efuse的
//烧了就用实际的
if (rf_fre_off_0_en != 1) {
rom_g_efuse_config.ef_rsd.rf_fre_off_0_en = rf_fre_off_0_en; //保留efuse中的channel使用
rom_g_efuse_config.ef_rsd.rf_fre_off_0 = rf_fre_off_0; //保留efuse中的channel使用
rom_g_efuse_config.ef_rsd.rf_fre_off_1_en = rf_fre_off_1_en; //保留efuse中的channel使用
rom_g_efuse_config.ef_rsd.rf_fre_off_1 = rf_fre_off_1; //保留efuse中的channel使用
}
不使用物理efuse,只用软件固定,直接在此处修改虚拟efuse的值
发射功率相关补充 注意:702发射功率最大可设置到6

充电相关补充
12.1 添加充电NTC温度保护
该功能最新公版已支持
demo链接: 【金山文档】 ac702n_flash_sdk_v2.0.1_添加NTC温度检测_20230424 https://kdocs.cn/l/ceUZk5Nrwzqg
12.2 ldo5v拔出滤波补充说明
ldo5v拔出过滤值,过滤时间 = (filter*100 + 40)ms,ldoin<0.6V且时间大于过滤时间才认为拔出
a. 对于充满直接从5V掉到0V的充电仓,该值必须设置成0;
b. 对于充满由5V先掉到0V之后再升压到xV的充电仓,需要根据实际情况设置该值大小;
12.3 关掉内置充电流程

- 时钟相关 修改系统时钟


六、生产相关
测试盒音量加减显示 该功能已支持
修改点:
demo链接: 【金山文档】 ac702n_flash_sdk_v2.0.1_添加测试盒显示音量加减_20230424 https://kdocs.cn/l/cquhmTLGatKd测试盒SDK信息、电量及检验码显示 该功能暂不支持
显示SDK信息、电量及检验码等功能需要通过蓝牙连接获取,目前702只有串口方式连接测试盒,故无法实现。+授权工具显示KEY不匹配
请更新烧写文件授权工具到v2.1.5以上耳机声道和配对注意事项 (1)AC702N公版程序默认声道相同的耳机不能配对(包括交叉配对);
例: 耳机A左右耳配对上,耳机B左右耳配对上
1.此时拿耳机A的左耳(左声道)跟耳机B的右耳(右声道)是可以交叉配对上。
2.而拿耳机A的右耳(右声道)跟耳机B的右耳(右声道)是不能交叉配对(同边)
具体声道分配方法,请参考对应SDK包内文档《AC702N_SDK_介绍.pdf》TWS配对声道选择章节
(2)SDK 配置起效优先级 :efuse 配置>板级配置>board_ac702x_default_cfg.h;
如果烧写了物理efuse优先使用efuse配置,且efuse为一次性可编程存储器,一旦烧写固定无法更改;建议测试盒搭配模具进行配对和efuse声道信息固定,确保左右耳不放反;
(3)AC702N在使用测试盒配对的同时会烧写声道信息到物理efuse;
测试盒对耳配对功能添加左右声道烧efuse的宏TCFG_EFUSE_WR_CHANNEL_ENABLE只适用于B版SDK;C版部分板级虽未删除该宏但无实际作用,不管是否使能,测试盒配对时必然烧写物理efuse;
(4)未烧写efuse情况下,声道信息由软件配置决定;
(5)未烧写efuse情况下,软件不对声道信息进行固定存在风险;
第一次上电开机声道默认声道为"U",如果没有使用测试盒配对,则根据配对方式进行声道分配策略,tws 配对成功后,随机分配声道后则固定声道到 RAM,每次开机都是固定后的声道。只有绝对断电才会重新配对。
因此tws 首次配对可能存在左右耳声道颠倒的现象,且即使生产时声道信息正确,客户使用时也可能存在断电导致声道重新分配的风险;故使用该方式时建议通过测试盒搭配模具进行配对烧写efuse固定声道信息或将声道信息保存在VM区;
demo链接: 【金山文档】 ac702n_flash_sdk_v2.0.1_支持声道信息保存到VM_20230519 https://kdocs.cn/l/cb7KrKRPZxDL
- 生产常见配对问题 (1)同边问题导致配对不上(OTP)
情况 1 : 测试盒固定的左右声道相同,导致TWS同边无法配对
验证方法:
参考SDK包内文档《AC702N_SDK_介绍.pdf》在线调试相关章节,打开异常样机的打印调试功能,用DP口抓取异常样机打印,确认EFUSE是否被烧写,烧写声道信息是否同边;
解决方法:
对于OTP芯片,暂不支持同边交叉配对,所有程序已经固化在ROM中,物理efuse信息一旦烧错不可更改,只能更换芯片重新烧录;
补充:烧错声道efuse可以重烧声道选择配置为【保留】,实现芯片不读efuse声道信息再次使用,但仍存在其他风险,请详读SDK手册相关章节做好把控。
情况 2 : 交叉配对产生的声道信息相同,导致TWS同边无法配对
具体原因:
TWS方案未使用软件或硬件分配声道,又未使用测试盒固定声道时,开机默认声道U,tws 配对成功后,随机分配声道后则固定声道到 RAM,每次开机都是固定后的声道。只有绝对断电才会重新配对。若异常样机左右耳都与其他样机交叉配对过,且分配到的RAM声道信息相同,则会产生同边无法配对的问题。
验证方法:
- 无法配对的异常样机用测试盒配对后都能配对
- 该情况下异常样机一边断电声道恢复到U即可重新配对,或者取U声道的耳机,与异常耳机左右耳都可以配对;
- 该情况下,取一对用测试盒固定过efuse声道的耳机A,存在耳机A的一边与异常样机的左右耳都能配对,耳机A的另一边与异常样机的左右耳都配对不上现象 解决方法:
- 使用软件或硬件分配声道
- 生产环节中添加测试盒烧写固定声道
(2)同边问题导致配对不上(FLASH SDK)
FlashSDK可通过打印确定物理efuse烧写情况和声道信息
①对于OTP芯片,暂不支持同边交叉配对,所有程序已经固化在ROM中,物理efuse信息一旦烧错不可更改。
②对于带Flash的芯片,如需要同边耳机也能实现配对,处理如下:
③对于带Flash的芯片,在测试盒配对同时烧写了物理efuse导致软件声道配置无效,处理如下:
(2)配对速度慢
① 已配对的耳机左右耳之间回连速度慢
TWS配对方式使用【自动不交叉配对】,开机先回连,再交叉配对,提高回连速度
② 已有配对记录的耳机单边和新耳机配对慢
如:耳机A左右耳已配对,耳机A左耳与新耳机配对慢
检查TWS配对方式,使用【自动不交叉配对】要先完成回连搜索再进行交叉配对,会导致交叉配对慢
自动不交叉配对:利用蓝牙名生成公共地址,左右耳通过公共地址进行配对,配对后记住对方的地址。如果超过 20s 没有回连到对方,则配对方式变为自动交叉配。
- 一拖八报错:烧写配置错误
通常是芯片使用测试盒配对或校准频偏烧写过efuse导致
验证方法:强升开打印看物理efuse烧写情况
原因:一拖八烧录的时候会校验efuse信息,烧写过efuse的芯片校准失败无法再使用烧录工具烧录(一拖二、一拖八)
如果强升开打印无任何信息,开机蓝牙名是BT_music,说明这是一个空片
可能是空片未过烧录器情况下,进测试盒配对或者校准频偏,导致烧写了声道/频偏物理efuse
处理方法:跳过校准项
7. 一拖二工具添加分配蓝牙地址功能 后续新版本SDK将自带该功能
旧版本使用AC702N_FLASH_SDK_v1.0.2或AC702N_FLASH_SDK_v2.1.1
需更换cpu.a文件
【金山文档】 AC702N添加一拖二烧录工具分配蓝牙地址功能 AC702N添加一拖二烧录工具分配蓝牙地址功能.zip
七、问题处理
- AC702_flash_v250,连接测试盒测音乐开耳返卡顿变调。-- 20260204 -- CKS


- AC702_flash_v250,开耳返切到音乐模式再切回蓝牙模式,播放卡顿变调。-- 20260204 -- CKS
