Radio 用户指南
RTL87x2x 2.4G模块是一个功能完善的2.4GHz收发机,可以灵活地用于私有无线协议开发。具体特点列举如下:
带宽范围:2348~2530MHz,步进1MHz
调制方式:1M/2Mbps GFSK
编码:whitening、CRC
可调的帧结构
模式:oneshot/periodic/GPIO triggered PTX,oneshot/continuous PRX,auto ACK
数据 DMA 搬运
环境干扰检测(PSD)
系统框图
2.4G模块软硬件两部分的 系统框图 如下。

系统框图
硬件组成部分:
IO:和2.4G相关的外设,包括GPIO、enhance timer
BTMAC&DMA:是 BT 模块,会为2.4G功能提供支撑
2.4G MAC:负责2.4G Link Layer行为
PM:功耗管理(Power Manager)
软件组成部分:
2.4G driver:包含寄存器访问封装、初始化、MAC状态管理、依赖模块初始化和封装、内存管理等
2.4G protocol:私有协议,不在本文介绍范围
功能介绍
帧格式
2.4G Radio模块支持的帧结构由Preamble、Access Address、Header、Payload、CRC这5部分组成。

帧结构
- Preamble
长度可配置,多字节时每个字节的内容相同。内容根据access address字段的第一个bit决定。 如果access address bit0为0,则preamble为0xAA,否则preamble为0x55。
- Access Address
Access Address用于设备过滤,接收到的封包只有access address匹配才会进一步处理。 所以一个通信方向上,收发双端必须配置成一样。长度可配置。
- Header
Header结构由三部分组成。
Header Prefix
Length
Header Suffix
每个字段的长度和内容都可以独立配置。Length仅包含payload部分的长度。

Header结构
- Payload
封包数据部分。长度是可变的,由Header里的Length字段指定。
- CRC
帧校验字段。校验范围为Header和Payload,CRC支持配置长度、生成多项式和初值。
白化编码
2.4G Radio模块支持数据白化编解码,防止数据流里出现过长的连续0或者连续1。 白化的范围为header、payload和CRC。编码支持配置长度、生成多项式和初值。
状态
2.4G模块有4种状态:Standby、PSD、PTX和PRX。不同的状态不能共存,需要软件下指令切换状态。
分别处于PTX和PRX状态的两个设备,可以扮演点对点2.4G通信的两端角色: PRX状态的设备作为被动侦听角色,PTX状态的设备作为主动发送角色。 PSD是做环境信号强度检测的,当需要评估环境中的干扰情况时,可以指定一个或多个信道做检测。

状态机
PTX和PRX两个角色都有多个模式选项可以选择,每个模式可以独立地选择开启或者关闭。
重复模式
在PTX角色下,可以配置为oneshot或者periodic两种模式。
重复模式 |
说明 |
---|---|
Oneshot模式 |
软件每下发一次使能PTX指令,硬件就会发送一次数据,然后自动切回Standby状态。 |
Periodic模式 |
软件只需下发使能PTX指令一次,硬件就会持续地周期性发送数据,直到软件主动下发失能PTX指令。 |
在PRX角色下,可以配置为oneshot或者continuous两种模式。
重复模式 |
说明 |
---|---|
Oneshot模式 |
软件每下发一次使能PRX指令,硬件就会启动一个侦听窗口。 如果窗口内有侦听到数据,则收下第一笔数据,然后硬件自动切回Standby状态。 否则,窗口超时后也会自动取消RX,切回Standby状态。 |
Continuous模式 |
软件使能PRX后,硬件会一直侦听。如果收到数据,数据接收完后会继续侦听,直到软件主动下发失能PRX指令。 |
ACK模式
在点对点通信中,一端发送一笔封包,另一端会回复一笔封包,这笔回复封包被称为应答ACK。 Time of Inter Frame Space (TIFS)对应着这两个封包之间的时间间隔,如图TIFS所示。

TIFS
PTX和PRX两个角色都支持自动ACK模式,打开后会自动处理应答。
PTX角色打开ACK模式后,每次发送数据后,在经过帧间隔时间TIFS后,会开启ACK侦听窗口。 如果窗口内听到数据则收下这笔数据,否则窗口超时关闭侦听。
PRX角色打开ACK模式后,每次收到数据后,在经过帧间隔时间TIFS后,会自动发送数据作为ACK。 如果是continuous模式下,ACK之后会继续RX。
GPIO Triggered PTX模式
PTX角色支持GPIO trigger模式。GPIO trigger模式打开后,在GPIO信号触发之后,硬件会自动下达使能PTX指令。 这个模式可以消除软件介入的抖动,可以应用于低抖动数据发送的应用场景。
子状态机
下面会分别介绍每个状态不同模式下的子状态机。
PTX状态机

ptx periodic mode状态机

ptx oneshot mode状态机
PRX状态机

prx continuous mode状态机

prx oneshot mode状态机
PSD状态机

PSD状态机
TRX时序图
以上章节介绍了PTX角色和PRX角色在不同模式下的TRX行为,TRX时序图如下。 图中PTX角色oneshot/periodic模式和PRX角色oneshot模式的虚线和虚线框, 是对应可选配的ACK模式,即只有ACK mode打开时,才有相应的行为。 GPIO Triggered PTX模式下,GPIO信号相当于图中Enable指令,即由GPIO信号trigger PTX。

TRX时序图
指令
PRO_INSTRUCTION
寄存器为指令下发寄存器,使用各个指令会切换radio进入相应的状态。
支持的指令如下表。
指令码 |
指令类型 |
说明 |
---|---|---|
0 |
ptx enable |
进入ptx状态 |
1 |
prx enable |
进入prx状态 |
2 |
ptx disable |
退出ptx状态 |
3 |
prx disable |
退出prx状态 |
4 |
psd enable |
进入PSD状态 |
5 |
psd disable |
退出PSD状态 |
中断
Radio运行时会产生各类中断,具体如下:
中断类型 |
说明 |
---|---|
tx interrupt |
tx done时触发 |
rx interrupt |
rx timeout或者rx packet时触发 |
tx early interrupt |
ptx的periodic模式下,除了第一次,以后每次tx prepare前触发 |
gpio interrupt |
gpio trigger ptx模式下,检测到gpio信号时触发 |
kill ptx interrupt |
ptx disable完成时触发 |
kill prx interrupt |
prx disable完成时触发 |
reset trigger interrupt |
reset radio完成时触发 |
psd interrupt |
psd完成时触发 |
除了PSD interrupt,所有中断的中断标志都是在 PRO_MISR
寄存器里。
除了tx interrupt和rx interrupt,所有中断都是通过将对应中断标志位写1来清除。
tx interrupt和rx interrupt的中断只有在tx stack和rx stack被清空时才会被清除,
在TRX Stack会介绍。
PSD interrupt的中断标志和中断清除都是由底层实现,不需要2.4G控制。
TRX Stack
Radio在触发tx interrupt的同时会将tx的各类信息一起打包送入tx stack中, 在触发rx interrupt的同时会将rx的各类信息一起打包送入rx stack中。 软件可以在中断处理程序里使用这些信息,并且只有将这些信息读出来,对应中断才会被清除。
tx stack信息包含以下register:
PRO_TX_STACK
PRO_TX_HS_LOWER
PRO_TX_HS_UPPER
PRO_TX_LENGTH (tx stack读出栈)
PRO_TX_CLK_LOWER
PRO_TX_CLK_UPPER
rx stack信息包含以下register:
PRO_RSSI
PRO_LENGTH_INCLUDE_ADDON
PRO_LENGTH
PRO_RX_STACK
PRO_RX_HP
PRO_RX_CRC_LOWER
PRO_RX_CRC_UPPER
PRO_ACCHIT_CLK_LOWER
PRO_ACCHIT_CLK_UPPER
PRO_RX_HS_LOWER
PRO_RX_HS_UPPER (rx stack读出栈)
trx stack是FIFO结构,深度为4,每个成员包含上述一组寄存器信息。
硬件在trx时会自动push进trx stack的FIFO中。
软件在读寄存器 PRO_TX_LENGTH
时会自动pop tx stack的FIFO,在读寄存器 PRO_RX_HS_UPPER
时会自动pop rx stack的FIFO。
为了确保寄存器内容正常,读trx stack里的其他寄存器需要在读触发pop动作的寄存器之前。
TRX Data FIFO
Radio发送和接收数据是带有FIFO。TX FIFO大小为8笔数据,RX FIFO大小为2KB。
当TX FIFO为空时,即TX FIFO的read pointer等于write pointer,硬件会发送empty packet。 软件往TX FIFO里送数据时,会将TX FIFO的write pointer +1。 硬件已经发送一笔数据后,可以继续重传该笔数据,也可以更新TX FIFO的read pointer + 1切换下一笔数据。
当硬件收到封包后,会自动送进RX FIFO,并触发rx interrupt。软件在rx interrupt服务程序里可以去读RX FIFO取出数据。
多通道
通过多通道可以实现多对多通信。每个通道都有独立的TX FIFO和一些独立的参数,例如access address。 有些参数是每个通道独立的,也有些参数是所有通道公用的。 多通道的参数注意区分HW register名字里面带数字的,driver API形参里面带entry参数的。 PTX和PRX角色都支持多通道收发报文。
DLPS
只有radio在standby状态时,才允许进入 DLPS 状态。
Driver
Driver文件位于SDK的 subsys\ppt\driver
(旧版SDK的 src\app\ppt_driver
)目录下。
该目录下有两个子目录 common
和 simple
。
common目录里提供的是基础接口,包含基础的register访问接口、通用的配置接口和一些基础API。
simple目录里提供的是基于common接口的简单封装,包含初始化、模式管理、内存管理和状态机管理等,简化用户使用2.4G模块。
2.4G模块的功能非常丰富,2.4G私有协议和应用需求更是千变万化的,因此simple目录下简单封装不可能满足所有需求。 未来我们会持续完善simple封装,或者提供新封装的选项。用户也可以基于common目录提供的基础接口自行拓展。
Common
common模块的主要文件有:
ppt_hw_reg.h
ppt_driver.h
ppt_driver.c
Register访问
寄存器都是2 Byte长度的。他们的定义都在头文件 ppt_hw_reg.h
里,包含寄存器名和字段定义。
寄存器名示例如下。
#define PRO_INSTRUCTION 0x0
#define PRO_BASE0_LOWER 0x4
#define PRO_BASE0_UPPER 0x6
寄存器字段定义示例下。
/* 0x0
7:0 RW instruction 0x0
15:8 RO rsvd 0x0
*/
typedef union _PRO_INSTRUCTION_TYPE
{
uint16_t d16;
struct
{
uint16_t instruction: 8;
uint16_t rsvd: 8;
};
} PRO_INSTRUCTION_TYPE;
/* 0x4
15:0 RW base0[15:0] 0x0
*/
typedef union _PRO_BASE0_LOWER_TYPE
{
uint16_t d16;
struct
{
uint16_t base0_15_0;
};
} PRO_BASE0_LOWER_TYPE;
/* 0x6
15:0 RW base0[31:16] 0x0
*/
typedef union _PRO_BASE0_UPPER_TYPE
{
uint16_t d16;
struct
{
uint16_t base0_31_16;
};
} PRO_BASE0_UPPER_TYPE;
ppt_driver.h
和 ppt_driver.c
里提供了访问寄存器的函数和宏。宏提供的接口更丰富,建议使用宏去访问寄存器。
寄存器读写的函数如下:
函数 |
功能 |
---|---|
|
读寄存器 |
|
写寄存器 |
寄存器访问的宏如下:
宏 |
功能 |
---|---|
|
读寄存器 |
|
写寄存器 |
|
更新寄存器的部分bit位 |
|
读寄存器字段 |
|
写寄存器字段 |
|
更新寄存器字段的部分bit位 |
|
更新寄存器字段 |
RF Channel
信道是由bank index和channel index两个参数指定。分为3个bank,每个bank支持的频段如下表。channel index是相对bank起始频点的偏移。例如2403MHz对应bank 0, channel 1。
bank |
频段 |
---|---|
0 |
2402~2480MHz |
1 |
2348~2426MHz |
2 |
2452~2530MHz |
调用 ppt_set_phy_channel()
,传入频率,会自动换算为bank和channel。
TX Power
调用 ppt_set_tx_power_dbm()
设置tx power。
PHY Type
phy type是分rx phy和tx phy,且rx phy是所有通道公用的,tx phy是每个通道独立的。
ppt_set_phy_rx_type()
设置rx phy。ppt_set_phy_tx_type()
设置tx phy。帧格式
帧格式配置涉及到preamble、access adress、header和CRC。其中preamble每个通道独立,而address、hp、length和hs是所有通道公用的。CRC length是所有通道公用的,CRC poly和init是每个通道独立的。
ppt_set_preamble_len()
设置preamble长度。ppt_set_pkt_format()
设置帧格式。ppt_set_crc_param()
设置CRC公用参数。ppt_set_crc_entry_param()
设置CRC通道参数。Whitening
whitening是默认打开的。whitening开关是所有通道公用的,length、poly和init是每个通道独立的。
ppt_set_white_param()
设置whitening公用参数。ppt_set_white_entry_param()
设置whitening通道参数。TIFS
当使用ACK模式时,需要配置两端的TIFS参数一致。
调用 ppt_set_tifs()
设置TIFS参数。
TX Access Address
tx access address支持4byte或5byte。
调用 ppt_set_tx_addr()
设置tx access address参数。
RX Access Address
rx access address支持4byte或5byte。
调用 ppt_set_rx_addr()
设置rx access address参数。
TX Header
tx header包括hp、length和hs三个字段。
ppt_set_hp()
设置hp参数。ppt_set_hs()
设置hs参数。当tx完成时,tx header信息也可以在tx stack里得到确认,如下所示。
/* read concerned tx stack registers before pop tx stack */
PRO_TX_STACK_TYPE tx_stack = {.d16 = RD_PPT_REG(PRO_TX_STACK)}; // hp located at tx_stack.hp
PRO_TX_HS_LOWER_TYPE tx_hs_lower = {.d16 = RD_PPT_REG(PRO_TX_HS_LOWER)};
PRO_TX_HS_UPPER_TYPE tx_hs_upper = {.d16 = RD_PPT_REG(PRO_TX_HS_UPPER)};
uint32_t tx_hs = tx_hs_lower.tx_hs_15_0 + (tx_hs_upper.tx_hs_30_16 << 16);
/* pop tx stack */
PRO_TX_LENGTH_TYPE tx_length = {.d16 = RD_PPT_REG(PRO_TX_LENGTH)};
RX Header
rx header包括hp、length和hs三个字段。其内容全部存在rx stack里,在pop rx stack时获取,如下所示。
/* read concerned rx stack registers before pop rx stack */
PRO_RX_HP_TYPE rx_hp = {.d16 = RD_PPT_REG(PRO_RX_HP)};
PRO_LENGTH_TYPE rx_length = {.d16 = RD_PPT_REG(PRO_LENGTH)};
PRO_RX_HS_LOWER_TYPE rx_hs_lower = {.d16 = RD_PPT_REG(PRO_RX_HS_LOWER)};
/* pop rx stack */
PRO_RX_HS_UPPER_TYPE rx_hs_upper = {.d16 = RD_PPT_REG(PRO_RX_HS_UPPER)};
TX Data FIFO
发送数据是放在tx data fifo里,发送前push进fifo,发送完需要pop出fifo。push进fifo的ram地址只能是buffer ram类型的。
ppt_push_tx_fifo()
将数据push进fifo。ppt_trigger_fw_ack()
将数据pop出fifo。RX Data FIFO
软件使用pop rx data fifo操作读取接收数据。pop出fifo的ram地址只能是buffer ram类型的。
需要注意,FIFO里数据不仅包含payload,还会包含header。如果header总长度不是2字节对齐时,HW会自动补齐送进FIFO。
RX的payload长度是从rx stack的寄存器 PRO_LENGTH
获取。
调用 ppt_pop_rx_fifo()
读取接收数据。
中断
中断服务程序需要注册才能生效,可以处理的中断类型如中断所描述。
调用 ppt_reg_handler()
注册中断服务程序。
中断服务程序示例如下:
static PPT_ISR_SECTION void ppt_isr_handler(void)
{
PRO_MISR_TYPE reg_misr;
reg_misr.d16 = RD_PPT_REG(PRO_MISR);
APP_PRINT_INFO1("ppt_isr_handler: 0x%04x", reg_misr.d16);
if (reg_misr.tx_int)
{
/* read concerned tx stack registers before pop tx stack */
PRO_TX_STACK_TYPE tx_stack = {.d16 = RD_PPT_REG(PRO_TX_STACK)};
PRO_TX_HS_LOWER_TYPE tx_hs_lower = {.d16 = RD_PPT_REG(PRO_TX_HS_LOWER)};
PRO_TX_HS_UPPER_TYPE tx_hs_upper = {.d16 = RD_PPT_REG(PRO_TX_HS_UPPER)};
uint32_t tx_hs = tx_hs_lower.tx_hs_15_0 + (tx_hs_upper.tx_hs_30_16 << 16);
PRO_TX_CLK_LOWER_TYPE tx_clk_lower = {.d16 = RD_PPT_REG(PRO_TX_CLK_LOWER)};
PRO_TX_CLK_UPPER_TYPE tx_clk_upper = {.d16 = RD_PPT_REG(PRO_TX_CLK_UPPER)};
/* pop tx stack */
PRO_TX_LENGTH_TYPE tx_length = {.d16 = RD_PPT_REG(PRO_TX_LENGTH)};
APP_PRINT_INFO7("ptx: tx no tx %d, empty %d, tptr %d, entry %d, hp 0x%02x, len %d, hs 0x%08x",
tx_stack.is_no_tx, tx_stack.is_empty, tx_stack.tx_ptr, tx_stack.tx_entry_1_0, tx_stack.tx_hp,
tx_length.tx_length, tx_hs);
}
if (reg_misr.rx_int)
{
/* read concerned rx stack registers before pop rx stack */
PRO_RSSI_TYPE rssi = {.d16 = RD_PPT_REG(PRO_RSSI)};
PRO_LENGTH_TYPE rx_length = {.d16 = RD_PPT_REG(PRO_LENGTH)};
PRO_RX_STACK_TYPE rx_stack = {.d16 = RD_PPT_REG(PRO_RX_STACK)};
PRO_RX_HP_TYPE rx_hp = {.d16 = RD_PPT_REG(PRO_RX_HP)};
PRO_ACCHIT_CLK_LOWER_TYPE acchit_clk_lower = {.d16 = RD_PPT_REG(PRO_ACCHIT_CLK_LOWER)};
PRO_ACCHIT_CLK_UPPER_TYPE acchit_clk_upper = {.d16 = RD_PPT_REG(PRO_ACCHIT_CLK_UPPER)};
PRO_RX_CRC_LOWER_TYPE rx_crc_lower = {.d16 = RD_PPT_REG(PRO_RX_CRC_LOWER)};
PRO_RX_CRC_UPPER_TYPE rx_crc_upper = {.d16 = RD_PPT_REG(PRO_RX_CRC_UPPER)};
PRO_RX_HS_LOWER_TYPE rx_hs_lower = {.d16 = RD_PPT_REG(PRO_RX_HS_LOWER)};
/* pop rx stack */
PRO_RX_HS_UPPER_TYPE rx_hs_upper = {.d16 = RD_PPT_REG(PRO_RX_HS_UPPER)};
uint32_t rx_hs = rx_hs_lower.hs_15_0 + (rx_hs_upper.hs_30_16 << 16);
if (rx_stack.rx_time_out || rx_stack.rx_hit == false)
{
APP_PRINT_ERROR0("ptx: rx timeout");
}
else if (rx_stack.rx_abort_rd)
{
APP_PRINT_ERROR0("ptx: rx abort");
}
else if (rx_stack.is_crc_error)
{
APP_PRINT_ERROR0("ptx: rx crc error");
}
else
{
rx_num += 1;
uint8_t rx_entry = PPT_RX_STACK_ENTRY(rx_stack);
uint16_t rx_len = rx_length.d16 + PDU_HEADER_LEN;
uint8_t *rx_buffer = ppt_pop_rx_data_by_entry(rx_entry, rx_len);
APP_PRINT_INFO6("ptx: rx count %d, rx stack 0x%04x, len (incl header) %d, hp 0x%02x, hs 0x%08x, header+payload %b",
rx_num, rx_stack.d16, rx_len, rx_hp.hp, rx_hs, TRACE_BINARY(rx_len, rx_buffer));
}
}
if (reg_misr.tx_early_int)
{
WR_PPT_REG(PRO_MISR, BIT2);
}
if (reg_misr.gpio_int)
{
WR_PPT_REG(PRO_MISR, BIT3);
}
if (reg_misr.kill_ptx_int)
{
WR_PPT_REG(PRO_MISR, BIT4);
ppt_flush_rx_fifo();
ppt_ctx->fsm = PPT_FSM_STANDBY;
ppt_ctx->sync_flag = false;
}
if (reg_misr.kill_prx_int)
{
WR_PPT_REG(PRO_MISR, BIT5);
ppt_flush_rx_fifo();
ppt_ctx->fsm = PPT_FSM_STANDBY;
ppt_ctx->sync_flag = false;
}
if (reg_misr.reset_trig_int)
{
WR_PPT_REG(PRO_MISR, BIT6);
ppt_flush_rx_fifo();
ppt_ctx->fsm = PPT_FSM_STANDBY;
ppt_ctx->sync_flag = false;
}
}
PTX模式
PTX支持oneshot/periodic和ack/non-ack等模式。periodic模式下需要多配置interval参数,interval单位为125us。假设interval参数配置为n,则实际interval = (n+1)*125us。
调用 ppt_set_ptx_mode()
设置PTX模式。
PRX模式
PRX支持oneshot/continuous和ack/non-ack等模式。
调用 ppt_set_prx_mode()
设置PRX模式。
PSD模式
PSD支持多信道连续检测(最多10个信道),需要指定起止信道和步进。起止信道参数是相对rf bank起始频点的偏移,例如2430MHz,相对2402MHz偏移28MHz,则配置psd信道参数为28。
调用 ppt_set_psd_mode()
配置PSD参数。
指令
通过指令切换radio状态。
调用 ppt_execute_instruction()
切换radio状态。
DLPS
当需要支持进入DLPS状态时,需要调用 ppt_dlps_init()
。
Simple
Simple模块的相关文件有:
ppt_simple.h
ppt_simple.c
初始化
Simple模块封装了一个初始化函数,会对软硬件做一些配置。初始化函数 ppt_init()
需要首先被调用。
TRX Data
Simple模块有分配buffer ram类型的内存用于存放数据。调用simple这边的trx data收发函数,就不要求buffer ram类型了。
ppt_push_tx_data()
将发送数据送入默认通道0的TX FIFO。ppt_push_tx_data_by_entry()
将发送数据送入指定通道的TX FIFO。ppt_pop_rx_data()
将默认通道0的接收数据读出。ppt_pop_rx_data_by_entry()
将指定通道的接收数据读出。PTX
Simple模块封装了PTX参数配置、状态机管理、同步异步调用和periodic模式指定重传次数等功能。只有状态机空闲,才允许enable PTX。同步调用时的中断处理请参考demo工程,异步调用则是由用户自己管理状态机和回调。 PTX Enable同步调用只有trx动作执行完成才会返回。例如PTX oneshot的tx和rx(如果ack enable了)都执行完了才会返回。PTX periodic必须重传指定次数才会结束。 Disable PTX同步调用只有在ptx kill interrupt执行完成才会返回。
ppt_set_ptx_mode_ext()
配置PTX。ppt_enable_ptx()
使能PTX。ppt_disable_ptx()
失能PTX。PRX
Simple模块封装了PRX参数配置、状态机管理和同步异步调用等功能。只有状态机空闲,才允许enable PRX。同步调用时的中断处理请参考demo工程,异步调用则是由用户自己管理状态机和回调。 Enable PRX同步调用动作在执行完成才会返回。例如PRX oneshot的rx和tx(如果ack enable了)都执行完了才会返回。PRX continuous没有结束条件,需要用户自己设计。 Disable PRX同步调用只有在kill prx interrupt执行完成才会返回。
ppt_set_prx_mode_ext()
配置PRX。ppt_enable_prx()
使能PRX。ppt_disable_prx()
失能PRX。PSD
Simple模块封装了PSD参数配置、状态机管理、同步异步调用、中断处理和结果收集等功能。只有状态机空闲,才允许enable PSD。 Enable PSD同步调用在动作执行完成才会返回,异步调用会在中断里回调通知。 PSD执行完成后,结果会收集起来,可以根据信道索引获取结果。
ppt_set_psd_mode_ext()
配置PSD。ppt_enable_psd()
使能PSD。ppt_get_psd_result()
获取PSD结果。使用流程
配置流程
2.4G模块的 软硬件配置流程 如下。

2.4G配置流程
PTX/PRX启停流程
PTX/PRX启动流程 如下。

PTX/PRX启动流程
当PTX使用periodic模式,PRX使用continuous模式时,PTX和PRX启动后会持续工作,直到被用户主动停止。PTX/PRX停止流程 如下。

PTX/PRX停止流程
数据发送流程
无论是PTX还是PRX,都需要在TX开始前准备好header和payload,如 数据发送流程 所示。硬件会在TX timing到来时自动TX出去。硬件TX timing请参考 TRX时序图,用户需要自己选择header和payload设置的时机。TX成功后会产生TX中断,用户可以读取TX信息反馈,读取过程请参考 中断。当这笔封包不再需要时,软件通知硬件从TX FIFO里pop出该笔封包的payload。

数据发送流程
数据接收流程
数据接收是在中断服务程序里处理的,当RX中断产生时,通过Rx Stack里的RX状态寄存器判断RX结果,并获取RX header和RX payload。数据接收流程 如下,完整中断服务程序请参考 中断。

数据接收流程
PSD流程
在2.4G模块初始化后,就可以执行 PSD流程 获取信道的干扰信号强度。

PSD流程
注意事项
MP Tool配置
2.4G需要复用BLE资源,它的每个通道的TX FIFO对应一条 BLE master link资源,参考 多通道 章节的介绍。
因此,需要通过MP Tool配置BLE master link的链路数等于所使用的2.4G通道数,如图 MP Tool配置 所示。

MP Tool配置
示例工程
本模块有提供示例供用户参考,详见 Simple TRX。