IEEE 802.15.4 Simple TRX
这个示例使用了两块开发板,分别充当 TX 和 RX 的角色。 TX 设备可以定期向 RX 设备发送消息,来演示 IEEE 802.15.4 MAC Driver API 的基本使用。
环境需求
该示例支持以下开发套件:
硬件平台 |
开发板名称 |
---|---|
RTL8752H HDK |
RTL8752H EVB |
有关更多要求,请参考 快速入门。
硬件连线
请参考 快速入门 中的 RTL8752H EVB 接口和模块 部分。
配置选项
IEEE 802.15.4 的相关配置,请参考文件 subsys\zb-mac-test\test\rtk_mac\mac_test_common.c
中的 zb_mac_drv_init
。
默认配置: PanID=0x05
,ShortAddr=1
,Channel=12
。
备注
两个设备应该使用相同的 IEEE 802.15.4 配置。
IEEE 802.15.4 示例工程默认使用 P3_0 作为 Data UART 的 TX 引脚,使用 P3_1 作为 Data UART 的 RX 引脚。
工程中含有 zb_tst_cfg.h
文件,该文件定义了 Data UART 的引脚设置。Data UART 引脚可以根据实际硬件环境自行配置。
#else // For EVB board
#define ZB_DBG_UART_TX_PIN P3_0
#define ZB_DBG_UART_RX_PIN P3_1
Data UART 的波特率应设置为 2,000,000,电脑 串口助手 工具的参数设置下。

串口配置
编译和下载
此示例可以在以下的 SDK 文件夹中找到:
Project file: sdk\board\evb\ieee802154_test\mdk
Project file: sdk\board\evb\ieee802154_test\gcc
要编译和运行示例,请按照以下步骤操作:
打开项目文件。
为了编译目标,请按照 快速入门 中的 编译 APP Image 步骤进行操作。
编译成功后,APP bin 文件
app_MP_sdk_xxx.bin
将会在 bin 文件目录下生成。按下开发板上的 reset 按钮,系统将开始运行。
测试验证
将示例程序烧录到两个开发板后,使用串口工具可以查看运行结果。
测试
按下 reset 按钮并输入 demo 命令后,设备将周期性地执行 sleep-wake up-send 循环。
按下 reset 按钮后,设备将自动接收帧。
例如输入 demo 2000000,参数 2000000 表示时间,单位为微秒,可以看到下图所示的 log 信息:

示例 Log 信息
代码介绍
本章节的主要目的是帮助应用开发者熟悉开发流程。本章节将根据以下几个部分进行介绍:
源码目录
应用项目中的源文件目前分为以下几类:
└── Project: ieee802154_test
└── ieee802154_test
├── include
├── Lib 包括用户应用程序构建时所依赖的所有二进制符号文件
├── gap_utils.lib
├── lowerstack.lib
├── rtl87x2g_sdk.lib
├── libzb_mac_driver.lib
├── ROM.lib
└── zb_ROM.lib
├── cmsis
├── peripheral 包括应用程序使用的所有外围驱动程序和模块代码
├── profile 包括示例应用程序使用的配置文件或服务
├── app 包括 IEEE 802.15.4 用户应用程序的实现
├── overlay_mgr.c
├── ancs.c
├── app_task.c
├── main.c
└── peripheral_app.c
├── shell 包括 shell 实现
└── rtk_mac 包括 IEEE 802.15.4 应用程序实现
├── dbg_printf.c
├── zb_main.c
├── mac_test_cmd.c
├── mac_802154_frame.c
└── mac_test_common.c
初始化
当 EVB 开发板启动并且芯片被重置时,主函数将被调用,并执行以下初始化函数:
int main(void)
{
extern uint32_t random_seed_value;
srand(random_seed_value);
board_init();
pwr_mgr_init();
zb_task_init();
os_sched_start();
return 0;
}
pwr_mgr_init
初始化 DLPS 电源管理模块。zb_task_init
初始化应用任务并注册任务主函数zb_task_init
。os_sched_start()
启动操作系统调度器。当调度器启用时,zb_task_init
将被调用,并调用 Zigbee 主函数zb_test_task
和射频主函数rx_test_task
。
void zb_task_init(void)
{
mac_Initialize_Patch();
zb_pin_mux_init();
zb_periheral_drv_init();
zb_mac_interrupt_enable();
zb_mac_drv_enable();
bool zb_sem_create = false;
zb_sem_create = os_sem_create(&zb_sem, "zb_sem", 0, 16);
if (zb_sem_create)
{
DBG_DIRECT("os_sem_create true");
}
else
{
DBG_DIRECT("os_sem_create false");
}
os_task_create(&zb_task_handle, "zb_test", zb_test_task, NULL, ZB_TASK_STACK_SIZE,
ZB_TASK_PRIORITY);
os_task_create(&rx_task_handle, "rx_test", rx_test_task, NULL, ZB_TASK_STACK_SIZE,
ZB_TASK_PRIORITY);
}
TX/RX 流程
在输入 demo 命令后,演示函数将被调用。
该演示函数 cmd_demo
主要用于根据命令行参数设置一些全局变量,并创建一个新任务 ctimer_task
,该任务会定期调用 demo_cb
函数,并初始化电源管理。
demo_cb
函数的目的是生成并发送一个 IEEE 802.15.4 数据帧,并记录处理时间。
具体步骤如下:
定义并初始化一些变量,包括帧控制字段(fc)、开始时间(start)、PAN ID(panid)、源地址(saddr)和目标地址(daddr)。
设置帧控制字段(fc)的各种属性,如帧类型、寻址模式等。
使用
generate_ieee_frame
函数生成数据帧,并将其存储在全局变量g_tx_buf
中。调用
GEN_SEQ_DATA_MV_PTR
宏生成序列数据。使用
mac_txn_payload_set()
函数将数据帧加载到发送缓冲区(tx buffer)。重置传输状态。
调用
mac_txn_trig()
函数触发数据帧的发送。等待传输完成。
调用
print_tx_result
函数输出传输结果。记录结束时间并计算处理时间,然后输出处理时间信息。
设置电源管理并进入睡眠模式。
射频中断处理
在 TX 或 RX 完成后,射频模块将运行并触发相应的中断。中断类型可以在 RXMAC 中断 和 TXMAC 中断 中找到。