ST17H66低功耗蓝牙SOC开发(8)—— proprietary_rf工程讲解
ST17H66 Proprietary_Rf 工程说明
A. Smart_Master 发送端
- 数据包结构解析
类型 | Adv_Type | PDU_LEN | MAC_Host | Adv_Segment0 | Adv_Segment1 | Net_WorkID | Segment_Num | Payload |
---|---|---|---|---|---|---|---|---|
长度(Byte) | 1 | 1 | 6 | 3 | 2 | 4 | 2 | 自定义长度 |
说明:
- PDU_LEN 为 MAC_Host 到 Payload 的长度;
- pack_len = PDU_LEN + 2;
- pack_len 最大值为 RF_PKT_MAX_LEN(256);
static void smart_rf_data_init(void)
{uint8_t adv_buffer[32];adv_buffer[0] = 0x02;adv_buffer[1] = 0x01;adv_buffer[2] = 0x06;adv_buffer[3] = 0x1B;adv_buffer[4] = 0xFF;adv_buffer[5] = 0x04;adv_buffer[6] = 0x05;adv_buffer[7] = 0x01;adv_buffer[8] = 0x02;adv_buffer[9] = 0x03;adv_buffer[10] = 0xcc; //adv_buffer[11] = 0x00; //adv_buffer[12] = 0x03; //adv_buffer[13] = 0xaa; //adv_buffer[14] = 0x00; //adv_buffer[15] = 0x93; //adv_buffer[16] = 0xaa; //adv_buffer[17] = 0x67; //adv_buffer[18] = 0xF7;adv_buffer[19] = 0xDB;adv_buffer[20] = 0x34;adv_buffer[21] = 0xC4;adv_buffer[22] = 0x03;adv_buffer[23] = 0x8E;adv_buffer[24] = 0x5C;adv_buffer[25] = 0x0B;adv_buffer[26] = 0xAA;adv_buffer[27] = user_data_seq;adv_buffer[28] = user_data_seq >> 8;adv_buffer[29] = user_data_seq >> 16;adv_buffer[30] = user_data_seq >> 24;uint8_t advHead[2] = {0x00, (31 + 6)};//tx buf date updateosal_memcpy(&(phyBufTx[0]), &(advHead[0]), 2); //copy tx headerosal_memcpy(&(phyBufTx[2]), &(s_pubAddr[0]), 6); //copy AdvAosal_memcpy(&(phyBufTx[8]), &(adv_buffer[0]), 31); //copy payload
...
}
以上就是SDK中初始化发送包数据格式,phyBufTx[]为RF发射数据缓存,发送的数据需要更新在缓存等待RF发送。
//phy pktfmt configs_phy.Status = RF_RFPHY_IDLE;s_phy.txIntv = 50; //mss_phy.rxIntv = 200; //mss_phy.rxOnlyTO = 10 * 1000; //uss_phy.rfChn = BLE_ADV_CHN37; //26;//s_pktCfg.pktFmt = RF_PKT_FMT_1M;s_pktCfg.pduLen = 31 + 6;s_pktCfg.crcFmt = LL_HW_CRC_BLE_FMT; //LL_HW_CRC_BLE_FMT;LL_HW_CRC_NULLs_pktCfg.crcSeed = DEFAULT_CRC_SEED;s_pktCfg.wtSeed = WHITEN_SEED_CH37; //DEFAULT_WHITEN_SEED;s_pktCfg.syncWord = DEFAULT_SYNCWORD;VOID osal_start_timerEx(PhyRf_TaskID, PPP_PERIODIC_TX_EVT, 1000);
初始化发送的时间间隔,s_phy.txIntv = 50;
初始化发送的数据长度,s_pktCfg.pduLen = 31 + 6;
VOID osal_start_timerEx(PhyRf_TaskID, PPP_PERIODIC_TX_EVT, 1000);开始发送数据;
- 数据发送
static void process_tx_done_evt(void)
{/**37->38->39 adv channel*/uint8 last_index = 0;last_index = user_get_chn_index(s_phy.rfChn);if (last_index < (USER_MAX_CHN_NUMBER - 1)){s_phy.rfChn = User_chanel_Map[last_index + 1][0];s_pktCfg.wtSeed = User_chanel_Map[last_index + 1][1];phy_rf_tx();}else if (last_index == (USER_MAX_CHN_NUMBER - 1)){user_reTx_number++;if (user_reTx_number >= Max_ReTxNumber){user_reTx_number = 0;osal_start_timerEx(PhyRf_TaskID, PPP_PERIODIC_TX_EVT, s_phy.txIntv);s_phy.Status = RF_RFPHY_IDLE;user_update_tx_sequnce();LOG("--next_seq=%d\n\r", user_data_seq);}else{s_phy.rfChn = User_chanel_Map[0][0];s_pktCfg.wtSeed = User_chanel_Map[0][1];phy_rf_tx();}}else{LOG("channel error!!\n\r");s_phy.Status = RF_RFPHY_IDLE;}
}
以上为Rf发送数据的发送流程,每一包数据在一个发送间隔中在3个通道循环发送5组。
void user_update_tx_sequnce(void)
{user_data_seq++;if (user_data_seq > 65535)user_data_seq = 0;SmartRf_Tx_DataBuf.Adv_Seq[0] = user_data_seq;SmartRf_Tx_DataBuf.Adv_Seq[1] = user_data_seq >> 8;osal_memcpy(&(phyBufTx[0]), &SmartRf_Tx_DataBuf, SmartRf_Tx_DataBuf.PduLen + 2);
}
以上为每一包数据发送完后,数据包的数据更新;
B.Smart_Slave 接收端
- 初始化接收
s_phy.Status = RF_RFPHY_IDLE;s_phy.txIntv = 40; //mss_phy.rxIntv = 10; //mss_phy.rxOnlyTO = 10 * 1000; //uss_phy.rfChn = BLE_ADV_CHN37; //26;//s_pktCfg.pktFmt = RF_PKT_FMT_1M;s_pktCfg.pduLen = 31 + 6;s_pktCfg.crcFmt = LL_HW_CRC_BLE_FMT; //LL_HW_CRC_BLE_FMT;LL_HW_CRC_NULLs_pktCfg.crcSeed = DEFAULT_CRC_SEED;s_pktCfg.wtSeed = WHITEN_SEED_CH37; //DEFAULT_WHITEN_SEED;s_pktCfg.syncWord = DEFAULT_SYNCWORD;VOID osal_start_timerEx(PhyRf_TaskID, PPP_PERIODIC_RX_EVT, 2500);
初始化接收间隔,s_phy.rxIntv = 10;
初始化接收长度,s_pktCfg.pduLen = 31 + 6;
VOID osal_start_timerEx(PhyRf_TaskID, PPP_PERIODIC_RX_EVT, 2500);开始接收数据
- 接收中断,消息传递
static void phy_rx_data_reportCB(void)
{if (s_taskIdRxCb == NULL)return;ppp_rxPktReport_t *pkt;uint8_t pduLen = phyBufRx[1] + 2;pkt = (ppp_rxPktReport_t *)osal_msg_allocate(sizeof(ppp_rxPktReport_t) + pduLen);uint8_t *p = osal_mem_alloc(pduLen);if (pkt != NULL && p != NULL){pkt->hdr.event = PPP_MSG_DATA_REPORT;pkt->hdr.status = 0xff;pkt->dlen = pduLen;osal_memcpy(p, phyBufRx, pduLen);pkt->pData = p;pkt->rfChn = s_phy.rfChn;pkt->rssi = phyRssi;pkt->carrSens = phyCarrSens;pkt->foff = phyFoff;(void)osal_msg_send(s_taskIdRxCb, (uint8 *)pkt);}
}static void appProcessOSALMsg(osal_event_hdr_t *pMsg)
{switch (pMsg->event){case PPP_MSG_DATA_REPORT:appProcessRxData(((ppp_rxPktReport_t *)pMsg));break;default:// Unknown message - drop it.break;}
}
以上将接收到的数据传递到应用层进行处理。
- 应用处理
static void appProcessRxData(ppp_rxPktReport_t *pMsg)
{uint8_t pduLen = pMsg->dlen;if (SmartRF_Device.device_mode == UN_PAIRING_MODE){}else if (SmartRF_Device.device_mode == EN_PAIRED_MODE){}osal_mem_free(pMsg->pData);
}
在应用层将设备分为绑定和未绑定两种状态:设备上电为未绑定状态,将设备靠近发射端,信号强度RSSI值满足筛选条件将设备设置为绑定状态。
接收的数据将会按格式打印。
ST17H66低功耗蓝牙SOC开发(8)—— proprietary_rf工程讲解相关推荐
- ST17H66低功耗蓝牙SOC开发(7)—— simpleBleCentral工程讲解(下)
2.连接过程 2.1 初始化 对主机各个参数进行初始化后,注册simpleBLERoleCB回调,simpleBLERoleCB里面的simpleBLECentralEventCB是设备的事件回调,初 ...
- ST17H66 低功耗蓝牙SOC开发(1)—— SDK介绍
目录 1.资料获取 2.开发环境 3.ST17H66开发SDK获取 4.SDK介绍 4.1 components 4.2 example 4.3 lib 4.4 misc 1.资料获取 伦茨17Hxx ...
- ST17H66 低功耗蓝牙SOC开发(3)—— OSAL系统简介
ST17H66的SDK是基于OSAL系统运行,在开发过程中,不需要对OSAL系统做过多深入了解,只需要知道运行机制和相关API的使用即可,下面介绍一下OSAL系统. 1.OSAL常用术语 (1)资源( ...
- Android低功耗蓝牙(BLE)开发(二)
在上一篇文章Android低功耗蓝牙(BLE)开发(一)中我们了解了BLE的相关概念,这里我们来实际用代码演示安卓进行BLE连接和通讯的功能.本文代码基于Android5.0以上(API 21) 1. ...
- 微信小程序低功耗蓝牙(BLE)开发总结
1.准备 低功耗蓝牙模块:(链接)蓝牙模块购买通道 相关参数数据(UUID表): 需要知道服务ID(serviceID) ,响应特征值 ID(notify characteristic UUID),写 ...
- 经典蓝牙与低功耗蓝牙BLE开发基础知识:服务、特征、属性、UUID
经典蓝牙和低功耗蓝牙BLE的区别 蓝牙大致被认为是1.0 2.0 3.0 4.0版本,不过现在已经不再用版本号区分蓝牙了,蓝牙1.0~3.0都是经典蓝牙,在塞班系统就已经开始使用了.而蓝牙4.0开始就 ...
- nRF52832低功耗蓝牙应用开发之入门教程
nRF52382是挪威的nordic北欧公司推出的一款低功耗蓝牙芯片,该芯片集成多种协议栈,包括蓝牙5.0..2.4G专有协议栈,支持蓝牙mesh组网,空中波特率达到2Mbps,M4内核,主频达到64 ...
- 好书推荐:21天入门 低功耗蓝牙5.x开发
低功耗蓝牙5 及其后续版本围绕物联网创新应用而不断更新迭代,如何高效的学习低功耗蓝牙5 相关知识,并通过实践来掌握其开发方法,是广大学子和开发人员非常感兴趣的内容.作为低功耗蓝牙技术在国内最早推广及应 ...
- Android ble covana,Android BLE低功耗蓝牙开发
最近做了一个智能硬件开发(针灸仪)的项目,有一部分涉及到低功耗蓝牙的开发,就是通过蓝牙和设备进行数据的交互,比如控制改设备的LED的开关,设备的开关机,设置设备的时间和温度等,下面就项目中遇到的坑一一 ...
最新文章
- 莱芜市公安局交警支队智能交通项目集成及容灾公开招标公告
- 基于PU-Learning的恶意URL检测——半监督学习的思路来进行正例和无标记样本学习...
- Nature:揭示人大脑类器官为何缺乏正常人脑特有的细胞亚型和复杂回路
- 机房冷热通道系统整体解决方案
- python计算汉明距离_有效地使用python计算汉明距离
- C# Select SelectMany 区别
- mysql 命令 示例,mysql语句大全
- java访问oracle集群,JAVA查询Oracle数据库集群连接字符串
- python delete_rows,Python:如何刪除以特定字符結尾的行?
- JSP如何获取Spring Boot的配置属性
- LeetCode(804)——唯一摩尔斯密码词(JavaScript)
- 关于iOS 6 中的一些“xxxxxx” is deprecated 问题的解决办法
- JQuery iframe页面通过parent方法操作父页面中的元素与方法(实例讲解)
- 阿里巴巴Java开发手册(华山版)
- java算法——哈希表 电话号码查询系统
- [笔记]PLC可程式模拟器1
- linux 设置网卡mac地址命令,linux/Centos下查看和修改网卡Mac地址(ifconfig命令)
- 纵横算法之二:社招如何面对算法面试
- 被晨光搁浅的誓言无声
- 国产linux操作系统深度系统20.3发布(推荐)
热门文章
- 关于研发效能提升的思考
- 系统学习车载仿真测试HiL,成为HiL测试工程师
- ERP服务器端安装及配置
- nginx三种发行版本的选择
- 计算机方向的综述投稿哪个期刊,COMPUTER
- python 依据某几列累加求和_Python数据分析(2)-pandas versus excel
- 21世纪,计算机的普及与互联网的发展,推进服装企业信息化时代
- 基于钻孔数据的地质体建模
- 丰田pcwin是什么软件_Windows有哪些软件建议不要安装?
- 内蒙古大学计算机科学与技术专业怎么样,内蒙古大学计算机科学与技术怎么样...