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里边,帧格式如下:
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。
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初始化相关参考代码同普通模式。