资讯动态

沁恒 RISC-V 蓝牙 2.4G RF_PHY 示例说明

发布时间:2026/9/2 21:50:43 来源:尧图企业网站定制
说明一下沁恒 2.4G RF_PHY 示例 ...... 矜辰所致前言在之前我们了解了 蓝牙与 2.4G 的关系 以及学习了沁恒 RISC-V 蓝牙芯片 2.4G 的基础应用在官方的 EVT 例程里面还提供了一个名为 RF_PHY 的例程官方取名为非标准无线收发例程 。本文我们主要就是来了解一下这个 RF_PHY 例程以及它的一些实际应用。沁恒 RISC-V 蓝牙 入门教程专栏目录【导航】沁恒 RISC-V 蓝牙 入门教程目录 【快速跳转】相关博文沁恒 RISC-V 蓝牙芯片 2.4G 基础示例说明.我是矜辰所致全网同名尽量用心写好每一系列文章不浮夸不将就认真对待学知识的我们矜辰所致金石为开目录前言一、与 RF_Basic 区别二、示例测试说明三、使用说明3.1 RF_PHY 使用流程3.2 示例逻辑说明3.3 参数配置3.4 包格式 / 收发函数说明3.5 说明事项四、常见应用4.1模拟蓝牙广播4.2 接收蓝牙广播4.3 低功耗应用结语一、与 RF_Basic 区别我们之前的讲过 RF_Basic 例程它是 2.4G 基础模式自由度更高想怎么发发什么怎么接收收不收都可以自由控制方便用户自行实现各种扩展应用。本文要讲的 RF_PHY 也是一种 2.4G 收发示例可以理解为是沁恒自己实现的一套建议的 2.4G 协议提供底层数据发送接口函数及对收发控制的配置 。都是 2.4G 例程实际使用中如何选择例程实际使用中需要根据自己的需求选择用哪个例程RF_PHY 作为沁恒提供的私有协议例程代码框架和 Ble 应用框架一致使用 TMOS 管理如果熟悉了沁恒 Ble 蓝牙的开发可以很方便的实现应用逻辑以及低功耗管理同时也可以和 Ble 同时存在分时复用。 而且官方还提供了可跳频收发的 RF_PHY_Hop 例程。如果 RF_PHY 无法满足应用需求可以选择自由度更高的 RF_Basic 进行自主开发当然自由度高意味着需要自己实现的东西更多大家自己衡量。二、示例测试说明示例测试相对来说是简单的因为是现成的代码但是我们依然可以通过 BLE 分析仪抓 2.4G 的包让我们更快的理解如何应用同时博主会进行一些简单的修改让大家更加理解这个流程。示例如下本文以 CH592 为例CH58x 是一样的:与之前的基础示例一样示例是接收端和发送端一体的通过注释下面代码切换我们在原始示例上不做修改编译烧录就是发送端我们如果通过串口助手观察它只会停留在开头的打印但实际上它还是在周期的发送数据我们通过 BLE 分析仪可以抓到发送端的数据包分析仪设置如下分析仪设置参考示例中的配置可参考《 沁恒 RISC-V 蓝牙芯片 2.4G 基础示例说明》 一文通过看图很好理解我们有一个发送端在我们设置的频点周期发送我们设置的数据。这里还可以给大家说明一下示例中有一个宏定义 #defineRF_AUTO_MODE_EXAM1示例中通过这个宏定义为 0 或者 非 0可以切换设备的工作模式基础模式发完不需要接收 ACK 发完就可以休眠不保证对面能不能收到。自动模式发送完需要接收 ACK 响应自动模式下的发送端发完会自动进入接收模式去接收 接收端收到数据以后返回的 ACK 报文。自动模式下的接收端接收完以后会切到发送模式返回 ACK 。更详细的说明会在下面一个章节 使用说明 里面描述我们观察到默认为自动模式的所以我们发送端应该是每次发送完数据以后会去接收数据但是目前我们并没有接收端设备会在回调函数RF_2G4StatusCallBack中进入TX_MODE_RX_TIMEOUT状态我们可以在这里做个简单的测试这样的话没有接收端我们应该可以看到我们发射端周期打印 test 数据如下图所示刚才的是额外的测试我们再用一个设备把代码里面 TX mode 部分注销掉 RX mode 部分放出来烧录以后两个设备一起观察同时我们的 BLE 分析仪也可以抓到 ACK 消息上面就是示例使用自动模式收发的效果展示如果了解了自动模式基础模式就太简单了这里不多余测试下面我们就来说说收发函数的使用相关以及示例的一个逻辑流程。三、使用说明基于 RF_PHY 示例介绍一下 2.4G 私有协议的使用步骤以及一些注意事项。3.1 RF_PHY 使用流程要使用 RF_PHY 首先在初始化的时候需要调用RF_RoleInit()CH59x_BLEInit();HAL_Init();RF_RoleInit();然后就是RF_Config配置配置根据示例来进行即可下文也会有详细说明。RF_Config(rf_Config);配置完成以后就可以根据自己的应用逻辑进行收发。发送/接收端 完成/失败/超时等状态都会返回到回调函数后续操作都可以在回调函数中处理但是需要注意回调函数为中断回调需要快进快出不要在这个回调函数中调用 RF 接收或者发送 API 可以参考示例修改标志位使用 TMOS 事件方式调用自己需要的操作。TMOS 的使用请参考博主之前的博文沁恒微 蓝牙 芯片 TMOS 使用回调函数在初始化的时候注册rf_Config.rfStatusCBRF_2G4StatusCallBack;//...stateRF_Config(rf_Config);回调函数中使用 TMOS 创建需要后续进行的事件caseRX_MODE_TX_FAIL:{#if(RF_AUTO_MODE_EXAM)rx_end_flagTRUE;tmos_set_event(taskID,SBP_RF_RF_RX_EVT);#endifbreak;}与 RF_PHY 有关的 API 函数在库函数CH59xBLE_LIB.h中 函数详细注释大家自行查看 EVT externbStatus_tRF_RoleInit(void);externbStatus_tRF_Config(rfConfig_t*pConfig);externbStatus_tRF_Rx(uint8_t*txBuf,uint8_ttxLen,uint8_tpktRxType,uint8_tpktTxType);externbStatus_tRF_Tx(uint8_t*txBuf,uint8_ttxLen,uint8_tpktTxType,uint8_tpktRxType);//shut down,stop tx/rx mode.externbStatus_tRF_Shut(void);// rf mode set radio channel/frequency.externvoidRF_SetChannel(uint32_tchannel);//rf mode set radio frequency and whitening channel index//note: LLEMode bit6 set 1externbStatus_tRF_SetFrequency(uint32_tfrequency,uint8_tch);3.2 示例逻辑说明与 RF_Basic 定时器里面发送不一样RF_PHY 示例使用的 TMOS 事件进行周期发送并且 Auto 模式发送完成以后设备会自动进入接收状态无需应用层干预。下面使用两个流程图来说明一下示例的流程。首先是 RF_PHY 发送端Auto 模式然后是 RF_PHY 接收端加入了是否为 Auto 模式判断3.3 参数配置参数配置 就是一个结构体成员rfConfig_t里面有一些在讲 RF_Basic 的时候都讲过这里我们直接在上一张图片说明如下Channel 和 Frequency 说明在配置中既有 Channel 又有 Frequency 其中使用哪个与 LLEMode 的 BIT6 有关当 LLEMode 的 BIT6 为 1 的时候表示选择 Frequency 作为通讯频点精确到 1KHz 。当 LLEMode 的 BIT6 为 0 的时候表示选择 Channel 作为通讯频点此时的 Channel 对于蓝牙规范的 0~ 39 信道2MHz 一个信道。另外关于跳频详细点的说明如下图参数的配置大家可参考文章上图来自此文章https://www.cnblogs.com/JayWellsBlog/p/183026853.4 包格式 / 收发函数说明先了解一下 RF_PHY 的数据包格式如下然后看一下发送函数官方解释如下/** * brief tx mode. * * param txBuf - tx mode tx data * param txLen - tx mode tx length(0-251) * param pktTxType - tx mode tx package type * broadcast type(0xFF):received by all matching types; * others:only received by matching type * param pktRxType - tx mode rx package type(auto mode) * broadcast type(0xFF):receive all matching types, * others:receive match type or broadcast type * * return 0 - success. 1-access address error 2-busy */externbStatus_tRF_Tx(uint8_t*txBuf,uint8_ttxLen,uint8_tpktTxType,uint8_tpktRxType);对于发送函数第一个参数是 发送端 发送的数据第二个参数是 发送端 发送的长度第三个参数是 发送端 发送的包头当为 0XFF 的时候表示我是广播状态谁都可以收第四个参数是 发送端 接收的包头就是表示发送端在自动模式下面想要接收的 ACK 的包头如果 ACK 返回的报文包头不是自己设定的就不接收0XFF 表示接收所有包头的 ACK 。bStatus_tRF_Rx(uint8_t*txBuf,uint8_ttxLen,uint8_tpktRxType,uint8_tpktTxType);同理对于接收函数第一个参数是 接收端 准备要发送的数据在 Auto 模式下面接收端必须在接收到数据之前把 ACK 数据准备好射频模块一旦收到一包 CRC 正确的数据硬件自动把 FIFO 里的这段数据作为 ACK 回发出去CPU 根本来不及再临时准备。所以这个数据是准备要回复的 ACK 数据。第二个参数是 接收端 发送的长度ACK 的长度第三个参数是 接收端 想要接收的包头当为 0XFF 的时候表示我什么包都想收其他时候只收和我设置的一样的包头。第四个参数是 接收端 回 ACK 发送的包头。调用了接收函数芯片就会进入接收状态只要不是人为的停止或者进入休眠那么芯片就一直在接收状态一直在等待着报文的到来。对于收发函数我们可以通过简单的修改看一下实际效果。首先改一下发送函数发送包头改成 0xAA想要接收的包头改成 0XBBif(!RF_Tx(TX_DATA,10,0xAA,0xBB))我们通过分析仪抓到的发送包如下然后我们如果接收端不做任何修改RF_Rx 后两个参数为 0xFF 0XFF可接收任意包头的消息回的 ACK 包头为 0xFF我们可以推测出这个现象就是接收端可以收到发送端的数据但是发送端收不到 ACK 数据因为发送端限制了 ACK 只收 包头为 0XBB 的数据。测试的现象如下图在示例基础上加了发送端接收 ACK 超时打印接收端可以接收发射端无法收到 ACK在上面修改发射端的前提下如果我们想收发正常我们可以把接收端的参数改成 0xFF 0xBB或者 0xAA 0XBBstateRF_Rx(TX_DATA,10,0xFF,0xBB);测试效果如下OK通过这个测试我们可以更加理解收发函数能让我们在后面应用合理恰当的使用这两个函数。3.5 说明事项一些使用中需要注意的事项说明持续更新自动模式下面需要提前准备好 ACK 的数据就是上面收发函数说明章节彩色字体提到的。调用接收函数以后只要没有进入休眠芯片处于持续接收的状态只要没有接收到数据它会一直处于接收状态。它是一种状态并不是一个瞬时的动作。在示例里面有两个等待函数RF_Wait_Tx_End手动模式等待发送完成自动模式等待发送-接收完成RF_Wait_Rx_End自动模式等待应答发送完成都是等待接近 5ms 左右的时间此时可以做一些应用层面的事情实际上我简单测试不加这个等待也是可以的这个看大家实际使用中的处理通过功耗仪器可以看到这个等待时间关于低功耗因为使用 TMOS 管理我们可以和蓝牙一样定义HAL_SLEEP 1让 TMOS 自动管理休眠。示例开启睡眠的测试效果如下四、常见应用通过上面介绍我们应该对 RF_PHY 有了全面的认识这里列举几个常见应用示例示例列举的时候就不做过多的分析说明了不懂的小伙伴得好好看看前文咯。4.1模拟蓝牙广播我们在 RF_PHY 示例基础上进行简单的修改自己找到代码中对应的点去修改#defineRF_AUTO_MODE_EXAM0uint8_tTX_DATA[]{0x11,0x22,0x33,0x44,0x55,0x66,//MAC 地址0x05,0x09,Q,Z,H//广播名字};if(eventsSBP_RF_PERIODIC_EVT){RF_Shut();tx_end_flagFALSE;RF_Tx(TX_DATA,sizeof(TX_DATA),0x02,0xFF);tmos_start_task(taskID,SBP_RF_PERIODIC_EVT,1000);returnevents^SBP_RF_PERIODIC_EVT;}voidRF_Init(void){uint8_tstate;rfConfig_trf_Config;tmos_memset(rf_Config,0,sizeof(rfConfig_t));taskIDTMOS_ProcessEventRegister(RF_ProcessEvent);rf_Config.accessAddress0x8E89BED6;// 禁止使用0x55555555以及0xAAAAAAAA ( 建议不超过24次位反转且不超过连续的6个0或1 )rf_Config.CRCInit0x555555;rf_Config.Channel37;rf_Config.Frequency2402000;#if(RF_AUTO_MODE_EXAM)rf_Config.LLEModeLLE_MODE_AUTO;#elserf_Config.LLEModeLLE_MODE_BASIC;// 使能 LLE_MODE_EX_CHANNEL 表示 选择 rf_Config.Frequency 作为通信频点#endifrf_Config.rfStatusCBRF_2G4StatusCallBack;rf_Config.RxMaxlen251;stateRF_Config(rf_Config);PRINT(rf 2.4g init: %x\n,state);//...就可以得到一个名称为 ”QZH“ MAC地址为66:55:44:33:22:11 的 蓝牙广播设备通过 BLE 调试助手扫描结果如图4.2 接收蓝牙广播接收的设置和发送初始化设置一样只是接收的数据处理是在 中断回调函数的RX_MODE_RX_DATA中处理的。 这里给大家推荐一篇实现接收蓝牙广播的文章大家自行参考https://www.cnblogs.com/good-fs/p/198130224.3 低功耗应用低功耗和 BLE 一样定义宏定义HAL_SLEEP 1交给 TMOS 管理没有任务执行的时候自动进入休眠对于发送端来说什么时候发都是应用层自主控制的所以发送端的低功耗使能低功耗宏定义就已经能做到低功耗了示例使能低功耗后发送端的测试效果如下就是上文说明事项里面关于低功耗提到的可以看到博主测试的芯片休眠电流在 2.2uA 左右实际平均功耗主要看发送频率和 BLE 是一样的当然示例里面应该还可以去掉 4.5ms 的延时进一步降低平均功耗。接收端低功耗对于接收端低功耗因为他并不知道数据什么时候会来但是为了低功耗又不能一直开着接收所以在实际应用中一般的实现方式就是一段时间内开启一次接收窗口。打个比方每1秒钟开启 50ms 的接收这样就可以保证低功耗。但是采用这种方式对发送端也是有要求的每次发送不可能是发送完一包或者2包就停止为了保证通信的稳定性发送端每次连续发送的时间应该是需要大于 1 秒钟保证接收端能够收到数据。当然要注意上面是提供的一个实际应用的处理思路。其中接收端的时间窗口与唤醒时间发送端的持续发送时间都需要结合实际的环境包长度等细节进行合理调整。结语本文我们说明了一下 RF_PHY 例程以及实际场合下的一些应用示例大家在使用的时候可以根据自己的实际需求选择使用 RF_PHY 还是 RF_Basic 例程进行扩展开发。好了本文就到这里。谢谢大家

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价