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. 工作模式说明¶
PN028 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 普通发送¶
RF初始化相关参考代码:
//开启RF时钟
RCC_PerCtrl1(RFCLKEN, 1);
//初始化RF相关配置寄存器
RF_Init();
//设置RF发送速率,速率可以修改,具体可以参考结构体RF_DataRate_t。
RF_SetRate(RF_DR_1Mbps);
//设置CRC规则,CRC策略可以修改,具体可以参考结构体RF_Crc_t。
RF_SetCrc(RF_CRC_2BYTE);
//设置发射功率,发射功率可以修改,具体可以参考结构体RF_TxPower_t。
RF_SetPower(RF_TXPWR_13dBm);
//设置发射通道,以下意义为2400+2=2402
RF_SetChannel(2);
RF应用相关参考代码:
//设置发射地址,注意接收端要和该地址一致才能才收到数据。
u8 addr[5] = {0xcc, 0xcc, 0xcc, 0xcc, 0xcc};
//工作模式的选择,分为297、24L01、BLE三种,具体可以参考结构体rf_mode_t。
RF_SetMode(rf_burst_mode);
//设置地址和地址位宽,注意一致。
RF_SetTxAddr(addr, RF_ADDR_WIDTH_3BYTE);
//进入发射模式
RF_EnterTxMode();
3.2 普通接收¶
RF初始化相关参考代码可以参考普通发送。
RF应用相关参考代码:
//设置接收地址,注意要和发送端一致才可以。
u8 addr[5] = {0xcc,0xcc,0xcc,0xcc,0xcc};
//工作模式的选择,分为297、24L01、BLE三种,具体可以参考结构体rf_mode_t。
RF_SetMode(rf_burst_mode);
//设置接收地址和地址位宽,注意一致。
RF_SetRxAddr(RF_PIPE0, addr, RF_ADDR_WIDTH_3BYTE);
//设置一次接收的数据长度,注意和发送端发送的数据长度一致。
RF_SetRxPayloadLen(RF_PIPE0,32);
//进入接收模式
RF_EnterRxMode();
3.3 增强发送¶
RF初始化相关参考代码可以参考普通发送。
RF应用相关参考代码:
//工作模式的选择,分为297和24L01,具体可以参考结构体rf_mode_t。
RF_SetMode(rf_enhance_mode);
//设置地址和地址位宽,注意一致。
RF_SetTxAddr(addr0, RF_ADDR_WIDTH_3BYTE);
//增强型在发送完会转接收,要接收来自接收端回复的ACK,所以要设置接收地址和地址位宽,注意一致。
RF_SetRxAddr(RF_PIPE0, addr0, RF_ADDR_WIDTH_3BYTE);
//控制不需要ACK的功能,注意和接收端一致,这里的配置是关闭了NoAck功能,即需要ACK。
RF_SetNoAck(FALSE);
//控制ACK包是否会携带Payload,这里的配置是可以携带Payload内容。
RF_SetAckPayload(TRUE);
//进入发射模式
RF_EnterTxMode();
//收发时间切换
enhance_tx_set(0xF,0x0,0x0,0x24);
3.4 增强接收¶
RF初始化相关参考代码可以参考普通发送。
RF应用相关参考代码:
//工作模式的选择,分为297和24L01,具体可以参考结构体rf_mode_t。
RF_SetMode(rf_enhance_mode);
//增强型在接收完会转发送,回复发送端的ACK,所以要设置发送地址和地址位宽,注意和接收端一致。
RF_SetTxAddr(addr0, RF_ADDR_WIDTH_3BYTE);
//设置接收地址和地址位宽,注意一致。
RF_SetRxAddr(RF_PIPE0, addr0, RF_ADDR_WIDTH_3BYTE);
//控制不需要ACK的功能,注意和接收端一致,这里的配置是关闭了NoAck功能,即需要ACK。
RF_SetNoAck(FALSE);
//控制ACK包是否会携带Payload,这里的配置是可以携带Payload内容。
RF_SetAckPayload(TRUE);
//进入接收模式
RF_EnterRxMode();
//收发时间切换
enhance_rx_set(0x0,0x0,0x4,0x7);