PRF 2.4G 开发指南¶
1 概述¶
本文介绍的内容有以下几点:
TRX例程功能:
发射端例程的功能:每隔500ms发送一次2.4G数据包,长度5个字节。
发射端例程的功能:接收发送端的2.4G信号,并将接收到的数据通过串口打印出来。
开发说明:
2.4g初始化配置
API介绍
SAMPLE运行流程
帧结构介绍
2 环境配置¶
环境要求
board:pan271x_evb
uart:显示串口输出log,uart端口P06(UART_RX)、P05(UART_TX),波特率115200
PC串口工具:Panchip Serial Assistant V0.0.011.exe
“PRF_TX_SAMPLE”的板子需要搭配和”PRF_RX_SAMPLE”的板子一起使用,两个例程的配置要一样。
编译和烧录:
项目位置:
TX端:”samples\proprietary_rf\prf_tx”。
RX端:”samples\proprietary_rf\prf_rx”。
TX端和RX端工程界面,如下图所示:

工程默认配置是XN297模式,增强型。
选择好后编译程序,用j-link烧录编译后的hex文件到pan271x_evb板子中。
3 演示说明¶
步骤
将接收端串口和发射端串口分别接到PC的USB端口上。
配置接收端和发送端。
观察PC串口工具的输出结果。
结果
发射端输出结果:

接收端输出结果:

4 开发说明¶
4.1 2.4G初始化配置¶
配置的结构体“pan_prf_config_t”,各成员介绍如下:
Type  | 
name  | 
Description  | 
|---|---|---|
prf_mode_t  | 
work_mode  | 
工作模式配置,包括普通型、增强型、自定义增强型  | 
prf_chip_mode_sel_t  | 
chip_mode  | 
xn297通信协议、NRF通信协议和HS62XX通信协议配置  | 
prf_trx_mode_t  | 
trx_mode  | 
收发模式配置  | 
prf_phy_t  | 
phy  | 
通信速率配置,可配置为1M、2M、CODED_S8、CODED_S2、250K、250K_S2、250K_S8  | 
prf_crc_sel_t  | 
crc  | 
数据包CRC配置,可配置为crc 8bit,crc 16bit,crc 24bit ,no crc  | 
prf_scramble_sel_t  | 
scr  | 
数据包扰码的配置,可配置为使用扰码和不使用扰码  | 
prf_mode_conf_sel_t  | 
mode_conf  | 
2.4g不同模式射频参数配置,设置deviation  | 
uint16_t  | 
rx_timeout  | 
接收超时时间配置,最大50000us  | 
uint16_t  | 
rf_channel  | 
2.4g频点配置,任意频点可设(2400Mhz~2484Mhz)  | 
uint8_t  | 
tx_no_ack  | 
配置增强型模式下tx是否需要ack  | 
uint8_t  | 
rx_length  | 
rx接收数据包长度配置,增强型模式配置不生效  | 
uint8_t  | 
sync_length  | 
接入地址长度配置,可配置为2、3、4、5字节  | 
uint8_t  | 
addr[5]  | 
接入地址的内容  | 
uint8_t  | 
crc_include_sync  | 
crc作用域是否包含接入地址(XN297和NRF24L01必须使能),NRF52可配  | 
uint8_t  | 
src_include_sync  | 
扰码作用域是否包含接入地址,XN297包含,NRF不包含  | 
uint8_t  | 
auto_pyl_flag  | 
是能后普通型也能动态payload,仅支持NRF模式,XN297模式不支持  | 
prf_pipe_t  | 
pipe  | 
设置不同地址通信通道(0~2)  | 
int8_t  | 
tx_power  | 
设置发射功率,范围(0dbm~12dbm)  | 
uint8_t  | 
pid_manual_flag  | 
pid手动配置的标志,使能后可以手动设置pid(0~3)  | 
prf_endian_t  | 
endian  | 
payload大小端配置,XN297L和NRF24L01都是大端,NRF52可配  | 
prf_mode_t:
Type  | 
Value  | 
Description  | 
|---|---|---|
PRF_MODE_NORMAL  | 
0  | 
普通型  | 
PRF_MODE_ENHANCE  | 
1  | 
增强型  | 
PRF_MODE_NORMAL_M1  | 
2  | 
自定义增强型  | 
prf_chip_mode_sel_t:
Type  | 
Value  | 
Description  | 
|---|---|---|
PRF_CHIP_MODE_SEL_XN297  | 
2  | 
XN297模式  | 
PRF_CHIP_MODE_SEL_NRF  | 
3  | 
NRF模式  | 
PRF_CHIP_MODE_SEL_NRF52  | 
4  | 
NRF52模式  | 
PRF_CHIP_MODE_SEL_HS62XX  | 
5  | 
HS62XX模式  | 
prf_trx_mode_t:
Type  | 
Value  | 
Description  | 
|---|---|---|
PRF_TX_MODE  | 
0  | 
2.4G发射  | 
PRF_RX_MODE  | 
1  | 
2.4G接收  | 
prf_phy_t:
Type  | 
Value  | 
Description  | 
|---|---|---|
PRF_PHY_1M  | 
1  | 
1M通信速率  | 
PRF_PHY_2M  | 
2  | 
2M通信速率  | 
PRF_PHY_CODED_S8  | 
3  | 
S8编码  | 
PRF_PHY_CODED_S2  | 
4  | 
S2编码  | 
PRF_PHY_250K  | 
5  | 
250k通信速率  | 
PRF_PHY_250K_S2  | 
6  | 
250K S2编码  | 
PRF_PHY_250K_S8  | 
7  | 
250K S8编码  | 
prf_crc_sel_t:
Type  | 
Value  | 
Description  | 
|---|---|---|
PRF_CRC_SEL_NOCRC  | 
0  | 
no crc  | 
PRF_CRC_SEL_CRC8  | 
1  | 
crc 8bit  | 
PRF_CRC_SEL_CRC16  | 
2  | 
crc 16bit  | 
PRF_CRC_SEL_CRC24  | 
3  | 
crc 24bit  | 
prf_scramble_sel_t:
Type  | 
Value  | 
Description  | 
|---|---|---|
PRF_SRC_SEL_NOSRC  | 
0  | 
不使能扰码  | 
PRF_SRC_SEL_EN  | 
1  | 
使能扰码  | 
prf_mode_conf_sel_t:
Type  | 
Value  | 
Description  | 
|---|---|---|
PRF_NRF_CONF  | 
0  | 
NRF模式deviation配置,1M PHY 160k,2M PHY 320K,250K PHY 160K  | 
PRF_NRF52_CONF  | 
1  | 
NRF52模式deviation配置,1M PHY 170k,2M PHY 330K,250K PHY 170K  | 
PRF_BLE_CONF  | 
2  | 
模拟BLE帧格式deviation配置,1M PHY 250k,2M PHY 500K,LR&250K PHY 250K  | 
PRF_XN297L_CONF  | 
3  | 
XN297模式deviation配置,1M PHY 300k,2M PHY 600K,250K PHY 170K  | 
prf_addr_length_sel_t:
Type  | 
Value  | 
Description  | 
|---|---|---|
PRF_ADDR_LENGTH_SEL_3  | 
3  | 
3 BYTE地址长度  | 
PRF_ADDR_LENGTH_SEL_4  | 
4  | 
4 BYTE地址长度  | 
PRF_ADDR_LENGTH_SEL_5  | 
5  | 
5 BYTE地址长度  | 
prf_pipe_t:
Type  | 
Value  | 
Description  | 
|---|---|---|
PRF_PIPE0  | 
1<<0  | 
管道0  | 
PRF_PIPE1  | 
1<<1  | 
管道1  | 
PRF_PIPE2  | 
1<<2  | 
管道2  | 
prf_endian_t:
Type  | 
Value  | 
Description  | 
|---|---|---|
PRF_BIG_ENDIAN  | 
0  | 
大端模式传输  | 
PRF_LITTLE_ENDIAN  | 
1  | 
小端模式传输  | 
4.2 API介绍¶
panchip_prf_set_data¶
void panchip_prf_set_data(panchip_prf_payload_t *p_payload);
TX模式下设置payload的内容和长度,RX模式下设置ack payload的内容和长度
panchip_prf_data_rec¶
uint8_t panchip_prf_data_rec(panchip_prf_payload_t *p_payload);
RX模式下获取接收的数据和长度,返回值是数据长度。必须在RX中断或者TX中断读取数据,在其他地方读数据会异常。
panchip_prf_set_chn¶
void panchip_prf_set_chn(pan_prf_config_t *p_config);
设置通信的频点,带内2400~2484任意频点可设。
panchip_prf_mode_conf_set¶
void panchip_prf_mode_conf_set(prf_mode_conf_sel_t conf);
设置deviation,不同模式下射频dev参数配置,可以选择BLE模式、NRF模式、XN297模式、NRF52模式。
panchip_prf_set_phy¶
void panchip_prf_set_phy(pan_prf_config_t *p_config);
设置通信速率,可以选择1M、2M、PRF_PHY_CODED_S8、PRF_PHY_CODED_S2、PRF_PHY_250K、PRF_PHY_250K_S2、PRF_PHY_250K_S8
panchip_prf_set_addr¶
void panchip_prf_set_addr(uint8_t *addr, uint8_t len, prf_pipe_t pipe, uint8_t trx_addr);
设置通信地址内容、长度、地址通道、地址类型。
地址类型分为以下三种:
trx_addr  | 
Value  | 
Description  | 
|---|---|---|
PRI_RF_MODE_SEL_TX  | 
0  | 
设置TX地址  | 
PRI_RF_MODE_SEL_RX  | 
1  | 
设置RX地址  | 
PRI_RF_MODE_SEL_TRX  | 
2  | 
设置TRX地址,TX和RX地址相同  | 
TX地址只有一个PIPE,RX地址有3个PIPE。
NOTE:地址内容不能出现连续的10101或者01010,否则接收性能会受影响。
panchip_prf_set_tx_noack¶
void panchip_prf_set_tx_noack(bool flag);
设置TX增强型模式下是否需要接收ACK,设置成true后,TX后不会进接收。
panchip_prf_carrier_start¶
void panchip_prf_carrier_start(uint16_t  tx_channel);
发射单载波,参数设置任意频点。必须在TX和RX退出后使用。
panchip_prf_read_data_rssi¶
int16_t panchip_prf_read_rssi(void);
收到数据后,在接收中断中获取数据强度的RSSI值。这个RSSI会缓存,收到新的数据后值会覆盖。
panchip_prf_read_carrier_rssi¶
int16_t panchip_prf_read_carrier_rssi(void);
获取载波强度的RSSI值,这个RSSI值是实时的,不会缓存。
panchip_prf_rx_length_irq_cfg¶
void panchip_prf_rx_length_irq_cfg(uint8_t value);
配置是否使能rx length err中断,当rx收到数据硬件解析出来的length值大于配置的rx length(结构体中“rx_length”字段),rx length err irq会产生,普通型和增强型接收都有效。在使用前需要先注册中断函数。
panchip_prf_set_crc¶
void panchip_prf_set_crc (pcrc_sel_t crc, uint8_t crc_include_sync);
设置crc的类型和crc的范围是否包含地址。
panchip_prf_set_whitening¶
void panchip_prf_set_whitening (prf_scramble_sel_t src, uint8_t src_include_sync);
设置白化类型和白化范围是否包含地址。
panchip_prf_tx_retrans_set¶
void panchip_prf_tx_retrans_set(uint8_t times, uint16_t interval_us);
设置tx端重传次数和重传间隔,重传次数最大7次,重传间隔最大32ms。
4.3 MULTI PIPE使用介绍¶
多pipe的使用主要在于接收端,发送端同时只有一个pipe,接收端同时有3个地址。
涉及到两个接口,panchip_prf_set_addr和panchip_prf_get_pipe。panchip_prf_set_addr为每个pipe设置不同的地址,接收端收到数据后可以使用panchip_prf_get_pipe获取当前收到数据对应的pipe地址。
4.4 中断介绍¶
中断介绍如如下代码所示:
void event_tx_fun(void)
{
	printk("tx done\n");
}		//增强型和普通型模式TX结束后会产生TX中断,TX退出,增强型TX完了之后会马上进入RX。
void event_rx_fun(void)
{
	panchip_prf_payload_t rx_payload;
	rx_payload.data_length = panchip_prf_data_rec(&rx_payload);
	printk("rx data:");
	data_printk(rx_payload.data, rx_payload.data_length);
}		//增强型和普通型模式RX收到数据后会进入RX中断,RX退出,增强型RX完了之后会马上进入TX。
void event_rx_timeout_fun(void)
{
	printk("rx timeout\n");
}		//接收超时后会进入timeout中断,RX退出
void event_crc_err_fun(void)
{
	printk("crc err\n");
}		//接收数据错误会进入crc中断,RX退出,不会进入TX
/*普通型TX,TX结束退出后产生TX中断,进入下一次TX后须调用"panchip_prf_trx_start"。*/
/*普通型RX,收到数据后会进入RX中断,接收超时会进入timeout中断,收到错误数据会进入crc中断,进入下一次RX后须调用"panchip_prf_trx_start"。*/
/*增强型TX,TX结束后硬件会自动进入RX,RX收到数据后会进入RX中断,接收超时会进入timeout中断,收到错误数据会进入crc中断,进入下一次TX后须调用"panchip_prf_trx_start"。*/
/*增强型RX,RX收到数据后会硬件会自动进入TX,TX结束退出后产生TX中断,接收超时会进入timeout中断,收到错误数据会进入crc中断,进入下一次RX后须调用"panchip_prf_trx_start"。*/
注意:在高性能的2.4g应用中尽量不要使用打印,会影响射频收发性能。增强型RX中断中不能有延时或者打印或者执行时间很长的接口,不然会影响TX中断从而导致时序错误。
6 2.4G帧结构介绍¶
兼容三种帧结构:xn297、nrf24l01、nrf52、hs26xx
6.1 xn297兼容帧结构¶
普通型:
3 byte  | 
2~5 byte  | 
0~255 byte  | 
0/1/2/3 byte  | 
|---|---|---|---|
preamble(0x710f55)  | 
addr  | 
payload  | 
crc(包含addr和payload)  | 
空中bit序:大端模式
增强型:在地址和payload之间插入signal(10bit)数据。
3 byte  | 
2~5 byte  | 
10bit  | 
0~64 byte  | 
0/1/2/3 byte  | 
|---|---|---|---|---|
preamble(0x710f55)  | 
addr  | 
signal  | 
payload  | 
crc(包含addr和payload)  | 
signal结构:
7bit  | 
2bit  | 
1bit  | 
|---|---|---|
数据长度标识(动态payload)  | 
PID标识 (判断是否是重发包)  | 
NO_ACK标识 (tx完是否需要ack)  | 
数据长度7bit最大包长发送可支持127byte,接收最大包长可支持128byte。
白化和crc的作用域包括addr+payload+signal。
6.2 nrf2401兼容帧结构¶
普通型:
空中bit序:大端模式
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。
增强型:在地址和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)  | 
数据长度6bit最大包长发送可支持63byte,接收最大包长可支持64byte。
nrf2401无白化,crc的作用域包括addr+payload+signal。
6.3 nrf52兼容帧结构¶
nrf52帧结构如下图所示:
nrf52帧结构¶
当s0=0,length=0,s1=0时,和nrf2401普通型帧结构一样。
当s0=0,length=6,s1=3时,和nrf2401增强型帧结构一样。payload长度最大32byte。
当s0=0,length=8,s1=3时,长包模式。payload长度最大255byte。
空中bit序:大小端模式可配
crc作用域:addr(可配)+s0+length+s1+payload
长包模式下,PAN271x signal结构如下:
8bit  | 
2bit  | 
1bit  | 
|---|---|---|
数据长度标识(动态payload)  | 
PID标识 (判断是否是重发包)  | 
NO_ACK标识 (tx完是否需要ack)  | 
6.4 HS26XX帧结构¶
普通型:
空中bit序:大端模式
1 byte  | 
2~5 byte  | 
2byte  | 
0~255byte  | 
1/2 byte  | 
|---|---|---|---|---|
preamble(0x55或者0xaa)  | 
addr  | 
guard  | 
payload  | 
crc(包含addr和payload)  | 
preamble:地址第一个bit为0,取0xaa;地址第一个bit为1,取0x55。
增强型:在guard和payload之间插入signal(9bit)数据。
1 byte  | 
2~5 byte  | 
9bit  | 
0~32byte  | 
1/2 byte  | 
|---|---|---|---|---|
preamble(0x55或者0xaa)  | 
addr  | 
signal  | 
payload  | 
crc(包含addr和payload)  | 
signal结构:
6bit  | 
2bit  | 
1bit  | 
|---|---|---|
数据长度标识(动态payload)  | 
PID标识 (判断是否是重发包)  | 
NO_ACK标识 (tx完是否需要ack)  | 
数据长度6bit最大包长发送可支持63byte,接收最大包长可支持64byte。
当芯片为hs6220时,guard内容为~addr0,addr0。
当芯片为hs6200时,guard内容为addr0,addr0。
hs26xx白化初始值为0x3D,白化作用域包括payload+signal;crc的作用域包括addr+payload+signal。
6.5 自定义帧结构¶
chip_mode字段为“PRF_CHIP_MODE_SEL_NORDIC”模式时,帧结构如下:

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

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