02_enhance 增强型发射例程

1. 简介

本例程展示了PAN211x的增强型(双向)通信功能。

工作流程:TX端首先发送数据,随后芯片自动切换至接收状态等待ACK数据包;RX端在接收到数据后会自动切换到发射状态并发送ACK数据包。当TX端收到ACK数据包后即完成一次完整的通信。

增强模式的主要优势在于双向通信时的自动状态切换速度更快,无需手动控制。但正因为状态切换由芯片自动完成,使用时需要充分了解增强模式下的时序特点。

2. 应用代码说明

2.1. 增强型参数配置与中断处理

相比普通型模式,增强型模式需要特别注意以下配置参数:

必选配置项:

  • WorkMode: 设置为增强型

  • TxMode: 设置为单次发射模式

  • RxMode: 设置为单次接收模式

Tx端:

TRxDelayTimeUs 设置为0,目的是为了在发射数据之后尽快切换到接收状态,在发射完成后将触发TX_IRQ中断。

RxTimeoutUs 设置为32000,目的是为了切换到接收数据之后等待一段时间,如果没有接收到ACK数据包,自动开始重新发射数据包。如果收到了ACK数据包则触发RX_IRQ中断。

AutoMaxCnt设置为3,AutoDelayUs设置为250,目的是为了在接收超时之后,自动重新发射数据包,最多重发3次,每次超时之后等待250us再进入发射状态,如果重发次数超过3次则触发MAX_RT_IRQ中断。

Rx端:

TRxDelayTimeUs 设置为16000,目的是为了在接收数据之后延时一段时间切换到发射状态,主要是给用户端足够的时间向FIFO写入ACK数据包的内容,另一方面也给Tx端足够的时间切换到接收状态。

更多参数的说明请见《PAN211x FIFO和帧格式使用指南》

2.2. 增强型的动态负载(Dynamic Payload)功能

与普通型不同的是,增强型可以开启EnDPL功能。此通常用于发射端需要发送不同长度数据包的场景。

发送端的数据长度将填入增强型帧格式中的长度字段。

接收端自动解析增强型帧格式的长度字段,用户通过读取对应的寄存器获取数据包长度。

相关代码如下:

u8 RecvLen = PAN211_GetRecvLen();
printf("+RecvLen=%d\n", RecvLen);
if(RecvLen > 0)
{
    PAN211_ReadFifo(TRX_FIFO, RxBuf, RecvLen);
}

当关闭动态数据包长度设置时,使用固定长度接收数据,数据包长度由RxLen决定。

2.3. TxNoAck功能

与普通型不同的是,增强型可以开启TxNoAck功能。启用无应答发送设置后,增强型帧格式中的TxNoAck字段将置1,这要求接收端不发送应答包,发射端也不会自动重传。

2.4. RSSI功能

普通型和增强型都可以开启RSSI功能,在收到包之后,可以通过读取RSSI寄存器获取收到包的信号强度。

3. 例程演示

例程位置:

01_SDK/example/02_enhance

修改参数:

pan211_port.h中的EASY_RF宏定义为0时,可通过修改gRfConfig结构体来配置参数。

pan211_port.h中的EASY_RF宏定义为1时,可使用配置导出工具替换对应工程的./src/easy_reg.h文件来配置参数。

使用步骤:

找到两块PAN211x开发板,分别作为Tx端和Rx端。

  1. 用Type-C数据线供电

  2. 用跳线帽连接电源跳线P9。

  3. 将电源切换开关S1切换至“USB”端。

  4. 使用串口模块连接到UART调试引脚P8。

  5. 分别打开txrx工程,编译后下载到两个PAN211x开发板上。

TX端:

CPU @ 64000000Hz
SPI-3LINE
>>>RF_IT_TX_IRQ[0x80].1
+RecvLen=32
<<<RF_IT_RX_IRQ[0x01].
RSSI=-20dBm
>>>RF_IT_TX_IRQ[0x80].2
+RecvLen=32
<<<RF_IT_RX_IRQ[0x01].
RSSI=-20dBm
>>>RF_IT_TX_IRQ[0x80].3
+RecvLen=32
<<<RF_IT_RX_IRQ[0x01].
RSSI=-19dBm

RX端:

CPU @ 64000000Hz
SPI-3LINE
+RecvLen = 32, cnt = 1
+RF_RXMODE=00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 
RSSI=-20dBm
>>>RF_IT_TX_IRQ[0x80].
+RecvLen = 32, cnt = 2
+RF_RXMODE=00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 
RSSI=-21dBm
>>>RF_IT_TX_IRQ[0x80].
+RecvLen = 32, cnt = 3
+RF_RXMODE=00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 
RSSI=-21dBm
>>>RF_IT_TX_IRQ[0x80].