当前文档版本为 v0.5.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

RF应用开发指南

1. 基础指标

1.1 功耗指标

2.4G在不同工作状态下的功耗如下表所示:

条件

参数

测试条件

典型值

单位

ITX,P13dBm,LDO

13dBm 功率输出的电流@LDO

射频收发器

58

mA

ITX,P10dBm,LDO

10dBm 功率输出的电流@LDO

射频收发器

43

mA

ITX,P8dBm,LDO

8dBm 功率输出的电流@LDO

射频收发器

33

mA

ITX,P6dBm,LDO

6dBm 功率输出的电流@LDO

射频收发器

28

mA

ITX,P5dBm,LDO

5dBm 功率输出的电流@LDO

射频收发器

26

mA

ITX,P0dBm,LDO

0dBm 功率输出的电流@LDO

射频收发器

18

mA

ITX,P-5dBm,LDO

-5dBm 功率输出的电流@LDO

射频收发器

15

mA

ITX,P-10dBm,LDO

-10dBm 功率输出的电流@LDO

射频收发器

14

mA

ITX,P-20dBm,LDO

-20dBm 功率输出的电流@LDO

射频收发器

13

mA

ITX,P-40dBm,LDO

-40dBm 功率输出的电流@LDO

射频收发器

13

mA

IRX,1M,LDO

RX 1Mbps 电流@LDO

射频收发器

12.4

mA

IRX,2M,LDO

RX 2Mbps 电流@LDO

射频收发器

12.8

mA

2. 工作模式说明

PN262x 2.4GHz GFSK RF收发机工作在世界通用ISM频段2.400~2.4835 GHz。作为SOC的一个外设,通信上兼容BLE 广播包(4.2 短包)、XN297L以及NordicnRF24L01。主要有不带自动重传不带ACK的通信模式(后简称为普通模式)和带自动重传带ACK的通信模式(后简称为增强模式)。

2.1 普通型接收

收发机一直处于接收状态,在收到有效数据后上报中断给MCU,随后MCU可将该数据从RX FIFO寄存器中读出。

297普通型数据包帧格式:

前导码

地址

数据

CRC校验

3字节

3~5字节

1~32/64字节

1/2字节

24L01普通型数据包帧格式:

前导码

地址

数据

CRC校验

1字节

3~5字节

1~32字节

1/2字节

帧组件描述:

前导码

297L中的前导码长度为3个字节。 前导码的比特序列是固定的,它不能由寄存器配置。 前导码用于使接收器解调器与输入比特流同步。

对于298L,前导码固定为3个字节:0x71,0x0F,0x55。

对于24L01,前导码会根据距离前导最近的一个字节(地址的最高位)变化,距离前导码最近地址的bit为1时,前导码为10101010;距离前导码最近地址的bit为0时,前导码为01010101。

地址

寄存器将地址宽度配置为3,4或5个字节。接收器对来自发送器的数据包进行解调,如果数据包的地址与接收器的地址相同,它会把后续有效负载保存在RX FIFO中,否则丢弃后续有效负载并恢复同步。

注意地址位宽要和实际的地址宽度保持一致,否则实际发出的会按照设置的地址位宽补全或删除导致收发异常。另外,空中抓取的地址的字节序固定为MSB,不可以通过寄存器调整,即先写入地址寄存器的字节在空中抓取将在后面出现。

标识

分组控制字段由10比特组成,其包含7比特的数据长度标识字段,2比特PID(数据包标识)字段和1比特NO_ACK标识。仅存在于增强模式中。

数据长度标识

数据长度标识由7比特组成。有效载荷的长度可以是0到64个字节。

编码:0000000 = 0字节(仅用于空ACK数据包),1000000 = 64字节。

仅当启用动态有效载荷长度功能时才使用此字段。

NO_ACK标识

NO_ACK标识仅在297L增强模式时使用。使用此功能时,PTX在发送数据包后直接进入待机模式。PRX在收到数据包时不发送ACK数据包。

有效载荷

有效载荷可以是0到64字节,其中包含用户定义的信息。

在普通模式下,发射机和接收机具有相同的静态长度。不同于普通模式,增强模式具有动态有效载荷长度,静态有效载荷长度除外。

利用静态有效载荷长度,发射器和接收器之间的所有数据包都具有相同的长度。静态有效载荷长度由接收器侧的RX_PW_Px寄存器设置。在发送器上,有效载荷长度由时钟输入TX_FIFO的字节数设置,并且必须等于接收器侧RX_PW_Px寄存器中的值。

DPL启用动态有效负载长度。这意味着发送器将具有可变有效载荷长度的数据包发送到接收器。MCU可以使用R_RX_PL_WID命令而不是使用RX_PW_Px寄存器来读取接收到的有效负载的长度。为了使能DPL,必须先使能FEATURE寄存器中的EN_DPL位。在RX模式下,必须设置DYNPD寄存器。如果要将PTX发送给一个使能DPL的PRX,这个PTX必须设置DYNPD的DPL_P0位。

CRC

CRC是数据包中的强制性错误检测机制。它在CONFIG寄存器中设置使能位和字节数。 如果启用了CRC,接收器将检查接收到的数据包的CRC。如果它们不相同,接收方将丢弃数据而不产生中断。如果CRC被禁用,当地址相同时,接收器将把数据保存在FIFO中。

2.2 增强型接收

收发机一开始处于接收状态,接收到有效数据后进入发射状态,发送ACK或者ACK + PAYLOAD并上报中断给MCU。

297增强型数据包帧格式:

前导码

地址

标识

标识

标识

数据

CRC校验

3字节

3~5字节

数据长度标识(7bit)

PID标识 (2bit)

NO_ACK标识 (1bit)

0~32/64字节

1/2字节

297增强型ACK包帧格式:

前导码

地址

标识

标识

标识

CRC校验

3字节

3~5字节

数据长度标识(7bit)

PID标识 (2bit)

NO_ACK标识 (1bit)

1/2字节

24L01增强型数据包帧格式:

前导码

地址

标识

标识

标识

数据

CRC校验

1字节

3~5字节

数据长度标识(6bit)

PID标识 (2bit)

NO_ACK标识 (1bit)

0~32字节

1/2字节

24L01增强型ACK包帧格式:

前导码

地址

标识

标识

标识

CRC校验

1字节

3~5字节

数据长度标识(6bit)

PID标识 (2bit)

NO_ACK标识 (1bit)

1/2字节

2.3 蓝牙BLE

BLE 4.2广播包格式,注意接收端会把2 bytes的header存到FIFO里边,帧格式如下:

ble.png

2.4 普通型发射

收发机一直处于发射状态,在MCU的控制下将FIFO中的数据发射出去并上报中断给MCU,同时TX FIFO寄存器清除该数据。

2.5 增强型发射

收发机一开始处于发射状态,发射完成后进入接收状态,等待ACK或者ACK + PAYLOAD。

2.6 通信时序

增强模式下,把主动发起通信的一方称为PTX(主发端),把接收数据并响应的一方称为PRX(主收端)。

PTX发出数据后等待应答信号,PRX接收到有效数据后回应答信号。PTX规定时间内未收到应答信号,将会按照寄存器设置的重传次数自动重新发送数据。自动重传和自动应答功能为收发机自带,无需MCU参与。

PTX在发送数据后自动转到接收模式等待应答信号。如果没有在规定时间内收到正确的应答信号,PTX将重发相同的数据包,直到收到应答信号,或传输次数超过ARC的值(SETUP_RETR寄存器)产生MAX_RT中断。PTX收到应答信号,即认为数据已经发送成功(PRX收到有效数据),清除TX FIFO中的数据并产生TX_DS中断(TX FIFO和RX FIFO需要清空,中断需要清除)。

PRX每次收到一包有效数据都会回ACK应答信号,该数据如果为新数据(PID值与上一包数据不同)保存到RX FIFO,否则就丢弃。

下图所示的是一次PTX和PRX通信的芯片内部时序图,使得通信成功必须满足以下两个条件:

1、n PTX(或PRX)发射的锁相环稳定+功放使能+锁相环开环的三段时间之和,大于PRX(或PTX)接收的锁相环稳定时间20us以上,这样可以保证PTX(或PRX)发射数据的时间段落在PRX(或PTX)接收数据的时间段内,即:EX_PA_TIME + TX_SETUP_TIME + TRX_TIME > RX_SETUP_TIME +20us;

2、PRX发送ACK的锁相环稳定+功放使能+锁相环开环+发送ACK的四段时间之和,小于PTX接收的锁相环稳定+等待ACK的两端时间之和80us以上,保证PRX回复ACK的时间端落在PTX等待ACK的时间段内,即:EX_PA_TIME + TX_SETUP_TIME + TRX_TIME + SEND_ACK_TIME <RX_SETUP_TIME + RX_ACK_TIME - 80us。

img

3. 开发流程

3.1 297普通型工作模式

  • RF参数配置:

RFConfig_t xdata gRfConfig =
{
    /*.Channel        =  */ 2418,
    /*.TxPower        =  */ 7,
    /*.DataRate       =  */ RF_DR_1Mbps,
    /*.ChipMode       =  */ RF_CHIPMODE_XN297,
    /*.WorkMode       =  */ RF_WORKMODE_NORMAL,
    /*.EnAPL          =  */ DISABLE,
    /*.EnDPL          =  */ DISABLE,
    /*.EnTxNoAck      =  */ ENABLE,
    /*.EnWhite        =  */ ENABLE,
    /*.Crc            =  */ RF_CRC_2BYTE,
    /*.AddrWidth      =  */ RF_ADRESS_SIZE,
    /*.TRxAddr        =  */ {0x10, 0x22, 0x55, 0x0F, 0x71},  // If you want to test multi-pipe0, you can use this address
//    /*.TRxAddr        =  */ {0x11, 0x22, 0x55, 0x0F, 0x71}, // If you want to test multi-pipe1, you can use this address
//    /*.TRxAddr        =  */ {0x12, 0x22, 0x55, 0x0F, 0x71}, // If you want to test multi-pipe2, you can use this address
//    /*.TRxAddr        =  */ {0x13, 0x22, 0x55, 0x0F, 0x71}, // If you want to test multi-pipe3, you can use this address
//    /*.TRxAddr        =  */ {0x14, 0x22, 0x55, 0x0F, 0x71}, // If you want to test multi-pipe4, you can use this address
//    /*.TRxAddr        =  */ {0x15, 0x22, 0x55, 0x0F, 0x71}, // If you want to test multi-pipe5, you can use this address
    /*.RxTimeoutUs    =  */ 1000,
    /*.TxSetupTimeUs  =  */ 112,
    /*.TxBuf          =  */ {0},
    /*.RxBuf          =  */ {0},
};
  • RF用户配置代码:

void APP_RfInit(RFConfig_t *pCfg)
{
    RCC_PeriphClockCmd(RCC_PERIPH_RF, ENABLE);
    
    RF_Init();
    
    RF_CarrierOffset(0x00);
    RF_SetChipMode(pCfg->ChipMode);
    RF_SetDataRate(pCfg->rate);
    RF_SetChannel(pCfg->channel-2400);
    RF_SetCrc(pCfg->crc);
    RF_SetTxPower(pCfg->txPower);
    
    RF_SetFifoLenType(RF_FIFOLEN_TYPE_64);
    
    RF_SetTxAddr(pCfg->TRxAddr, pCfg->AddrWidth);
    RF_SetRxAddr(RF_PIPE0, pCfg->TRxAddr, pCfg->AddrWidth);
    RF_SetRxPayloadLen(RF_PIPE0, sizeof(gRfConfig.RxBuf));

    RF_SetWorkMode(pCfg->WorkMode);
    
    /* RF tx setup time: 112us is minimum value */
    RF_SetTxSetupTime(pCfg->TxSetupTimeUs);

    if(pCfg->WorkMode == RF_WORKMODE_ENHANCE)
    {
        RF_SetTRxAckTimeout(pCfg->RxTimeoutUs);
        RF_SetAutoRetrans(250, 3); // 250us delay, 3 times retransmit
        RF_SetNoAck(pCfg->EnTxNoAck);
        RF_SetAckPayload(pCfg->EnAPL);
        RF_EnableDynamicPayload(RF_PIPE0, pCfg->EnDPL);
    }
    else
    {
        RF_SetAutoRetrans(250, 0); // You must disable the auto retransmit function, when chip is in normal mode
        RF_SetNoAck(ENABLE); // You must enable the Tx noack bit, when chip is in normal mode 
        RF_SetAckPayload(DISABLE);
        RF_EnableDynamicPayload(RF_PIPE0, DISABLE);
    }

    RF_ITConfig(RF_ITCONF_TX|RF_ITCONF_RX|RF_ITCONF_TX_MAX, ENABLE);
    RF_EnableIRQ();
}

3.2 297增强型工作模式

  • RF参数配置:

RFConfig_t xdata gRfConfig =
{
    /*.Channel        =  */ 2418,
    /*.TxPower        =  */ 7,
    /*.DataRate       =  */ RF_DR_1Mbps,
    /*.ChipMode       =  */ RF_CHIPMODE_XN297,
    /*.WorkMode       =  */ RF_WORKMODE_ENHANCE,
    /*.EnAPL          =  */ ENABLE,
    /*.EnDPL          =  */ ENABLE,
    /*.EnTxNoAck      =  */ DISABLE,
    /*.EnWhite        =  */ ENABLE,
    /*.Crc            =  */ RF_CRC_2BYTE,
    /*.AddrWidth      =  */ RF_ADRESS_SIZE,
    /*.TRxAddr        =  */ {0x10, 0x22, 0x55, 0x0F, 0x71},  // If you want to test multi-pipe0, you can use this address
//    /*.TRxAddr        =  */ {0x11, 0x22, 0x55, 0x0F, 0x71}, // If you want to test multi-pipe1, you can use this address
//    /*.TRxAddr        =  */ {0x12, 0x22, 0x55, 0x0F, 0x71}, // If you want to test multi-pipe2, you can use this address
//    /*.TRxAddr        =  */ {0x13, 0x22, 0x55, 0x0F, 0x71}, // If you want to test multi-pipe3, you can use this address
//    /*.TRxAddr        =  */ {0x14, 0x22, 0x55, 0x0F, 0x71}, // If you want to test multi-pipe4, you can use this address
//    /*.TRxAddr        =  */ {0x15, 0x22, 0x55, 0x0F, 0x71}, // If you want to test multi-pipe5, you can use this address
    /*.RxTimeoutUs    =  */ 1000,
    /*.TxSetupTimeUs  =  */ 200,
    /*.TxBuf          =  */ {0},
    /*.RxBuf          =  */ {0},
    /*.TxLen          =  */ 0,
    /*.RxLen          =  */ 0,
};
  • RF初始化相关参考代码同普通模式。