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

NDK PRF 2.4G开发指南

1 概述

本文介绍的内容有以下几点:

  1. TRX例程功能:

    • 发射端例程的功能:每隔333ms发送一次2.4G数据包,长度5个字节。

    • 发射端例程的功能:接收发送端的2.4G信号,并将接收到的数据通过串口打印出来。

  2. 开发说明:

    • 2.4g初始化配置

    • API介绍

    • SAMPLE运行流程

    • 帧结构介绍

2 环境配置

  1. 环境要求

    • board:pan1070_evb

    • uart:显示串口输出log,uart端口P16(UART_RX)、P17(UART_TX)

    • PC串口工具:Panchip Serial Assistant V0.0.010.exe

    “PRF_TX_SAMPLE”的板子需要搭配和”PRF_RX_SAMPLE”的板子一起使用,两个例程的CONFIG要选择一样。

  2. 编译和烧录:

    1. 项目位置:

    • TX端:”03_MCU\mcu_samples\PRF_TX_SAMPLE”。

    • RX端:”03_MCU\mcu_samples\PRF_RX_SAMPLE”。

    1. TX端和RX端选择project target,如下图所示:

    工程有四种project target,分别对应如下四种不同的配置:

    • B_250k,250k私有调制方式

    • NRF52 250k,可以和nrf52832 250k通信,GFSK调制方式

    • XN297 1M,可以和xn297 1M phy通信

    • NRF 2M,可以和nrf24l01 2M phy 通信

​ 不同的配置也是可以修改的,分别在不同target的”sample_config”文件中,用户可以根据自己的需求修改相应的配置。

  1. 选择好后编译程序,用j-link烧录编译后的hex文件到pan1070_evb板子中。

3 演示说明

  1. 步骤

    • 将接收端串口和发射端串口分别接到PC的USB端口上。

    • 配置接收端和发送端。

    • 观察PC串口工具的输出结果。

  2. 结果

    发射端输出结果:

    接收端输出结果:

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通信协议和nordic通信协议配置

prf_trx_mode_t

trx_mode

收发模式配置

prf_phy_t

phy

通信速率配置,可配置为1M、2M、CODED_S8、CODED_S2、250K

prf_crc_sel_t

crc

数据包CRC配置,可配置为crc 16bit,crc 8bit,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频点配置,任意频点可设(2402Mhz~2480Mhz),也可配置带外频点,时间较长

uint8_t

tx_no_ack

配置增强型模式下tx是否需要ack

prf_trf_t

trf_type

特殊通信模式设置,normal模式、nrf52模式和b250k模式

uint8_t

rx_length

rx接收数据包长度配置,增强型模式配置不生效

uint8_t

sync_length

接入地址长度配置,可配置为3、4、5字节

uint8_t

addr[5]

接入地址的内容(xn297模式下可白化地址,防止出现长0和长1的地址)

uint8_t

crc_include_sync

crc作用域是否包含接入地址(XN297和NRF24L01必须使能),NRF52可配

uint8_t

src_include_sync

扰码作用域是否包含接入地址,XN297包含,NRF不包含

prf_pipe_t

pipe

设置不同地址通信通道(0~7)

int8_t

tx_power

设置发射功率,范围(-45dbm~9dbm)

uint8_t

pid_manual_flag

pid手动配置的标志,使能后可以手动设置pid(0~3)

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_BLE

1

蓝牙模式(BLE和2.4g模式切换)

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_PHY_CODED_S8

3

S8编码PHY

PRF_PHY_CODED_S8

4

S2编码PHY

PRF_PHY_250K

5

250k通信速率

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_DEV_NRF

1

NRF模式deviation配置,1M 170k,2M 320K

PRF_DEV_BLE

2

NRF模式deviation配置,1M 250k,2M 500K

PRF_G_250K_CONF

3

GFSK调制250K通信速率射频参数配置

PRF_B_250K_CONF

4

私有调制250K通信速率射频参数配置(B_250K)

prf_addr_length_sel_t:

Type

Value

Description

PRF_ADDR_LENGTH_SEL_2

2

2 BYTE地址长度

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_PIPE3

1<<3

管道3

PRF_PIPE4

1<<4

管道4

PRF_PIPE5

1<<5

管道5

PRF_PIPE6

1<<6

管道6

PRF_PIPE7

1<<7

管道7

prf_trf_t:

Type

Value

Description

PRF_TRF_NORMAL

0

普通模式传输

PRF_TRF_NRF52

1

NRF长包模式(payload最大255byte)传输

PRF_TRF_B_250K

2

B_250K通信速率模式传输

prf_endian_t:

Type

Value

Description

PRF_BIG_ENDIAN

0

大端模式传输

PRF_LITTLE_ENDIAN

1

小端模式传输

4.2 API介绍

panchip_prf_init

void panchip_prf_init(pan_prf_config_t *p_config);

初始化配置的结构体“pan_prf_config_t

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_switch_prf

void panchip_switch_prf(pan_prf_config_t *p_config);

切换通信协议的帧结构,XN297模式和NRF模式。

panchip_prf_set_chn

void panchip_prf_set_chn(pan_prf_config_t *p_config);

设置通信的频点,带内2400~2480任意频点可设,也可设置带外频点,带外频点配置的时间比带内要长。频点必须在TX和RX退出后使用。

panchip_prf_set_tx_pwr

void panchip_prf_set_tx_pwr(int8_t tx_pwr);

设置发射的功率,功率范围-45dbm~9dbm。

panchip_prf_mode_conf_set

void panchip_prf_mode_conf_set(prf_mode_conf_sel_t conf);

设置deviation,不同模式下射频dev参数配置,可以选择BLE模式、NRF模式、GFSK 250K、私有调制250K

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

panchip_prf_set_trx_mode

void panchip_prf_set_trx_mode(prf_trx_mode_t trx_mode);

设置接收模式和发射模式,在idle状态下调用。

panchip_prf_set_work_mode

void panchip_prf_set_work_mode(prf_mode_t work_mode);

设置普通型工作模式和增强型工作模式,在idle状态下调用。

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地址只有一个PIPERX地址有8PIPE

NOTE:地址的最后一个字节不能出现连续的6个bit为0或者为1。

panchip_prf_set_tx_noack

void panchip_prf_set_tx_noack(bool flag);

设置TX增强型模式下是否需要接收ACK,设置成true后,TX后不会进接收。

NOTE:该字段和NRF52系列的noack字段是相反的,PAN1070的true对应NRF52的false,PAN1070的false对应NRF52的true。由于PAN1070该字段是硬件操作的,适配需要修改NRF52的软件。

PAN1070和NRF2401、XN297通信无此问题。

panchip_prf_rx_timeout

void panchip_prf_rx_timeout(uint16_t time);

设置接收的超时时间,单位us,最大50000us

panchip_prf_reset

void panchip_prf_reset(void);

复位PRF状态机,使其处于IDLE状态。

panchip_prf_rx_stop

void panchip_prf_rx_stop(void);

退出RX模式,RX退出后会产生timeout中断。

panchip_prf_pid_cfg

void panchip_prf_pid_cfg(uint8_t pid);

增强型模式手动设置TX PIDPID设置的范围是0~3

panchip_white_init_value

void panchip_white_init_value(uint8_t value);

白化使能后,白化初始值设置,默认是0x7f

panchip_prf_carrier_start

void panchip_prf_carrier_start(uint16_t  tx_channel);

发射单载波,参数设置任意频点。必须在TX和RX退出后使用。

panchip_prf_carrier_stop

void panchip_prf_carrier_stop(void);

退出发射单载波模式。

panchip_prf_read_rssi

int16_t panchip_prf_read_rssi(void);

收到数据后,在接收中断中获取数据强度的RSSI值。这个RSSI会缓存,收到新的数据后值会覆盖。获取RSSI值也可直接使用变量prf_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功能。关闭后可以正常接收数据。

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_get_pipe

uint8_t panchip_prf_get_pipe (void);

收到数据获取地址通道号,范围0~7。

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_set_endian

void panchip_prf_set_endian (prf_endian_t endian);

设置payload数据传输的大小端。

4.3 MULTI PIPE使用介绍

  1. pipe的使用主要在于接收端,发送端同时只有一个pipe,接收端同时有8个地址。

  2. 涉及到两个接口,panchip_prf_set_addrpanchip_prf_get_pipepanchip_prf_set_addr为每个pipe设置不同的地址,接收端收到数据后可以使用panchip_prf_get_pipe获取当前收到数据对应的pipe地址。

  3. 详细使用情况请参考例程” PRF_RX_MULTI_PIPE”和” PRF_TX_MULTI_PIPE”。RX端将收到的数据打印出来,同时打印当前的pipe通道号,TX端每1s切换不同pipe通道,同时每个pipe通道配置相应的地址。注意:接收端在增强型模式下收到数据后需要配置TX地址,地址为当前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中断从而导致时序错误。

5 Sample运行流程

prf_sample_rx例程运行流程

如下图所示:

image

RX例程流程图

prf_sample_tx例程运行流程

如下图所示:

image

TX例程流程图

6 2.4G帧结构介绍

兼容三种帧结构:xn297、nrf24l01、nrf52

6.1 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)

数据长度7bit最大包长发送可支持127byte,接收最大包长可支持128byte。

白化和crc的作用域包括addr+payload+signal。

6.2 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)

数据长度6bit最大包长发送可支持63byte,接收最大包长可支持64byte。

nrf2401无白化,crc的作用域包括addr+payload+signal。

6.3 nrf52兼容帧结构

nrf52帧结构如下图所示:

image

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

长包模式下,PAN1070 signal结构如下:

8bit

2bit

1bit

数据长度标识(动态payload)

PID标识 (判断是否是重发包)

NO_ACK标识 (tx完是否需要ack)

6.4 自定义帧结构

chip_mode字段为“PRF_CHIP_MODE_SEL_NORDIC”模式时,帧结构如下:

image

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

image

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

6.5 B250K帧结构

image

使用nrf普通型帧结构进行兼容。 B250K中payload长度为8bit,而且最大payload(包含addr在内)长度为255.另外,length字段固定为1个字节。

Preamble长度有:2/3/4/6/8/12/16/24byte, 帧速率为250K。

7 2.4G PID流程

tx和rx pid处理逻辑如下:

image

PID生成和检测

每一包数据都包括两位的PID(数据包标志位),来帮助接收端识别该数据是新数据包还是重发的数据包,防止多次存入相同的数据包,PID的生成和检测如上图所示。发送端的ack包未发生超时PID值加一。支持软件配置tx pid和rx pid。