CH582 RF_PHY实现遥控蓝牙设备

CH58x系列芯片的RF是一个非常实用的功能,RF 应用基于 RF 发送与接收的 PHY(物理层),实现 2.4GHz 频段的无线通讯。与 BLE 的区别 在于,RF 应用并没有建立 BLE 的协议,可以非常方便快捷的实现对电子产品的遥控,结合其它的BLE应用,可以实现一些很有意思的功能。

这里我们简单的阐述,如何利用RF,实现点对点的通讯。本文的所有例程都基于沁恒提供的例程修改得来,为了减少篇幅,我们在这里只列出修改部分的代码,并作简单说明。

#define   TX_MODE  0
#define   RX_MODE  1
#ifndef RF_MODE
#define RF_MODE  RX_MODE
#endif  
//在config.h文件中加入上述代码,RF的应用,发送与接收的代码大部分相同,
所以多数时候,我们在同一个工程文件中实现,加入上述代码的目的,只是为了方便。
//config.h
#if (RF_MODE == RX_MODE)
#ifndef HAL_KEY
#define HAL_KEY                             FALSE
#endif
#ifndef HAL_LED
#define HAL_LED                             TRUE
#endif
#else
#ifndef HAL_KEY
#define HAL_KEY                             TRUE
#endif
#ifndef HAL_LED
#define HAL_LED                             FALSE
#endif
#endif

//本文例程发送时,通过按下按键实现发送不同的数据,从而达到控制电子产品的目的。
//接收时,接收到不同的控制指令,控制LED的亮或灭。
//RF_PHY.c
uint8_t TX_DATA[10] = {0, 0, 1, 1, 0, 2, 0,3,0,'E'}; 
    //控制指令数据,用户可以自己定义,本例程只需要考虑第3个数据的值。


        c
<think>嗯,用户让我分析一段代码,具体是static void process_rx_done_evt(void)这个函数。首先,我需要理解这段代码的功能和上下文。用户之前已经询问过蓝牙BLE的广播信道,所以这段代码可能和BLE的广播信道处理有关。 首先看代码结构。函数开始声明了一个时间戳t0,然后检查时间差是否小于某个超时值s_phy.rxOnlyTO。如果满足条件,就调用phy_rf_rx()并返回,否则更新时间戳。接着根据当前的rfChn切换到下一个信道,或者设置为空闲状态。 用户可能想知道这段代码的作用,或者是在调试时遇到了问题,需要理解流程。比如,为什么在三个信道之间切换?时间检查的作用是什么?变量如s_phy和s_pktCfg的结构可能是什么? 接下来,我需要确定代码中的关键部分。函数处理的是接收完成事件,可能在每次接收完成后被调用。时间检查可能用于控制扫描每个信道的时间,避免长时间占用。信道切换是按照37→38→39的顺序,这正是BLE的广播信道。每次切换信道时,更新白化种子,这可能与BLE的物理层处理有关,白化用于减少数据传输中的干扰。 用户可能是开发者,正在开发或调试BLE相关功能,需要了解底层信道切换机制,或者优化扫描过程。可能的问题包括信道切换不及时,扫描超时设置不当,或者白化种子配置错误导致数据接收问题。 此外,用户可能没有明确说出需求,比如想了解代码中的时间管理,或者为什么在三个信道之间轮询。需要解释代码的每一步,特别是时间检查和信道切换的逻辑,以及状态转换的条件。 总结,回答需要分步骤解释代码,说明时间检查的作用,信道切换的顺序,白化种子的作用,以及状态转换。同时,结合之前关于BLE广播信道的知识,指出代码如何实现信道的轮询扫描,帮助用户理解其实现机制。</think>--- ### **代码解析:`static void process_rx_done_evt(void)`** #### **1. 功能概述** 此函数是蓝牙BLE协议栈中处理**射频接收完成事件**的典型逻辑,主要用于**广播信道的扫描与切换**。其核心是通过轮询37、38、39三个广播信道(依次切换)监听广播数据包,并管理射频接收状态。 --- #### **2. 代码逐段解析** ##### **(1) 时间戳检查与超时控制** ```c uint32_t t0 = read_current_fine_time(); if (TIME_DELTA(t0, s_phy.rxScanT0) < s_phy.rxOnlyTO) { phy_rf_rx(); // 继续在当前信道接收 return; } else { s_phy.rxScanT0 = t0; // 更新扫描起始时间戳 } ``` - **目的**:控制单个信道的最大扫描时间(`s_phy.rxOnlyTO`)。 - **逻辑**: - 若当前信道扫描时间未超时(`TIME_DELTA`值较小),保持接收状态(`phy_rf_rx()`)。 - 若超时,更新时间戳`rxScanT0`,准备切换到下一个信道。 --- ##### **(2) 广播信道轮询切换** ```c if (s_phy.rfChn == BLE_ADV_CHN37) { s_phy.rfChn = BLE_ADV_CHN38; // 切换到信道38 s_pktCfg.wtSeed = WHITEN_SEED_CH38; // 更新白化种子(信道38专用) phy_rf_rx(); // 重新启动射频接收 } else if (s_phy.rfChn == BLE_ADV_CHN38) { s_phy.rfChn = BLE_ADV_CHN39; // 切换到信道39 s_pktCfg.wtSeed = WHITEN_SEED_CH39; // 更新白化种子(信道39专用) phy_rf_rx(); } else if (s_phy.rfChn == BLE_ADV_CHN39) { s_phy.Status = XCH_RF_IDLE; // 完成一轮扫描,射频进入空闲状态 } ``` - **信道切换顺序**:37 → 38 → 39 → 空闲,符合BLE广播信道的设计要求。 - **白化种子(`wtSeed`)**: - BLE物理层使用白化(Whiten)技术降低信号干扰,不同信道需配置不同种子值(`WHITEN_SEED_CH38/39`)。 - 例如,信道37的种子值为固定值(代码中未显式设置,可能已初始化)。 - **射频状态管理**: - 完成三个信道的轮询后,状态设为`XCH_RF_IDLE`,等待下一次扫描任务触发。 --- #### **3. 关键变量与结构** - **`s_phy`结构体**: - `rfChn`:当前射频工作信道(37/38/39)。 - `rxScanT0`:记录当前信道扫描的起始时间。 - `Status`:射频状态(如空闲、接收中)。 - **`s_pktCfg`结构体**: - `wtSeed`:白化种子值,与信道绑定,确保接收端能正确解码数据。 --- #### **4. 实际应用场景** - **广播扫描流程**: 1. 设备在信道37启动接收,持续扫描直到超时。 2. 超时后切换到信道38,更新白化种子,继续扫描。 3. 重复上述过程至信道39,最终进入空闲状态。 - **抗干扰设计**: - 通过轮询三个信道,避免因某个信道被Wi-Fi或微波炉干扰导致通信失败。 --- #### **5. 潜在优化方向** - **动态超时调整**: 可根据信道质量(如误码率)动态调整`rxOnlyTO`值,优化扫描效率。 - **优先级控制**: 若某个信道频繁被干扰,可缩短其扫描时间,优先使用其他信道。 --- ### **总结** 此函数实现了BLE广播信道的**按序轮询扫描**,结合时间戳控制和白化种子切换,确保可靠接收广播数据。其逻辑清晰体现了BLE协议对广播信道的管理和抗干扰设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的元子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值