当前位置: 首页 > 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.rkmt.cn/news/187535.html

相关文章:

  • 2025年中山市专业办公楼装修公司可靠性评测报告 - 优质品牌商家
  • 博客标题优化:提高TensorFlow文章点击率的10个模板
  • 主构造函数到底多强大,C#开发者为何都在悄悄使用?
  • 前端+AI:抓住技术变革机遇,重塑职业价值,建议收藏细读
  • Windows下配置TensorFlow 2.9 GPU镜像的详细步骤
  • 告别传统全栈:大模型浪潮下,能驾驭“人机协同”的新物种工程师已诞生!
  • 【强烈收藏】上下文工程六大组件:构建高效大模型系统的核心指南
  • bell fubini numbers O(n) 求法
  • spr墓园墓地祭扫管理系统vue
  • 收藏!后端研发的AI突围:保险业务RAG架构全解析(从基础到混合式演进)
  • 揭秘C++高性能碰撞检测:如何用契约编程避免常见陷阱
  • transformer模型详解之损失函数选择建议
  • 构建个性化AI开发环境:基于TensorFlow镜像二次封装
  • 中山工装公司推荐2025办公酒店批量精装场景优选 - 优质品牌商家
  • 参考文献在哪里找:实用查找方法与资源推荐
  • 2025仿木纹铝单板源头工厂TOP5推荐:口碑供应商深度测评 - 工业推荐榜
  • 一天一个Python库:Pandas - 拿捏数据的N种姿势
  • lora25-lora26跨年收发测试
  • Conda update更新TensorFlow-v2.9到最新补丁版本
  • Git Log高级用法追踪TensorFlow项目演变
  • 自动化脚本批量启动TensorFlow-v2.9容器实例
  • 销售都在偷偷用的工具?天下工厂查询能力大揭秘
  • 2025年水泥行业需切割加工耐磨钢板评测报告 - 优质品牌商家
  • 解决罗德与施瓦茨MXO44示波器新探头量程不匹配的实用指南
  • 【收藏级】大模型从入门到实战全解析:小白程序员必看的技术体系与学习指南
  • 手把手教你用C++打造低延迟分布式AI推理系统:任务调度不再是难题
  • Rust如何安全暴露API给C++?(基于cxx-qt的最佳实践全披露)
  • 如何在Linux系统中通过Docker运行TensorFlow镜像
  • 2025年口碑好的名贵奢侈品回收店推荐,温州乐清专业奢侈品回收联系方式全解析 - mypinpai
  • 孤能子视角:“融智学“理论分析,观点碰撞