背景
泰凌微蓝牙方案在消费类产品中近两年才火起来,实际网上也没有太多资料,芯片缺货的情况下作为替代方案还是可行的,手上有块TLSR8258的开发板,也就边看文档调试边记录
这里采用8258的方案在调,其实825X系列仅内部资源不一样(价格高低),实际选型的时候根据产品定位来选择合适的型号
型号 | flash | sram |
---|---|---|
8251 | 512kB | 32kB |
8253 | 512kB | 48kB |
8258 | 512kB | 64kB |
如有异议,欢迎指正,转载请注明出处
资源及SDK下载
特性
- BLE5.0;支持Telink Mesh(私有)
- Flash 512Kb Ram64Kb(TLSR8258)
- 1.8V~3.6V
- 5.3mA Rxfullchip;
- 4.8mA Tx 0dbm_fullchip;
- <1uA sleep+sram 0.4uA sleep
- Tx Max +10dBm
- 工作温度-40℃~+85℃(工业级)
架构图
SDK下载
- 这里可以根据实际的应用来选择SDK,bz为了兼容其他相同产品线的方案选择了
Single Connection
的SDK
SDK工程
文件结构
工程导入Eclipse后的文件结构如下
- application:提供了通用的应用处理程序,主要为打印print、USB、按键keyboard、音频audio
- boot:提供芯片的 software bootloader,即 MCU 上电启动或 deepsleep 唤醒后的汇编处理过程,为后面 C 语言程序的运行搭建好环境(中断向量、堆栈配置)
- common:提供通用的跨平台处理,如标准C库的字符串、内存处理函数等
- drivers:提供与MCU外设驱动程序
- proj_lib:内部为泰凌微蓝牙协议栈库文件
liblt_8258.a
包括RF射频、PM低功耗等库,这部分对开发用户不开放 - stack:协议栈相关调用的头文件
- vendor:用于存放用户应用层代码,目前支持应用有:
- 8258_ble_remote:遥控应用,配合IR模块
- 8258_ble_sample:是remote的简化应用,与标准的ios、android连接配对
- 8258_hci:提供了基于USB/UART的HCI,和其他host通信,组成完整的ble slave系统
- 8258_module:蓝牙串口透传模块的应用
- 8258_master_kma_dongle:dongle的应用代码,是 ble master的例程
- 8258_driver_test:外设的测试应用
- 8258_feature_test:蓝牙射频相关的测试应用
实例
代码讲解
主函数
这里使用8258_ble_sample实例,先查看main.c中入口函数
- 变量
deepRetWakeUp
来判断系统是否为休眠唤醒,来实现系统快速初始化 - 中断
irq_enable
使能后协议栈开始运行 user_init_normal
为ble系统初始化
_attribute_ram_code_ int main (void) //让main运行在ram中,加快加载时间
{
DBG_CHN0_LOW; //debug 配合示波器调试使用
blc_pm_select_internal_32k_crystal();//选择内部32k rc时钟
cpu_wakeup_init();//硬件初始化, system timer计数器开始工作
int deepRetWakeUp = pm_is_MCU_deepRetentionWakeup(); //判断唤醒源 1 - deepsleep retention唤醒 0 poweron/deepsleep
rf_drv_init(RF_MODE_BLE_1M);//1M 通信带宽
gpio_init( !deepRetWakeUp ); //快速初始化IO
#if (CLOCK_SYS_CLOCK_HZ == 16000000)//选择系统时钟频率,默认16M
clock_init(SYS_CLK_16M_Crystal);
#elif (CLOCK_SYS_CLOCK_HZ == 24000000)
clock_init(SYS_CLK_24M_Crystal);
#elif (CLOCK_SYS_CLOCK_HZ == 32000000)
clock_init(SYS_CLK_32M_Crystal);
#elif (CLOCK_SYS_CLOCK_HZ == 48000000)
clock_init(SYS_CLK_48M_Crystal);
#endif
if(!deepRetWakeUp){
blc_readFlashSize_autoConfigCustomFlashSector();//读取片上flash配置
}
blc_app_loadCustomizedParameters(); //加载参数
if( deepRetWakeUp ){
user_init_deepRetn (); //休眠唤醒后的快速初始化
}
else{
user_init_normal ();//ble系统初始化
}
irq_enable();//开启中断
while (1) {
#if (MODULE_WATCHDOG_ENABLE)
wd_clear(); //clear watch dog
#endif
main_loop ();//主循环任务,ble收发、低功耗
}
}
蓝牙配置
在app.c文件中主要为gap相关配置
- 修改广播周期
#define MY_APP_ADV_CHANNEL BLT_ENABLE_ADV_ALL//全通道 37 38 39
#define MY_ADV_INTERVAL_MIN ADV_INTERVAL_30MS//30ms
#define MY_ADV_INTERVAL_MAX ADV_INTERVAL_35MS//35ms
- 蓝牙广播:修改广播报文与扫描应答报文
//
// Adv Packet, Response Packet
//
const u8 tbl_advData[] = {
0x05, 0x09, 'k', 'H', 'I', 'D', //广播local name
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)
};
const u8 tbl_scanRsp [] = {
0x08, 0x09, 'k', 'S', 'a', 'm', 'p', 'l', 'e',
};
- 连接参数:修改连接间隔
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;//
interval_update_tick = clock_time() | 1; //none zero
}
- 调整发射功率
#define MY_RF_POWER_INDEX RF_POWER_P3p01dBm
主任务
在main_loop中运行了主要的应用任务
- blt_sdk_main_loop:必须被周期性调用,内部执行了BLE数据解析与逻辑处理
- blt_pm_proc:低功耗处理接口,通过宏
BLE_APP_PM_ENABLE
来配置使能 - blt_pm_proc:蓝牙广播与连接通信时的低功耗,包括超时60sec进入deepsleep,后续在低功耗调试里面展开讲解
void main_loop (void)
{
// BLE entry /
blt_sdk_main_loop(); //ble数据与逻辑处理
// UI entry /
#if (!TEST_CONN_CURRENT_ENABLE) //demo板子上的按键,可在头文件使能
#if (SAMPLE_BOARD_SELECT == EVK_C1T139A30_V1P2)
proc_keyboard (0, 0, 0);//按键处理
#elif (SAMPLE_BOARD_SELECT == DONGLE_C1T139A3_V2P0A)
// process button 1 second later after power on, to avoid power unstable
if(!button_detect_en && clock_time_exceed(0, 1000000)){
button_detect_en = 1;
}
if(button_detect_en && clock_time_exceed(button_detect_tick, 5000))
{
button_detect_tick = clock_time();
proc_button(0, 0, 0);
}
#endif
#endif
// PM Process /
blt_pm_proc(); //pm低功耗,在头文件中配置
}
运行测试
-
在vendor目录下mesh工程进行编译,在8258_ble_sample目录下生成8258_ble_sample.bin的固件,并通过BDT工具烧录固件
-
打开app可以扫描到名称为ksample的设备,其中kHID是广播名称
-
连接后可查看到支持的服务,其中ota是泰凌微私有定义的,所以app显示为未知服务;由于支持了HID的服务,可以使用带蓝牙的PC来连接设备