泰凌微TLSR825X开发十三 蓝牙长包通信
前言
泰凌微TLSR825X是支持BLE5.0的,SDK包含了data length extension数据包扩展功能,数据最大长度251字节,可以提高大数据通信效率。
本章主要讲解下长包的通信交互与配置,深入可参考泰凌微开发手册3.2.8 Data Length Extension
章节
数据包结构
- 在蓝牙规范Core4.2之后,将PDU定义到最大到257字节
代码实例
可以参考例程feature_slave_dle.c
,将长包的配置代码移植到8258_module工程中
修改缓存
收发改为长包的话需要更大的TX/RX FIFO size,在app.c中修改
// support RF RX/TX MAX data Length: 251byte
#define RX_FIFO_SIZE 288 //rx-24 max:251+24 = 275 16 align-> 288
#define RX_FIFO_NUM 8
#define TX_FIFO_SIZE 264 //tx-12 max:251+12 = 263 4 align-> 264
#define TX_FIFO_NUM 8
#define MTU_SIZE_SETTING 247
#define DLE_TX_SUPPORTED_DATA_LEN MAX_OCTETS_DATA_LEN_EXTENSION //264-12 = 252 > Tx max:251
配置蓝牙
- 在函数 void user_init_normal(void) 中增加MTU修改与注册回调
void user_init_normal(void)
{//**省略代码my_att_init(); //GATT initialization//ATT initializationblc_att_setRxMtuSize(MTU_SIZE_SETTING);//默认Rx MTU配置//**省略代码//注册GAP事件回调blc_gap_registerHostEventHandler( app_host_event_callback );blc_gap_setEventMask(GAP_EVT_MASK_ATT_EXCHANGE_MTU);//MTU传输单元回调//ble event call backbls_app_registerEventCallback (BLT_EV_FLAG_CONNECT, &task_connect); //连接回调bls_app_registerEventCallback (BLT_EV_FLAG_TERMINATE, &task_terminate); //断开回调bls_app_registerEventCallback (BLT_EV_FLAG_DATA_LENGTH_EXCHANGE, &task_dle_exchange);//长度交互回调
}
回调修改
_attribute_data_retention_ u32 connect_event_occurTick = 0; //1.5sec
_attribute_data_retention_ u32 mtuExchange_check_tick = 0;//2sec
_attribute_data_retention_ int dle_started_flg = 0; //长度请求标志
_attribute_data_retention_ int mtuExchange_started_flg = 0;//mtu请求标志
_attribute_data_retention_ u16 final_MTU_size = 23;//有效MTU长度记录//连接事件
void task_connect (u8 e, u8 *p, int n)
{printf("----- connected -----\n");connect_event_occurTick = clock_time()|1; //启动计时bls_l2cap_requestConnParamUpdate (8, 8, 19, 200); //interval=10ms latency=19 timeout=2sbls_l2cap_setMinimalUpdateReqSendingTime_after_connCreate(1000);//MTU size reset to default 23 bytes every new connection, it can be only updated by MTU size exchange procedurefinal_MTU_size = 23;//默认23字节
}
//断开事件
void task_terminate (u8 e, u8 *p, int n)
{printf("----- terminate rsn: 0x%x -----\n", *p);//清空计时与标志connect_event_occurTick = 0; mtuExchange_check_tick = 0;//MTU size exchange and data length exchange procedure must be executed on every new connection,//so when connection terminate, relative flags must be cleareddle_started_flg = 0;mtuExchange_started_flg = 0;//MTU size reset to default 23 bytes when connection terminatedfinal_MTU_size = 23;//回退到23字节
}
//长度交互回调
void task_dle_exchange (u8 e, u8 *p, int n)
{ll_data_extension_t* dle_param = (ll_data_extension_t*)p;printf("----- DLE exchange: -----\n");printf("connEffectiveMaxRxOctets: %d\n", dle_param->connEffectiveMaxRxOctets);printf("connEffectiveMaxTxOctets: %d\n", dle_param->connEffectiveMaxTxOctets);printf("connMaxRxOctets: %d\n", dle_param->connMaxRxOctets);printf("connMaxTxOctets: %d\n", dle_param->connMaxTxOctets);printf("connRemoteMaxRxOctets: %d\n", dle_param->connRemoteMaxRxOctets);printf("connRemoteMaxTxOctets: %d\n", dle_param->connRemoteMaxTxOctets);dle_started_flg = 1;
}
//host事件回调
int app_host_event_callback (u32 h, u8 *para, int n)
{u8 event = h & 0xFF;switch(event){case GAP_EVT_ATT_EXCHANGE_MTU:{gap_gatt_mtuSizeExchangeEvt_t *pEvt = (gap_gatt_mtuSizeExchangeEvt_t *)para;printf("MTU Peer MTU(%d)/Effect ATT MTU(%d).\n", pEvt->peer_MTU, pEvt->effective_MTU);final_MTU_size = pEvt->effective_MTU;//更新MTU size(取两者之间最小的MTU)mtuExchange_started_flg = 1; //MTU交互标志,启动mtu交互}break;default:break;}return 0;
}
slave主动请求长度扩展
void feature_sdle_test_mainloop(void)
{if(connect_event_occurTick && clock_time_exceed(connect_event_occurTick, 1500000)){ //建立连接1.5 S 后connect_event_occurTick = 0;mtuExchange_check_tick = clock_time() | 1;if(!mtuExchange_started_flg){ //slave主动发起 master do not send MTU exchange request in timeblc_att_requestMtuSizeExchange(BLS_CONN_HANDLE, MTU_SIZE_SETTING); //请求最大MTU(L2CAP)printf("After conn 1.5s, S send MTU size req to the Master.\n");}}if(mtuExchange_check_tick && clock_time_exceed(mtuExchange_check_tick, 500000 )){ //建立连接2 S mtuExchange_check_tick = 0;if(!dle_started_flg){ //slave主动发起 master do not send data length request in timeprintf("Master hasn't initiated the DLE yet, S send DLE req to the Master.\n");blc_ll_exchangeDataLength(LL_LENGTH_REQ , DLE_TX_SUPPORTED_DATA_LEN);//请求长度,发送最大包长(Link layer)}}
}
例程流程讲解
在蓝牙连接成功后,slave判断主机Host是否主动发起长包的请求,1.5sec主机未发起,则从机主动发起MTU流程,2sec后发起长度变更流程;数据请求完成后即可发起长度数据通信
数据包抓取
数据通信
泰凌微TLSR825X开发十三 蓝牙长包通信相关推荐
- 泰凌微TLSR825X开发一蓝牙通信实例
背景 泰凌微蓝牙方案在消费类产品中近两年才火起来,实际网上也没有太多资料,芯片缺货的情况下作为替代方案还是可行的,手上有块TLSR8258的开发板,也就边看文档调试边记录 这里采用8258的方案在调, ...
- 泰凌微TLSR825X开发六 片上flash擦写
前言 TLSR8258片上flash容量有512K,对于一般的应用已经绰绰有余了,程序未使用到的部分可以用来做数据掉电存储 如有异议,欢迎留言指正 特性 扇区擦除4kB 块擦除支持32kB/64kB ...
- 泰凌微TLSR825X开发八 OTA升级
前言 泰凌微的SDK中已经实现了OTA功能,具体的处理已经被封装到库中,开发可以在不修改代码的情况下通过官方的APP来完成升级功能 如有异议,欢迎留言指正 MCU地址划分 从0~0x7FFFFF的8M ...
- 泰凌微TLSR825X开发五 硬件IIC
前言 TLSR8258支持硬件I2C串行总线,可作为主模式(master)和从属模式(slave) 泰凌微I2C模块支持标准模式100kbps和快速模式400kbps,但必须保证系统时钟频率是通信速率 ...
- 泰凌微TLSR825X:定时器以及中断
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.TLSR825X的定时器有什么? 二.使用步骤 1.定时器的初始化 2.定时器中断中对不同的定时器进行功能操作 总 ...
- 泰凌微ble mesh蓝牙模组天猫精灵学习之旅③简单入门安信可TB-02开发开发板轻松接入天猫精灵,语音控制冷暖灯so easy!
本<泰凌微ble mesh蓝牙模组天猫精灵学习之旅>系列博客学习由半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1.小白也痴迷,如 ...
- TB-02 Kit开发板及TB系列BLE蓝牙模块固件及天猫精灵三元组串口烧录工具操作方法说明及固件市场介绍(基于泰凌微TLSR8258芯片)
摘要 这篇文章介绍如何通过烧录工具给TB系列蓝牙模块烧录固件及天猫精灵三元组,以及如何通过烧录工具的固件市场下载最新的固件及固件操作说明文档. 获取烧录工具 安信可团队针对TB系列蓝牙模块专门开发了烧 ...
- 泰凌微ble mesh蓝牙模组天猫精灵学习之旅④如何在Android开发低功耗蓝牙ble控制 TB-02 模块,代码工程全部开源!(附带Demo)
本<泰凌微ble mesh蓝牙模组天猫精灵学习之旅>系列博客学习由半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1.小白也痴迷,如 ...
- [Telink泰凌微825x]硬件开发环境搭建(一)
使用安信可TB04模块搭建泰凌微官方SDK开发环境 文章目录 目录 前言 一.模块的选择 二.原理图说明 1.原理图 2.原理图说明 3.GERBER文件下载 总结 前言 最近需要用到蓝牙mesh组网 ...
最新文章
- CIO职业生涯如何进行三级跳
- java 设置日期的格式_java时间格式大全
- 在github中使用pages上传自己的网页
- 前端学习(1409):多人管理29安装json转换工具
- Android学习问题:关于AlertDialog中自定义布局带有的EditText无法弹出键盘
- Apache Flink 在汽车之家的应用与实践
- 基于大中台小前台模式设计高并发电商架构
- cv_bridge 调用ros自带的opencv版本的解决
- 江苏计算机二级vb,江苏省计算机等级考试二级vb.ppt
- 超实用的JavaScript技巧及最佳实践(下)
- zTree 树形中的搜索定位节点
- win10共享打印机搜索不到计算机,大师告诉您Win10搜不到共享打印机的操作方案...
- css 1倍图 2倍图 3倍图
- 【GPL和LGPL】【VPlayer不开源】【其他开源的基本都仅是ffmpeg修改部分】
- 【Unity3D日常开发】应粉丝邀约,写一篇单例模式在Unity的实际应用,记得一键三连哦
- agc024F Simple Subsequence Problem
- Cadence的版图绘制、DRC、LVS、PEX-以反相器为例
- 工作居住证离职后应对
- 致远SPM解决方案之资产管理
- 石子合并——最经典的dp问题
热门文章
- snipaste滚动截图方法
- fps Ragdoll 的设置与用法
- Java8中的LocalDateTime获取当天的开始和结束时间
- 多目标粒子群算法(MOPSO)的原理和matlab实现
- 数据库有哪些常见的对象?
- python接口自动化(十七) requests获取响应时间(elapsed)与超时(timeout)
- 英文网站的优化设计应该考虑哪些
- 2018云和恩墨大讲堂石家庄站成功举办
- 等待着融博的offer
- oss 部署前端项目报错 Cannot find module ‘@/views/.....‘(require和import区别)