中科蓝讯 SDK TWS 组队和蓝牙配对过程分析

TWS 组队和蓝牙配对过程分析

哈喽,大家好。

在对中科蓝讯 SDK 的二次开发过程中,我们时常需要对 TWS 组队和蓝牙配对功能进行修改,或在此过程中添加功能。下面我将从两个大方面对此进行分享。第一,将分析 TWS 组队和蓝牙配对过程,旨在先对 SDK 中的TWS 组队和蓝牙配对有所了解,方便下一步的进行;第二,将列举此过程两个功能的修改或添加。

一、TWS 组队和蓝牙配对过程灯效分析

1、准备工作

A)接线准备:

B)打印信息输出 IO 更改为PA7:

C)配置工具配置准备:


2、TWS 组队和蓝牙配对灯效函数

func_bt_disp_status() 函数将显示 TWS 组队和蓝牙配对各个阶段的灯效,每个阶段的灯效通过该函数 switch 语句中的对应 case 下的灯效函数进行显示,又分主副耳灯效。

3、TWS 组队和蓝牙配对过程

在左右耳机都新下程序的情况下,首次上电左右耳机首先显示开机灯效,然后进入 case BT_STA_SCANNING(func_bt_disp_status() 函数中的 case 语句)调用 led_bt_scan() 函数,TWS 未组队和蓝牙未配对灯效,亮300ms灭450ms,蓝红交替闪:

双击 USER_DEF 键将进行 TWS 组队:

注意,此时耳机的蓝牙模块亦同时打开,即 TWS 组队与蓝牙配对是同时进行的。

当 TWS 组队完成,蓝牙未配对,主耳(双击按键一方,最终将调用函数 bt_tws_search_slave(15000) ,然后被判定为主耳)进入 case BT_STA_IDLE 调用 led_bt_idle() 函数,亮300ms灭450ms,蓝红交替闪;并播放 TWS 组队提示音。副耳进入 case BT_STA_CONNECTED 调用 led_bt_connected() 函数,蓝灯亮100ms, 灭5S:

当 TWS 组队完成,且蓝牙配对完成,主副耳都进入 case BT_STA_CONNECTED 调用 led_bt_connected() 函数,蓝灯亮100ms, 灭5S。

二、TWS 组队和蓝牙配对过程功能修改

1、TWS 组队完成主副耳红蓝灯亮一秒后,副耳熄灭,主耳 100ms 闪烁

A)自定义红蓝灯亮 1s 和 100ms 闪烁结构体(配置工具中没有的灯效):

第一个 0x06 将以 0110 0000 倒序来控制红灯亮灭(0:灭,1:亮);第二个 0x06 将以0110 0000 倒序来控制蓝灯亮灭;10 指两个二进制位间的时间是 10*50ms;255 指两个字节间的时间间隔是无限长,它的时间单位同样是 50ms。

SDK已定义的灯效可通过配置工具来修改,如下开机状态配置 LED:

t1 是指两颗 LED 之间闪烁的间隔(上图即为 10*50ms);每 8 颗 LED 可以看做是一个周期,写成代码即对应 8 个二进制位;t2 是指两个周期之间的间隔(上图即为 0*50ms)。上图红灯全部熄灭,对应二进制数:0000 0000,若写成灯效结构体须倒序,倒序后值没有变化;蓝灯灯效对应二进制数:1010 1010,但若写成灯效结构体须先倒序为:0101 0101 ,因此,上图若写成灯效结构体其各个成员值为:{0x00,0x55,10,0}。

B)新建使主副耳灯效同步的灯效函数:


led_set_sta_choice(const void *cfg,int cnt) 函数是自定义函数,其中,cfg 是灯效结构体指针;cnt 为真,主副耳的灯效将同步,为假,则不同步。

bt_tws_is_slave() 用于判断是否是副耳。

C)增加 100ms 队列消息:


D)灯效实现:

bt_tws_is_connected() 函数用于判断 TWS 组队是否完成;

tws_connected 是全局变量,做自加是避免两次进入 case BT_STA_IDLE 重复跑灯效函数,并作为主耳 100ms 红蓝灯交替闪烁的标记位;

delay_5ms(200) 保证红蓝灯亮一秒而不被覆盖。

bt_nor_is_connected() 函数用于判断蓝牙配对是否完成,此处为防止副耳在完成 TWS 组队但未完成蓝牙配对的情况下跑此灯效。

在 100ms 队列消息中使主耳 100ms 红蓝灯交替闪烁,副耳保持熄灯状态。

蓝牙断开将进入 case BT_NOTICE_DISCONNECT,令 tws_connected = 1 可使耳机进入主耳 100ms 红蓝灯交替闪烁副耳熄灭的蓝牙配对灯效。

  • 先进行 TWS 组队再进行蓝牙配对

A)设置上电回连手机次数为 0 次:

B)蓝牙初始化完成后设置不可被发现:

bt_set_scan() 函数的参数为 0x00 时,可以设置耳机蓝牙不被发现。

C)进入 FUNC_ BT 前获取当前时钟:

在 sys_cb 中增加变量 tws_connect_start 用以记录时间;

双击按键开始 TWS 组队,则记录下开始组队的时刻;

D)msg_bt.c 文件里面判断计时是否到 10S,到5S 后设置回连或者可被手机发现:

tick_check_expire() 函数用于判断记录的组队时刻开始到现在是否有 10s;bt_nor_get_link_info(NULL) 判断是否有蓝牙配对信息;bt_set_scan() 函数的参数为 0x03 时,耳机蓝牙可被发现、可被连接。

E)如 10s 内 TWS 配上对设置可被发现或者回连手机:

内容介绍到这里,欢迎大家批评指正。对于其他的组队以及配对的功能,可以借鉴上面几个点去延伸,如果大家还有什么其他的问题或者功能想要询问,亦可以在评论区中提出,可以共同探讨,一起进步。

参考文档
1、中科蓝讯蓝皮书
2、BT8922D DataSheet.pdf

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论

杜兰特

杜兰特

2022年8月25日
蓝牙超距断连以及回连是怎么处理的?