PRF 2.4G开发指南¶
1 概述¶
本文档旨在介绍客户在开发2.4g帧结构、程序流程及应用时一些结构体变量、接口说明和注意事项。
2 2.4G帧结构介绍¶
兼容三种帧结构:xn297、nrf24l01、nrf52
xn297兼容帧结构¶
普通型:
3 byte |
3~5 byte |
1~64 byte |
0/1/2/3 byte |
---|---|---|---|
preamble(0x710f55) |
addr |
payload |
crc(包含addr和payload) |
空中bit序:大端模式
增强型:在地址和payload之间插入signal(10bit)数据。
3 byte |
3~5 byte |
10bit |
1~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) |
白化和crc的作用域包括addr+payload+signal。
nrf2401兼容帧结构¶
普通型:
空中bit序:大端模式
1 byte |
3~5 byte |
1~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 |
3~5 byte |
9bit |
1~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) |
nrf2401无白化,crc的作用域包括addr+payload+signal。
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,NRF52和PAN1080通信时CRC只能设成不包括地址。
长包模式下,PAN1080 signal结构如下:
8bit |
2bit |
1bit |
---|---|---|
数据长度标识(动态payload) |
PID标识 (判断是否是重发包) |
NO_ACK标识 (tx完是否需要ack) |
3 2.4G PID流程¶
tx和rx pid处理逻辑如下:
每一包数据都包括两位的PID(数据包标志位),来帮助接收端识别该数据是新数据包还是重发的数据包,防止多次存入相同的数据包,PID的生成和检测如上图所示。发送端的ack包未发生超时PID值加一。支持软件配置tx pid和rx pid。
4 2.4G初始化配置¶
配置的结构体“pan_prf_config_t”,各成员介绍如下:
Type |
name |
Description |
---|---|---|
prf_mode_t |
work_mode |
工作模式配置,包括普通型和增强型 |
prf_chip_mode_sel_t |
chip_mode |
xn297通信协议和nordic通信协议配置 |
prf_trx_mode_t |
trx_mode |
收发模式配置 |
prf_phy_t |
phy |
通信速率配置,可配置为1M和2M |
prf_crc_sel_t |
crc |
数据包CRC配置,可配置为crc 16bit,crc 8bit,crc 24bit ,no crc |
prf_scramble_sel_t |
src |
数据包扰码的配置,可配置为使用扰码和不使用扰码 |
uint16_t |
rx_timeout |
接收超时时间配置,最大50000us |
uint16_t |
rf_channel |
2.4g频点配置,任意频点可设(2402Mhz~2480Mhz) |
uint8_t |
tx_no_ack |
配置增强型模式下tx是否需要ack |
uint8_t |
nrf52_mode |
nordic的长包模式配置,最大payload的长度为255 |
uint8_t |
rx_length |
rx接收数据包长度配置,增强型模式下可不配置 |
uint8_t |
addr_length |
接入地址长度配置,可配置为3、4、5字节 |
uint8_t |
addr[5] |
接入地址的内容(xn297模式下可白化地址,防止出现长0和长1的地址) |
prf_dev_sel_t |
dev |
设置deviation,可以选择BLE模式(1M 250k;2M 500k),NRF模式(1M 160K;2M 320) |
int8_t |
tx_power |
设置发射功率,范围(-45dbm~7dbm) |
uint8_t |
pid_manual_flag |
pid手动配置的标志,使能后可以自定义pid |
prf_mode_t:
Type |
Value |
Description |
---|---|---|
PRF_MODE_NORMAL |
0 |
普通型 |
PRF_MODE_ENHANCE |
1 |
增强型 |
prf_chip_mode_sel_t:
Type |
Value |
Description |
---|---|---|
PRF_CHIP_MODE_SEL_BLE |
1 |
蓝牙模式 |
PRF_CHIP_MODE_SEL_XN297 |
2 |
XN297模式 |
PRF_CHIP_MODE_SEL_NORDIC |
3 |
NORCDIC模式 |
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_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_dev_sel_t:
Type |
Value |
Description |
---|---|---|
PRF_DEV_NRF |
1 |
NRF模式deviation配置,1M 170k,2M 340K |
PRF_DEV_BLE |
2 |
NRF模式deviation配置,1M 250k,2M 500K |
5 API介绍¶
panchip_prf_trx_start¶
void panchip_prf_trx_start(void);
调用此接口,普通型模式RX状态下开始RX,在TX状态下开始TX,增强型模式下,进行收发转换。
panchip_prf_set_data¶
void panchip_prf_set_data(panchip_prf_payload_t *p_payload);
TX模式下设置payload的内容和长度。
panchip_prf_set_ack_data¶
void panchip_prf_set_ack_data(panchip_prf_payload_t *p_payload);
RX模式下设置ack payload的内容和长度,ack without payload需要将data length设为0。
panchip_prf_data_rec¶
uint8_t panchip_prf_data_rec(panchip_prf_payload_t *p_payload);
RX模式下获取接收的数据和长度,返回值是数据长度。必须在RX中断中读取数据,在其他地方读数据会异常。
panchip_prf_set_chn¶
void panchip_prf_set_chn(pan_prf_config_t *p_config);
设置通信的频点,带内2400~2480任意频点可设,也可设置带外频点。必须在TX和RX退出后使用。
panchip_prf_set_trx_mode¶
void panchip_prf_set_trx_mode(prf_trx_mode_t trx_mode);
设置接收模式和发射模式,在prf是idle状态下调用。
panchip_prf_set_work_mode¶
void panchip_prf_set_work_mode(prf_mode_t work_mode);
设置普通型工作模式和增强型工作模式,在prf是idle状态下调用。
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_enable_rssi¶
void panchip_prf_enable_rssi(void);
使能获取数据强度的RSSI模式,在”panchip_prf_trx_start()”调用前使能。
panchip_prf_read_rssi¶
int16_t panchip_prf_read_rssi(void);
收到数据后,在接收中断中获取数据强度的RSSI值。这个rssi会缓存,收到新的数据后值会覆盖。
panchip_prf_enable_carrier_rssi¶
void panchip_prf_enable_carrier_rssi(void);
使能获取载波强度的RSSI模式,调用后不能接收数据。
panchip_prf_read_carrier_rssi¶
int16_t panchip_prf_read_carrier_rssi(void);
获取载波强度的RSSI值,这个rssi值是实时的,不会缓存。
panchip_prf_disable_carrier_rssi¶
void panchip_prf_disable_carrier_rssi(void);
载波强度RSSI获取后,关闭rssi功能。关闭后可以正常接收数据。
6 中断介绍¶
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中断从而导致时序错误。