当前页面为 开发中 版本,查看特定版本的文档,请在页面左下角的下拉菜单中进行选择。

PRF 2.4G 开发指南

RF 2.4G SDK可以通过两种方式获取RF LIB驱动库,首先可直接复用 SDK 内提供的RF例程,或通过代码导出工具生成对应的 RF 驱动库。推荐优先采用代码导出工具生成专用 RF 库,该方式生成的固件体积更小,能够有效节省 OTP 资源,为客户预留更多空间用于实现自身业务逻辑代码。代码导出工具位于 04_TOOLS/代码导出工具/PAN271x_ES_Tools.exe

1 代码导出工具使用

代码导出工具为 PC 端配置工具,用于把常用 PRF(2.4G)参数以 “LIB或者工程” 的形式导出,减少手工填充 RFConfig_t 时的遗漏与不一致。

1.1 适用场景

  • 需要快速生成 RFConfig_t 初始化代码(普通/增强模式、TX/RX、地址宽度、多 Pipe、动态长度等)。

  • 需要在多个工程/多个设备间复用同一套 RF 参数,避免手工拷贝出错。

  • 需要把“工具界面上的参数”与“驱动初始化代码”形成一一对应,便于评审与版本管理。

  • 需要更多的OTP资源,容纳更多的业务代码。

1.2 基本使用流程

  1. 打开代码导出工具。

  2. 选择业务模式/协议模式(例如 XN297 、普通/增强等),并选择收发模式(TX 或 RX)。

  3. 按需求配置关键参数(建议按下列顺序):

    • 射频基础参数ChannelDataRateTxPowerWorkMode

    • 地址相关AddrWidthTxAddr、接收端 RxAddr[0..2](多 Pipe 场景)。

    • Payload 长度:固定长度时配置 TxLen/RxLen;动态长度场景需同时确认工具导出的动态长度使能项与最大长度限制。

    • 增强型模式EnTxNoAck、自动重传(AutoDelayUs/AutoMaxCnt)、接收超时(RxTimeoutUs)、收发切换等待(TrxTransTime)。

  4. 点击“Export Lib File”,选择导出到文件或复制到剪贴板。

  5. 将导出的代码粘贴到工程中(通常为 RFConfig_t 的初始化 + 相关驱动调用),并与例程的逻辑保持一致。

1.3 导出代码如何落地到例程

导出内容通常会包含以下两类之一(以工具实际输出为准):

  • 直接导出RF LIB库

  • 导出RF工程方式

导出RF LIB库:

  1. 以增强型为例,在例程(如 samples/proprietary_rf/01_enhance_trx)中替换RF LIB库,删除RFConfig_t结构体,并且PAN271_RF_Init的参数删除。

  2. 确保在代码导出工具中 TX 与 RX 两端以下配置一致,否则可能表现为“收不到包/偶发丢包/误包”:

    • ChannelDataRateWorkMode(普通/增强)

    • AddrWidth 与对应的地址内容(TXAddr 与 RX pipe 地址)

    • Payload 长度策略(固定长度还是动态长度)

  3. 若接收端使用多 Pipe:

    • 发送端仍只使用单一地址;

    • 接收端按需求开启 1~3 个 Pipe,并确保 EnPipe 使能位与地址匹配。

2 例程使用

  1. TRX例程功能:

    • 发射端例程的功能:每隔300ms发送一次2.4G数据包,长度32个字节。

    • 接收端例程的功能:接收发送端的2.4G信号,并将接收到的数据通过串口打印出来。

  2. 开发说明:

    • 2.4g初始化配置

    • API介绍

    • SAMPLE运行流程

    • 帧结构介绍

3 环境配置

  1. 环境要求

    • board:pan271x_evb

    • uart:显示串口输出log,uart端口P06(UART_RX)、P05(UART_TX),波特率115200

  2. 编译和烧录:

    1. 项目位置:

    • TX端:”samples\proprietary_rf\01_enhance_trx” TX_MODE置为1。

    • RX端:”samples\proprietary_rf\01_enhance_trx” TX_MODE置为0。

    工程默认配置是XN297模式,增强型。

  3. 选择好后编译程序,用j-link烧录编译后的hex文件到pan271x_evb板子中。

4 演示说明

  1. 步骤

    • 将接收端串口和发射端串口分别接到PC的USB端口上。

    • 配置接收端和发送端。

    • 观察PC串口工具的输出结果。

  2. 结果

    发射端输出结果:

    接收端输出结果:

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_Init

void PAN271_RF_Init(RFConfig_t* config);

初始化 PAN271 芯片(参数为 RF 配置结构体 RFConfig_t 指针)。

PAN271_SYS_LDO_Enable

void PAN271_SYS_LDO_Enable(void);

使能 RF LDO。

PAN271_SYS_LDO_Disable

void PAN271_SYS_LDO_Disable(void);

禁用 RF LDO。

PAN271_RF_ISR_Init

void PAN271_RF_ISR_Init(void);

初始化 PAN271 射频模块中断回调函数(用户可在工程中重写/实现)。

PAN271_RF_RFModuleReset

void PAN271_RF_RFModuleReset(void);

重启 RF 射频模块。

PAN271_RF_SetDataRate

void PAN271_RF_SetDataRate(PAN271_DataRate_t DataRate);

设置 PAN271 芯片数据速率。

PAN271_RF_EnableWhiten

void PAN271_RF_EnableWhiten(bool EnWhite);

设置 PAN271 是否使能白化。

PAN271_RF_SetWorkMode

void PAN271_RF_SetWorkMode(PAN271_WorkMode_t WorkMode);

设置 PAN271 工作模式(普通/增强)。

PAN271_RF_SetAddrWidth

void PAN271_RF_SetAddrWidth(uint8_t AddrWidth);

设置 PAN271 地址宽度(2~5 bytes)。

PAN271_RF_SetTrxMode

void PAN271_RF_SetTrxMode(PAN271_Trx_Mode_t TrxMode);

设置收发器工作模式(TX/RX)。

PAN271_RF_SetTrxRamReady

void PAN271_RF_SetTrxRamReady(PAN271_Trx_Mode_t TrxMode, bool Ready);

设置收发器 RAM 准备状态。

PAN271_RF_SetWhiteInitVal

void PAN271_RF_SetWhiteInitVal(uint8_t initVal);

设置白化初始值。

PAN271_EnableManualPid

void PAN271_EnableManualPid(bool EnManuPid);

设置手动 PID 使能。

PAN271_RF_SetTxPower

void PAN271_RF_SetTxPower(PAN271_TXPWR_t tx_pwr);

设置 PAN271 发射功率。

PAN271_RF_SetTxAddr

void PAN271_RF_SetTxAddr(uint8_t *Addr);

设置收发器的静态发送地址。

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_SetTxData

void PAN271_RF_SetTxData(uint8_t *TxPayload, uint8_t PayloadLen);

设置发送有效数据及长度。

PAN271_RF_TrxStart

void PAN271_RF_TrxStart(void);

启动 PAN271 发送/接收。

PAN271_RF_StartCarrierWave

void PAN271_RF_StartCarrierWave(uint8_t Channel);

启动载波发射。

PAN271_RF_StopCarrierWave

void PAN271_RF_StopCarrierWave(void);

停止载波发射。

PAN271_RF_SetCrcScheme

void PAN271_RF_SetCrcScheme(void);

设置 CRC 校验模式。

PAN271_RF_RX_GOON_Enable

void PAN271_RF_RX_GOON_Enable(bool EnRxGoon);

当 CRC 错误时,设置是否继续接收。

PAN271_RF_SetRxPayloadLen

void PAN271_RF_SetRxPayloadLen(uint8_t PayloadLen);

设置接收有效数据长度。

PAN271_RF_GetRxPayload

uint8_t PAN271_RF_GetRxPayload(uint8_t* RxPayload);

获取接收数据,返回接收数据长度。

PAN271_RF_EnableDynamicPL

void PAN271_RF_EnableDynamicPL(bool Dpy_En);

设置是否使能动态包长度解析。

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_GetPipesNum

uint8_t PAN271_RF_GetPipesNum(void);

获取已启用的接收管道数量。

PAN271_RF_SetWaitAckTimeout

void PAN271_RF_SetWaitAckTimeout(uint16_t AckTimeoutUs);

设置等待 ACK 超时时间(单位 us)。

PAN271_RF_GetRxPacketRssi

int16_t PAN271_RF_GetRxPacketRssi(void);

获取接收数据包 RSSI(缓存值)。

PAN271_RF_GetRealTimeRssi

int16_t PAN271_RF_GetRealTimeRssi(void);

读取实时 RSSI。

PAN271_RF_ExitContinueRxMode

void PAN271_RF_ExitContinueRxMode(void);

退出连续接收模式。

PAN271_RF_SetMaxRxLength

void PAN271_RF_SetMaxRxLength(uint8_t MaxLen);

设置最大接收数据长度。

PAN271_RF_VCO_Cal

void PAN271_RF_VCO_Cal(void);

VCO 校准。

PAN271_RF_TwoPointCal

void PAN271_RF_TwoPointCal(PAN271_DataRate_t DataRate);

两点式校准。

PAN271_RF_BW_DCOC_Cal

void PAN271_RF_BW_DCOC_Cal(PAN271_DataRate_t DataRate);

带宽/直流偏移校准。

5.3 MULTI PIPE使用介绍

  1. pipe的使用主要在于接收端,发送端同时只有一个pipe,接收端同时有3个地址。

  2. 驱动侧多 pipe 地址可通过初始化配置结构体 RFConfig_t 中的 RxAddr[3] 一次性配置(每路包含 EnPipe 使能位与 Addr[5] 地址),随后调用 PAN271_RF_Init() 生效。

  3. 若需要运行过程中动态修改,可使用 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_cb

Rx FIFO 有效数据可读

接收超时

R11_CFG: TIMEOUT_IRQ_FLAG

rx_timeout_cb

等待接收超时(与 RxTimeoutUs/掩码配置相关)

CRC 错误

R11_CFG: CRC_ERR_IRQ_FLAG

rx_crc_err_cb

收到包但 CRC 校验失败

PID 错误

R11_CFG: PID_ERR_IRQ_FLAG

rx_pid_err_cb

PID 校验失败(增强/重传相关)

长度错误

R11_CFG: LENGTH_ERR_IRQ_FLAG

rx_len_err_cb

length 字段非法或不匹配

地址错误

R11_CFG: ACC_ADDR_ERR_IRQ_FLAG

rx_acc_adr_err_cb

Access Address 不匹配

发送完成

R11_CFG: TX_DONE_IRQ_FLAG

tx_cb

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中断中不能有延时或者打印或者执行时间很长的接口,不然可能会影响发送中断从而导致时序错误。

6 Sample运行流程

enhance_rx例程运行流程

如下图所示:

image

RX例程流程图

enhance_tx例程运行流程

如下图所示:

image

TX例程流程图

7 2.4G帧结构介绍

7.1 xn297兼容帧结构

普通型:

3 byte

2~5 byte

0~255 byte

2 byte

preamble(0x710f55)

addr

payload

crc(包含addr和payload)

空中bit序:大端模式;

白化:用户可自定义白化使能,如果使能白化初始值固定位 0x7F白化固定默认不跳过地址部分

CRC:CRC校验位数用户可自定义设置(OFF、1-byte、2-byte、3-byte,默认推荐2-byte),CRC 固定默认不跳过地址部分

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

7.2 FS01兼容帧结构

普通型:

1 byte

2~5 byte

0~32byte

0/1/2/3 byte

preamble(0x55或者0xaa)

addr

payload

crc(包含addr和payload)

preamble:地址第一个bit为0,取0xaa;地址第一个bit为1,取0x55。

空中bit序:大端模式

白化:用户可自定义白化使能,如果使能白化初始值固定位 0x7F白化固定默认不跳过地址部分

CRC:CRC校验位数用户可自定义设置(OFF、1-byte、2-byte、3-byte,默认推荐2-byte),CRC 固定默认不跳过地址部分

**增强型:**在地址和payload之间插入signal(9bit)数据。

1 byte

2~5 byte

9bit

0~32byte

0/1/2/3 byte

preamble(0x55或者0xaa)

addr

signal

payload

crc(包含addr和payload)

signal结构:

6bit

2bit

1bit

数据长度标识(动态payload)

PID标识 (判断是否是重发包)

NO_ACK标识 (tx完是否需要ack)

FS01 普通型和增强型的payload长度范围为:0~32 Byte

7.3 FS32兼容帧结构

FS32帧结构如下图所示:

普通型:

1 byte

2~5 byte

1byte

1byte

8bit

0~255byte

0/1/2/3 byte

preamble(0x55或者0xaa)

addr

header0

header1

length

payload

crc(可自定义设置是否跳过addr)

preamble:地址第一个bit为0,取0xaa;地址第一个bit为1,取0x55。

空中bit序:用户可自定义大小端模式

白化:用户可自定义白化使能,如果使能白化初始值固定位 0x7F白化固定默认跳过地址部分

CRC:CRC校验位数用户可自定义设置(OFF、1-byte、2-byte、3-byte,默认推荐2-byte),用户可自定义CRC 是否跳过地址部分

header:只存在于普通型帧结构中,是否存在可选;

增强型:

1 byte

2~5 byte

8bit

2bit

1bit

0~255byte

0/1/2/3 byte

preamble(0x55或者0xaa)

addr

length

pid

noack

payload

crc(可自定义设置是否跳过addr)

length(8bits)、pid(2bit)、noack(1bit)构成,拼接方式可选,发送顺序由endian寄存器确定,只控制每个field内的顺序,其中pid和ack的顺序可选。Pid可以软件自己维护,但需要每一次收发进行一次配置。

Noack模式可配置,由寄存器控制。1表示需要ack或者不需要ack。

普通模式中支持0~255Byte,增强型支持0~255Byte,发送顺序由endian寄存器确定。

7.4 自定义帧结构

chip_mode字段为“PRF_CHIP_MODE_SEL_NORDIC”模式时,帧结构如下:

image

header0、header1、length为可选字段,可以适配BLE和FS32不同模式的帧结构,例如BLE广播帧结构:

image

蓝牙广播中的报头和长度对应PRF_MODE_NORMAL_M1模式中的header0和length,header1没有。

8 2.4G PID流程

tx和rx pid处理逻辑如下:

image

PID生成和检测

每一包数据都包括两位的PID(数据包标志位),来帮助接收端识别该数据是新数据包还是重发的数据包,防止多次存入相同的数据包,PID的生成和检测如上图所示。发送端的ack包未发生超时PID值加一。支持软件配置tx pid和rx pid。