一、序言
本文介绍了如何使用Telink SDK快速进行蓝牙开发的简单配置,适用于Telink 825X以及921X系列芯片,目前已在TLSR8258以及TLSR9518上验证成功,不同的芯片由于驱动版本等略有差异,实现方式可能略有不同,请注意辨别,本文采用SDK V3.3.0.1配合B91 Development Board进行说明。
二、配置
1.文件结构
具体的环境配置等请参照官网开发手册,导入后结构目录如下:
目录中的文件夹对应关系如下:
- Algorithm:提供加密算法相关的函数。
- Application:提供⼀些通⽤的应⽤处理程序,如 print、keyboard 等。
- boot:提供芯⽚的 software bootloader,即 MCU 上电启动或 deepsleep 唤醒后的汇编处理过程,为后⾯ C 语⾔程序的运⾏搭建好环境。
- common:提供⼀些通⽤的跨平台的处理函数,如内存处理函数、字符串处理函数等。
- drivers:提供与 MCU 紧密相关的硬件设置和外设驱动程序,如 clock、flflash、i2c、usb、gpio、uart 等。
- proj_lib: 存放 SDK 运⾏所必需的库⽂件(如 libB91_ble_lib.a)。BLE 协议栈、RF 驱动、PM 驱动等⽂件,被封装在库⽂件⾥,⽤⼾⽆法看到源⽂件。
- stack:存放 BLE 协议栈相关的头⽂件。源⽂件被编译到库⽂件⾥⾯,对于⽤⼾是不可⻅的。
- vendor:⽤于存放⽤⼾应⽤层代码。
根据开发手册的说明:
我们选择ble sample进行开发,主要通过app.c文件修改相关的gap配置。
2.广播配置
首先我们知道广播数据帧的格式如下:
所以我们对例程中的广播报文与扫描应答报文修改如下:
/**
* @brief Adv Packet data
*/
const u8 tbl_advData[] = {
0x07, 0x09, 'B', 'L', 'E', 'H', 'I', 'D',
0x02, 0x01, 0x05, // BLE limited discoverable mode and BR/EDR not supported
0x03, 0x19, 0x80, 0x01, // 384, Generic Remote Control, Generic category
0x05, 0x02, 0x12, 0x18, 0x0F, 0x18, // incomplete list of service class UUIDs (0x1812, 0x180F)
};
/**
* @brief Scan Response Packet data
*/
const u8 tbl_scanRsp [] = {
0x0A, 0x09, 'B', 'L', 'E', 'S', 'a', 'm', 'p', 'l', 'e',
};
我们对这里出现的广播类型AD type来进行解析,它有如下定义(具体和详细的定义参考官方文档Core Specification Supplement):
类型 | 名称 | 说明 |
---|---|---|
0x09 | Complete Local Name | 设备名称 |
0x01 | Flags | 标识 |
0x02 | Incomplete List of 16-bit Service Class UUIDs | 蓝牙服务UUID的不完整列表 |
0x19 | Appearance | 外观 |
这里比较重要的是Flags,每位对应的描述如下:
根据需要设置相应的数值即可,具体定义参考蓝牙官方文档。
广播报文和扫描报文可以设置为不同的名称,这也是为什么有的蓝牙设备在不同的设备上被识别的名称不同的原因。
3.连接参数
通过修改连接任务中的参数来修改连接间隔,有如下配置:
/**
* @brief callback function of LinkLayer Event "BLT_EV_FLAG_CONNECT"
* @param[in] e - LinkLayer Event type
* @param[in] p - data pointer of event
* @param[in] n - data length of event
* @return none
*/
void task_connect (u8 e, u8 *p, int n)
{
// bls_l2cap_requestConnParamUpdate (8, 8, 19, 200); // 200mS
bls_l2cap_requestConnParamUpdate (8, 8, 99, 400); // 1 S
// bls_l2cap_requestConnParamUpdate (8, 8, 149, 600); // 1.5 S
// bls_l2cap_requestConnParamUpdate (8, 8, 199, 800); // 2 S
// bls_l2cap_requestConnParamUpdate (8, 8, 249, 800); // 2.5 S
// bls_l2cap_requestConnParamUpdate (8, 8, 299, 800); // 3 S
latest_user_event_tick = clock_time();
device_in_connection_state = 1;//
#endif
}
4.广播周期与通道
修改的代码段如下
bls_ll_setAdvParam( ADV_INTERVAL_30MS, ADV_INTERVAL_35MS,
ADV_TYPE_CONNECTABLE_UNDIRECTED, app_own_address_type,
0, NULL,
BLT_ENABLE_ADV_ALL,
ADV_FP_NONE);
bls_ll_setAdvEnable(BLC_ADV_ENABLE); //must: set adv enable
通道和周期的定义在hci_cmd.h文件中,BLT_ENABLE_ADV_ALL表示使用通道37、38、39,即全部的主广播通道。
还有功率、设备地址配置等参数,这里不一一赘述,有需要的再做了解和修改。
三、效果
编译烧录程序后在手机搜索蓝牙设备,可以看到描述与我们配置的相符:
抓到的数据也一致:
四、总结
SDK在蓝牙配置方面的内容总体比较全,修改起来也比较方便,有需要的人可以通过本文快速上手,运行一个简单的蓝牙例程。