当前位置: 首页 > news >正文

CH5xx RF_PHY_HOP 例程讲解

在EVT的BLE目录下提供了 RF_PHY_HOP 例程,下面来讲述下该例程的运行逻辑:

一.进行RF相关配置的初始化:

void RF_Init(void)
{uint8_t    state;rfConfig_t rfConfig;tmos_memset(&rfConfig, 0, sizeof(rfConfig_t));             // 将 rfConfig 数据清 0taskID = TMOS_ProcessEventRegister(RF_ProcessEvent);//例程默认的接入地址是一个公共的测试地址,使用此地址可能会出现 CRC 错误较多,建议修改接入地址,如0x71764129修改为0x71764124rfConfig.accessAddress = 0x71764129;                       // 禁止使用0x55555555 以及 0xAAAAAAAA ( 建议不超过24次位反转,且不超过连续的6个0或1 )rfConfig.CRCInit = 0x555555;                               // 设置 CRC 初始值rfConfig.Channel = 0;                                      // 默认例程未配置此项,此项为跳频前握手的信道,使用别的信道可以自行配置rfConfig.ChannelMap = 0xFFFFFFFF;                          // 设置跳频信道rfConfig.LLEMode = LLE_MODE_AUTO;                          // 跳频模式必须使用 Auto 模式否则无法通通讯rfConfig.rfStatusCB = RF_2G4StatusCallBack;                // 注册 RF 回调用于获取 RF 状态rfConfig.RxMaxlen = 251;                                   // 设置接收数据最大长度
#if (CLK_OSC32K != 0)                                          // 如果使用的是内部低频,建议将心跳间隔设置小一点,如4//It is better to choose a shorter heartbeat interval for the internal clock.rfConfig.HeartPeriod = 4;
#endifstate = RF_Config(&rfConfig);PRINT("rf 2.4g init: %x\n", state);                        // RF初始化结果,0为成功
//    { // RX mode                                         
//        PRINT("RX mode...\n");
//        tmos_set_event(taskID, SBP_RF_CHANNEL_HOP_RX_EVT);   // 设置 RF 状态为接收,开启接收(执行此任务是还未跳频,只是在握手阶段)
//    }RF_Wait_Rx_End();{ // TX modePRINT("TX mode...\n");                              tmos_set_event(taskID, SBP_RF_CHANNEL_HOP_TX_EVT);     //设置 RF 状态为发送,开启发送(执行此任务是还未跳频,只是在握手阶段)}
}

 二.发送端握手阶段

    // 开启发送握手包if(events & SBP_RF_CHANNEL_HOP_TX_EVT){PRINT("\n------------- hop tx...\n");if(RF_FrequencyHoppingTx(16))                                         //发送握手包,一次发送16包{tmos_start_task(taskID, SBP_RF_CHANNEL_HOP_TX_EVT, 100);          //握手失败,62.5ms后再次发送握手包}else{tmos_start_task(taskID, SBP_RF_PERIODIC_EVT, 1000);               //握手成功,625ms后开始跳频发送}return events ^ SBP_RF_CHANNEL_HOP_TX_EVT;}

三.接收握手包阶段

    // 开启接收握手包if(events & SBP_RF_CHANNEL_HOP_RX_EVT){PRINT("hop rx...\n");if(RF_FrequencyHoppingRx(200))                                    //开始接收握手包,200ms超时{tmos_start_task(taskID, SBP_RF_CHANNEL_HOP_RX_EVT, 400);      //未收到握手包,250ms后再次开启接收}else{rx_end_flag = FALSE;RF_Rx(TX_DATA, 10, 0xFF, 0xFF);                               //握手成功,开启 RF 跳频接收}return events ^ SBP_RF_CHANNEL_HOP_RX_EVT;}

 四.发送端发送数据填充

    if(events & SBP_RF_PERIODIC_EVT){RF_Shut();                                            //调用模式前先 SHUTTX_DATA[0]--;                                         //将发送数据的首字节-1tx_end_flag = FALSE;if(!RF_Tx(TX_DATA, 10, 0xFF, 0xFF))                   //发送10字节数据{RF_Wait_Tx_End();}tmos_start_task(taskID, SBP_RF_PERIODIC_EVT, 1000);   //625ms后再次发送return events ^ SBP_RF_PERIODIC_EVT;}

五.接收端 ack 数据填充

    if(events & SBP_RF_RF_RX_EVT){uint8_t state;RF_Shut();                                        //在调用模式前先 SHUTTX_DATA[0]++;                                     //将回复的ack数据首字节+1rx_end_flag = FALSE;state = RF_Rx(TX_DATA, 10, 0xFF, 0xFF);           //配置成接收状态并填充回复的ack数据return events ^ SBP_RF_RF_RX_EVT;}

六.回调函数获取数据

void RF_2G4StatusCallBack(uint8_t sta, uint8_t crc, uint8_t *rxBuf)
{switch(sta){case TX_MODE_TX_FINISH:                                        //发送完成{break;}case TX_MODE_TX_FAIL:                                          //发送失败{tx_end_flag = TRUE;break;}case TX_MODE_RX_DATA:                                          //发送端收到ack数据{tx_end_flag = TRUE;if (crc == 0) {uint8_t i;PRINT("tx recv,rssi:%d\n", (int8_t)rxBuf[0]);PRINT("len:%d-", rxBuf[1]);for (i = 0; i < rxBuf[1]; i++) {PRINT("%x ", rxBuf[i + 2]);}PRINT("\n");} else {if (crc & (1<<0)) {PRINT("crc error\n");}if (crc & (1<<1)) {PRINT("match type error\n");}}break;}case TX_MODE_RX_TIMEOUT: // Timeout is about 200us               //发送端接收超时{tx_end_flag = TRUE;break;}case TX_MODE_HOP_SHUT:                                           //发送端 HOP 跳频断开{tx_end_flag = TRUE;PRINT("TX_MODE_HOP_SHUT...\n");tmos_set_event(taskID, SBP_RF_CHANNEL_HOP_TX_EVT);           //重新开始发送握手包break;}case RX_MODE_RX_DATA:                                            //接收端接收的数据{if (crc == 0) {uint8_t i;RF_Wait_Rx_End();PRINT("rx recv, rssi: %d\n", (int8_t)rxBuf[0]);PRINT("len:%d-", rxBuf[1]);for (i = 0; i < rxBuf[1]; i++) {PRINT("%x ", rxBuf[i + 2]);}PRINT("\n");} else {if (crc & (1<<0)) {PRINT("crc error\n");}if (crc & (1<<1)) {PRINT("match type error\n");}}tmos_set_event(taskID, SBP_RF_RF_RX_EVT);                     //接收到数据后再次开启接收break;}case RX_MODE_TX_FINISH:                                           //接收端回复ack结束{rx_end_flag = TRUE;break;}case RX_MODE_TX_FAIL:                                             //接收端回复ack失败{rx_end_flag = TRUE;break;}case RX_MODE_HOP_SHUT:                                            //接收端 HOP 跳频断开{PRINT("RX_MODE_HOP_SHUT...\n");rx_end_flag = TRUE;tmos_set_event(taskID, SBP_RF_CHANNEL_HOP_RX_EVT);            //开启接收握手包break;}}
}

七.开发注意点:

1.RF跳频例程和蓝牙主从通信类似,默认是开启配对绑定的,如A和B建立跳频通信后会存在对方的mac地址,此时若有另一对C和D是不可以和A和B之间通信的,将配对绑定信息删除后可以进行通信,只要有一方没有配对绑定信息即可。

若不想配对绑定可以通过此宏配置:#ifndef BLE_SNV
#define BLE_SNV                             TRUE   //TRUE开启,FALSE关闭
#endif

删除配对绑定接口:RF_BondingErase();

http://www.jsqmd.com/news/171715/

相关文章:

  • C++异步网络编程实战,揭开百万QPS系统背后的重构秘密
  • 基于Spring Cloud的在线咖啡奶茶在线点单平台商城vue
  • JAVA赋能:宠物自助洗澡共享物联网新篇
  • 【C++高并发系统设计必修课】:从内存泄漏到状态一致性的全面掌控
  • 2025年中山市专业办公楼装修公司可靠性评测报告 - 优质品牌商家
  • 主构造函数到底多强大,C#开发者为何都在悄悄使用?
  • 寻找旋转排序数组中的最小值-二分
  • 博客标题优化:提高TensorFlow文章点击率的10个模板
  • 2025年口碑爆棚的学历提升机构大盘点:备考避坑指南与优质机构推荐 - 品牌测评鉴赏家
  • 前端+AI:抓住技术变革机遇,重塑职业价值,建议收藏细读
  • 原子操作与锁机制选型难题,如何正确管理多线程资源?
  • Windows下配置TensorFlow 2.9 GPU镜像的详细步骤
  • bell fubini numbers O(n) 求法
  • 告别传统全栈:大模型浪潮下,能驾驭“人机协同”的新物种工程师已诞生!
  • 【强烈收藏】上下文工程六大组件:构建高效大模型系统的核心指南
  • 2025年质量好的净化车间净化板12家厂家评测报告 - 优质品牌商家
  • spr墓园墓地祭扫管理系统vue
  • 【C# 12主构造函数深度解析】:掌握简化编程的终极利器
  • 2025年正规保安服优质供应商推荐榜:保安制服、保安服、保安服装、全棉工作服、制服大衣、厨师工作服、夏季工作服选择指南 - 优质品牌商家
  • 收藏!后端研发的AI突围:保险业务RAG架构全解析(从基础到混合式演进)
  • vue基于web的篮球NBA球星勒布朗詹姆斯球员生涯网站laravel
  • 2025年中山房企批量精装修工程交付能力评测报告 - 优质品牌商家
  • 2026执业药师考试培训哪家通过率高?这三家高性价比机构帮你划重点 - 品牌测评鉴赏家
  • 中山工装公司推荐2025办公酒店批量精装场景优选 - 优质品牌商家
  • 2025国内学历提升机构口碑排行榜:这些靠谱机构助你实现学历跃升 - 品牌测评鉴赏家
  • 涂布机选购指南:靠谱品牌与高性价比是关键 - myqiye
  • 参考文献在哪里找:实用查找方法与资源推荐
  • 2025仿木纹铝单板源头工厂TOP5推荐:口碑供应商深度测评 - 工业推荐榜
  • 2025执业药师考试培训前十机构测评:通关攻略与避坑指南 - 品牌测评鉴赏家
  • 一天一个Python库:Pandas - 拿捏数据的N种姿势