PRF 2.4G 开发指南¶
RF 2.4G 驱动可直接复用 SDK 内提供的例程,或通过代码导出工具生成对应的 RF 驱动库。推荐优先采用代码导出工具生成专用 RF 库,该方式生成的固件体积更小,能够有效节省 OTP 资源,为客户预留更多空间用于实现自身业务逻辑代码。
1 代码导出工具使用¶
代码导出工具为 PC 端配置工具,用于把常用 PRF(2.4G)参数以**“LIB或者工程”**的形式导出,减少手工填充 RFConfig_t 时的遗漏与不一致。
1.1 适用场景¶
需要快速生成
RFConfig_t初始化代码(普通/增强模式、TX/RX、地址宽度、多 Pipe、动态长度等)。需要在多个工程/多个设备间复用同一套 RF 参数,避免手工拷贝出错。
需要把“工具界面上的参数”与“驱动初始化代码”形成一一对应,便于评审与版本管理。
需要更多的OTP资源,容纳更多的业务代码。
1.2 基本使用流程¶
打开代码导出工具。
选择业务模式/协议模式(例如 XN297 、普通/增强等),并选择收发模式(TX 或 RX)。
按需求配置关键参数(建议按下列顺序):
射频基础参数:
Channel、DataRate、TxPower、WorkMode。地址相关:
AddrWidth、TxAddr、接收端RxAddr[0..2](多 Pipe 场景)。Payload 长度:固定长度时配置
TxLen/RxLen;动态长度场景需同时确认工具导出的动态长度使能项与最大长度限制。增强型模式:
EnTxNoAck、自动重传(AutoDelayUs/AutoMaxCnt)、接收超时(RxTimeoutUs)、收发切换等待(TrxTransTime)。
点击“Export Lib File”,选择导出到文件或复制到剪贴板。
将导出的代码粘贴到工程中(通常为
RFConfig_t的初始化 + 相关驱动调用),并与例程的逻辑保持一致。
1.3 导出代码如何落地到例程¶
导出内容通常会包含以下两类之一(以工具实际输出为准):
直接导出RF LIB库
导出RF工程方式
导出RF LIB库:
以增强型为例,在例程(如
samples/proprietary_rf/01_enhance_trx)中替换RF LIB库,删除RFConfig_t结构体,并且PAN271_RF_Init的参数删除。确保在代码导出工具中 TX 与 RX 两端以下配置一致,否则可能表现为“收不到包/偶发丢包/误包”:
Channel、DataRate、WorkMode(普通/增强)AddrWidth与对应的地址内容(TXAddr 与 RX pipe 地址)Payload 长度策略(固定长度还是动态长度)
若接收端使用多 Pipe:
发送端仍只使用单一地址;
接收端按需求开启 1~3 个 Pipe,并确保
EnPipe使能位与地址匹配。
2 例程使用¶
TRX例程功能:
发射端例程的功能:每隔300ms发送一次2.4G数据包,长度32个字节。
接收端例程的功能:接收发送端的2.4G信号,并将接收到的数据通过串口打印出来。
开发说明:
2.4g初始化配置
API介绍
SAMPLE运行流程
帧结构介绍
3 环境配置¶
环境要求
board:pan271x_evb
uart:显示串口输出log,uart端口P06(UART_RX)、P05(UART_TX),波特率115200
编译和烧录:
项目位置:
TX端:”samples\proprietary_rf\01_enhance_trx” TX_MODE置为1。
RX端:”samples\proprietary_rf\01_enhance_trx” TX_MODE置为0。
工程默认配置是XN297模式,增强型。
选择好后编译程序,用j-link烧录编译后的hex文件到pan271x_evb板子中。
4 演示说明¶
步骤
将接收端串口和发射端串口分别接到PC的USB端口上。
配置接收端和发送端。
观察PC串口工具的输出结果。
结果
发射端输出结果:

接收端输出结果:

5 开发说明¶
5.1 2.4G初始化配置¶
配置结构体“RFConfig_t”(定义在 pan271_rf_def.h),各成员介绍如下:
Type |
name |
Description |
|---|---|---|
PAN271_Trx_Mode_t |
trx_mode |
设置发送/接收模式:PAN271_TX_MODE / PAN271_RX_MODE |
uint8_t |
Channel |
RF 频点配置(驱动接口注释为 0~127) |
PAN271_TXPWR_t |
TxPower |
发射功率配置:-10/0/3/7/11 dBm |
PAN271_DataRate_t |
DataRate |
数据速率配置:1Mbps / 250Kbps |
PAN271_WorkMode_t |
WorkMode |
工作模式:普通/增强 |
PAN271_AddrWidth_t |
AddrWidth |
地址宽度设置:2~5 bytes |
uint8_t |
TxAddr[5] |
发送地址(按 AddrWidth 指定的长度有效) |
RxPipeAddr_t |
RxAddr[3] |
接收多管道地址(最多 3 路);每路包含 EnPipe 使能位和 Addr[5] 地址 |
uint8_t |
TxLen |
发送数据长度(字节) |
uint8_t |
RxLen |
接收数据长度(字节) |
bool |
EnTxNoAck |
是否使能发送无应答(增强模式下常用) |
uint16_t |
RxTimeoutUs |
接收超时时间,单位 us |
uint16_t |
AutoDelayUs |
自动重传延迟时间,单位 us |
uint8_t |
AutoMaxCnt |
自动重传最大次数 |
uint8_t |
TrxTransTime |
收/发切换等待时间,单位 us(例程中常用默认值为 50) |
PAN271_Trx_Mode_t:
Type |
Value |
Description |
|---|---|---|
PAN271_TX_MODE |
0 |
发射模式 |
PAN271_RX_MODE |
1 |
接收模式 |
PAN271_DataRate_t:
Type |
Value |
Description |
|---|---|---|
PAN271_DR_250Kbps |
1 |
250kbps 数据速率 |
PAN271_DR_1Mbps |
3 |
1Mbps 数据速率 |
PAN271_TXPWR_t:
Type |
Value |
Description |
|---|---|---|
PAN271_TXPWR_NEGATIVE_10dBm |
0 |
-10 dBm |
PAN271_TXPWR_0dBm |
1 |
0 dBm |
PAN271_TXPWR_3dBm |
2 |
3 dBm |
PAN271_TXPWR_7dBm |
3 |
7 dBm |
PAN271_TXPWR_11dBm |
4 |
11 dBm |
PAN271_WorkMode_t:
Type |
Value |
Description |
|---|---|---|
PAN271_WORKMODE_NORMAL |
0 |
普通模式 |
PAN271_WORKMODE_ENHANCE |
1 |
增强模式 |
PAN271_AddrWidth_t:
Type |
Value |
Description |
|---|---|---|
PAN271_WIDTH_2BYTES |
2 |
2 bytes 地址宽度 |
PAN271_WIDTH_3BYTES |
3 |
3 bytes 地址宽度 |
PAN271_WIDTH_4BYTES |
4 |
4 bytes 地址宽度 |
PAN271_WIDTH_5BYTES |
5 |
5 bytes 地址宽度 |
PAN271_RxPipeIndex_t:
Type |
Value |
Description |
|---|---|---|
PAN271_RX_PIPE0 |
0 |
接收管道 0 |
PAN271_RX_PIPE1 |
1 |
接收管道 1 |
PAN271_RX_PIPE2 |
2 |
接收管道 2 |
5.2 API介绍¶
本节接口以 pan271_rf_driver.h提供的驱动 API 为准。以下按“每个接口单独描述”的方式列出。
PAN271_RF_SetWorkMode¶
void PAN271_RF_SetWorkMode(PAN271_WorkMode_t WorkMode);
设置 PAN271 工作模式(普通/增强)。
PAN271_RF_SetTrxRamReady¶
void PAN271_RF_SetTrxRamReady(PAN271_Trx_Mode_t TrxMode, bool Ready);
设置收发器 RAM 准备状态。
PAN271_RF_EnableTxNoAck¶
void PAN271_RF_EnableTxNoAck(const PAN271_WorkMode_t WorkMode, bool EnNoAck);
设置 PAN271 Tx No Ack 功能(与工作模式相关)。
PAN271_RF_SetAutoRetrans¶
void PAN271_RF_SetAutoRetrans(uint16_t AutoDelayUs, uint8_t AutoMaxCnt);
设置自动重传参数(延迟与最大次数)。
PAN271_RF_SetChannel¶
void PAN271_RF_SetChannel(uint8_t Channel);
设置工作频点(驱动注释:0~127 对应 2400MHz~2527MHz)。
PAN271_RF_SetRxSingleAddr¶
void PAN271_RF_SetRxSingleAddr(RxPipeAddr_t* RxAddr, PAN271_RxPipeIndex_t PipeIndex);
设置某个管道接收地址。
PAN271_RF_SetRxAddr¶
void PAN271_RF_SetRxAddr(RxPipeAddr_t* RxAddr, uint8_t NumPipes);
设置多管道接收地址(NumPipes 最大为 RF_RX_MAX_PIPE_NUM)。
PAN271_RF_SetWaitAckTimeout¶
void PAN271_RF_SetWaitAckTimeout(uint16_t AckTimeoutUs);
设置等待 ACK 超时时间(单位 us)。
5.3 MULTI PIPE使用介绍¶
多pipe的使用主要在于接收端,发送端同时只有一个pipe,接收端同时有3个地址。
驱动侧多 pipe 地址可通过初始化配置结构体
RFConfig_t中的RxAddr[3]一次性配置(每路包含EnPipe使能位与Addr[5]地址),随后调用PAN271_RF_Init()生效。若需要运行过程中动态修改,可使用
PAN271_RF_SetRxSingleAddr()或PAN271_RF_SetRxAddr()更新接收端多管道地址。
5.4 中断介绍¶
本 SDK 的 PRF(2.4G)中断采用“软件分发回调”的形式:
硬件中断源为
LL_IRQn(向量函数名为LL_IRQHandler)。LL_IRQHandler()内部调用PAN271_RF_IRQ_Handler(),由后者根据 R11_CFG 的中断 flag 分发到用户注册的回调。PAN271_RF_Init()会在初始化过程中自动完成:使能
LL_IRQn(内部调用PAN271_RF_IRQ_Enable())调用
PAN271_RF_ISR_Init()初始化/注册回调(该函数在驱动中为弱定义,用户工程实现同名函数即可覆盖)
5.4.1 中断入口(LL_IRQHandler)与使能(LL_IRQn)¶
中断入口在 [proprietary_rf/src/pan271_rf_port.c]中实现:
void PAN271_RF_IRQ_Enable(void)
{
NVIC_SetPriority(LL_IRQn, 0);
NVIC_EnableIRQ(LL_IRQn);
}
void LL_IRQHandler(void)
{
PAN271_RF_IRQ_Handler();
}
一般情况下不需要用户手动 NVIC_EnableIRQ();只要调用 PAN271_RF_Init(),驱动会自动使能 RF 中断。
5.4.2 回调注册(以 enhance_trx 为例)¶
回调结构体类型为 PAN271_Callback_t(定义在 pan271_rf_def.h),全局实例 isr_cb 位于 [proprietary_rf/src/pan271_rf_port.c]。
enhance_trx 例程在 [samples/proprietary_rf/01_enhance_trx/src/main.c] 中实现 PAN271_RF_ISR_Init(),用于注册回调:
void PAN271_RF_ISR_Init(void)
{
isr_cb.tx_cb = event_tx_fun;
isr_cb.rx_cb = event_rx_fun;
isr_cb.rx_timeout_cb = event_rx_timeout_fun;
isr_cb.rx_crc_err_cb = event_crc_err_fun;
isr_cb.rx_pid_err_cb = event_pid_err_fun;
isr_cb.rx_acc_adr_err_cb = event_acc_adr_err_fun;
isr_cb.rx_len_err_cb = event_len_err_fun;
}
说明:
PAN271_RF_ISR_Init()在驱动中提供弱定义,应用侧实现同名函数即可“覆盖”驱动默认实现。该函数由
PAN271_RF_Init()内部调用,典型工程无需额外调用。
5.4.3 中断 flag 与回调分发关系¶
PAN271_RF_IRQ_Handler() 会依次检查 R11_CFG 中的各中断 flag(PAN271_RF_IntFlag() 本质是判断 PRI_RF->R11_CFG & mask),若回调非空则调用,最后清除中断:
中断事件 |
flag(寄存器位) |
回调指针(PAN271_Callback_t) |
典型含义 |
|---|---|---|---|
接收完成 |
R11_CFG: RX_IRQ_FLAG |
|
Rx FIFO 有效数据可读 |
接收超时 |
R11_CFG: TIMEOUT_IRQ_FLAG |
|
等待接收超时(与 |
CRC 错误 |
R11_CFG: CRC_ERR_IRQ_FLAG |
|
收到包但 CRC 校验失败 |
PID 错误 |
R11_CFG: PID_ERR_IRQ_FLAG |
|
PID 校验失败(增强/重传相关) |
长度错误 |
R11_CFG: LENGTH_ERR_IRQ_FLAG |
|
length 字段非法或不匹配 |
地址错误 |
R11_CFG: ACC_ADDR_ERR_IRQ_FLAG |
|
Access Address 不匹配 |
发送完成 |
R11_CFG: TX_DONE_IRQ_FLAG |
|
Tx 流程结束(与工作模式/掩码配置相关) |
5.4.4 增强型 ACK Payload 的关键点(enhance_trx)¶
在增强模式且需要 ACK 的接收端场景中(EnTxNoAck == DISABLE 且设备处于 PAN271_RX_MODE),接收端需要在“接收完成回调”中快速准备 ACK payload。enhance_trx 的示例是在 event_rx_fun() 中直接调用:
if ((gRfConfig.EnTxNoAck == DISABLE) && (gRfConfig.trx_mode == PAN271_RX_MODE))
{
TxBuf[0]++;
PAN271_RF_SetTxData(TxBuf, gRfConfig.TxLen);
}
该段代码运行在中断上下文中,目的是赶在硬件发送 ACK 之前修改BUFFER,并把BUFFER复制到FIFO中。
注意:在高性能的2.4g应用中尽量不要使用打印,会影响射频收发性能。增强型RX中断中不能有延时或者打印或者执行时间很长的接口,不然可能会影响发送中断从而导致时序错误。
7 2.4G帧结构介绍¶
7.1 xn297兼容帧结构¶
普通型:
3 byte |
2~5 byte |
0~255 byte |
2 byte |
|---|---|---|---|
preamble(0x710f55) |
addr |
payload |
crc(包含addr和payload) |
空中bit序:大端模式
PAN271 普通型的payload长度范围为:0~255 Byte
增强型: 在地址和payload之间插入signal(10bit)数据。
3 byte |
2~5 byte |
10bit |
0~127 byte |
2 byte |
|---|---|---|---|---|
preamble(0x710f55) |
addr |
signal |
payload |
crc(包含addr和payload) |
signal结构:
7bit |
2bit |
1bit |
|---|---|---|
数据长度标识(动态payload) |
PID标识 (判断是否是重发包) |
NO_ACK标识 (tx完是否需要ack) |
PAN271 普通型的payload长度范围为:0~127 Byte
白化和crc的作用域包括addr+payload+signal。