IEEE 802.15.4/2.4G 切换演示
此示例演示如何在 Realtek 2.4G 私有协议和 IEEE 802.15.4 协议之间来回切换,并在同一时间段内使用一种协议来传输数据。
备注
由于硬件限制,RTL8752H 系列 IC 无法同时传输 Realtek 2.4G 私有协议和 IEEE 802.15.4 封包。
环境需求
该示例支持以下开发套件,更多信息请参阅 快速入门。
硬件平台 |
板卡名称 |
---|---|
RTL8752H HDK |
RTL8752H EVB |
此演示项目需要三个 EVB 来演示 Realtek 2.4G 私有协议和 IEEE 802.15.4 的 T/RX。
EVB 板卡编号 |
用途 |
---|---|
EVB Board1 |
发送 Realtek 2.4G 私有协议或是 IEEE 802.15.4 的数据包 |
EVB Board2 |
Realtek 2.4G 私有协议接收器 |
EVB Board3 |
Realtek IEEE 802.15.4 接收器 |
有关
EVB Board2
的要求,请参阅 2.4G Simple TRX。有关
EVB Board3
的要求,请参阅 IEEE 802.15.4 TRX。
硬件连线
请参考 快速入门 中的 RTL8752H EVB 接口和模块。
配置选项
关于 Realtek 2.4G 私有协议配置,请参考
src\app\ppt_154_switch_demo\ppt\ppt_cfg.h
。备注
EVB Board1
和EVB Board2
应共享相同的私有配置。关于 IEEE 802.15.4 协议的配置,请参考
src\app\ppt_154_switch_demo\zb\zb_main.c
中的zb_demo
。默认配置为PanID=0x05
,ShortAddr=1
,Channel=12
。备注
EVB Board1
和EVB Board3
应共享相同的 IEEE 802.15.4 配置。请参考 IEEE 802.15.4 TRX 为
EVB Board3
配置接收来自EVB Board1
的数据包。
编译和下载
此示例可以在 SDK 文件夹中找到:
Project file: sdk\board\evb\ppt_154_switch_demo\mdk
目前该项目仅支持 Keil 编译器。
要构建和运行示例,请按照以下步骤操作:
打开项目文件。
要构建目标,请按照 快速入门 中 编译 APP Image 中列出的步骤进行操作。
成功编译后,APP bin
app_MP_sdk_xxx.bin
将生成在目录bin
中。按下评估板上的重置按钮,它将开始运行。
测试验证
将示例编程到 EVB Board1
后,使用 Debug Analyzer
获取日志并查看运行结果。
测试
在按下重置按钮后,EVB Board1
使用一个三秒周期的软件定时器来周期性地循环执行以下程序。
APP 收到来自软件定时器的3秒超时事件。
切换到 IEEE 802.15.4 协议。
发送 IEEE 802.15.4 数据包。
空闲等待下一个超时事件。
APP 收到来自软件定时器的 3 秒超时事件。
切换到 2.4G 私有协议。
发送 2.4G 私有协议数据包。
空闲等待下一个超时事件。
按下重置按钮并轮到 2.4G 后,
EVB Board1
将开始发送 2.4G 私有协议封包并监听响应。如果启用了
ACK_MODE
,EVB Board2
会将包发送回EVB Board1
。如果成功启动,将打印以下日志:[APP] !**ptx: statistics tx 95, rx 70, miss 25(26.315%)
按下重置按钮后,
EVB Board2
将根据 2.4G 私有协议配置开始监听空中信号。如果成功启动,当它从空中接收到一个数据包时,将打印以下日志:[APP] !**prx: rx count 1774, int count 2969, rx stack 0x0008, entry 0, hp 0x00, len 15, hs 0x00000000, payload 01 02 01 02 01 01 02 01 05 05 09 32 2E 34 67
备注
由于默认配置为 BLE 广播信道 37,即 2402MHz,PTX 可能会听到 BLE 设备的回复,而 PRX 可能会听到 BLE 设备的广播。用户可以修改 FREQUENCY 等参数以避免 BLE 设备。
按下重置按钮并轮到 IEEE 802.15.4 协议时,
EVB Board1
将开始发送 IEEE 802.15.4 数据包并监听响应。如果成功启动,将打印以下日志:[APP] !**IO_MSG_TYPE_154
请参阅 IEEE 802.15.4 TRX 查看
EVB Board3
的测试结果。
代码介绍
本章的主要目的是帮助 APP 开发者熟悉开发过程,分为以下部分:
源码路径
项目目录:
sdk\board\evb\ppt_154_switch_demo\
源代码目录:
sdk\src\app\ppt_154_switch_demo\
应用项目中的源文件目前分为如下几个组。
└── 项目: ppt_154_switch_demo
└── app
├── include 包含 rom UUID 和部分 ISR 声明
├── Lib 包含所有用户应用程序基于的二进制符号文件
├── ROM.lib
├── lowerstack.lib
└── rtl8752h_sdk.lib
├── cmsis 包含向量表声明和启动代码
├── startup_rtl876x.s
└── system_rtl876x.c
├── platform 包含应用程序使用的所有外设驱动和模块代码
├── ppt driver 包含无线电驱动
├── ppt_driver.c 包含硬件寄存器操作
└── ppt_simple.c 包含硬件管理和软件包装器
├── zb_driver 包含 IEEE 802.15.4 协议的源文件
├── dbg_printf.c
├── patch.c
├── strtol.c
├── strtoll.c
├── strtoul.c
├── strtoull.c
├── mac_test_common.c
├── mac_test_cmds.c
├── mac_802154_frame_parser.c
├── mac_priv_cmds.c
├── mac_driver_ext.c
├── cmd_shell.c
├── cmd_shell_rom.c
├── consol_cmds.c
├── shell.c
└── stdio_port.c
├── app 包含用户应用程序的实现
├── overlay_mgr.c
├── main.c 包含 io、os 和平台初始化
└── app_task.c 包含应用任务初始化和协议切换演示的主循环
├── zb_demo 包含 IEEE 802.15.4 初始化
└── zb_main.c 包含 IEEE 802.15.4 任务
└── ppt_demo
├── ppt_cfg.c 包含 Radio 配置和初始化
└── ppt_ptx.c 包含发送和接收操作以及中断例程
初始化
当 EVB 板启动并芯片复位时,将调用主函数,它执行以下初始化函数:
int main(void)
{
extern uint32_t random_seed_value;
srand(random_seed_value);
board_init();
pwr_mgr_init();
task_init();
os_sched_start();
return 0;
}
pwr_mgr_init()
初始化 DLPS 电源管理模块。task_init()
初始化应用任务并注册任务主函数app_main_task()
。os_sched_start()
启动 OS 调度器。当调度器启动时,将调用app_main_task()
并启动 3 秒的软件定时器以触发 tx 事件。
void app_main_task(void *p_param)
{
os_msg_queue_create(&app_task_evt_queue_handle, APP_TASK_EVT_QUEUE_SIZE,
sizeof(uint8_t)); // T_EVENT_TYPE
os_msg_queue_create(&app_task_io_queue_handle, APP_TASK_IO_QUEUE_SIZE, sizeof(T_IO_MSG));
/* 初始化 IEEE 802.15.4 uart 日志和 IEEE 802.15.4 rx 任务 */
zb_task_init();
/* 避免与 ble psd 程序冲突 */
os_delay(1000);
os_timer_create(&tx_timer, "tx timer", 1, TX_TIMER_PERIOD, true, tx_timer_callback);
os_timer_start(&tx_timer);
T_EVENT_TYPE event;
while (1)
{
if (os_msg_recv(app_task_evt_queue_handle, &event, 0xFFFFFFFF) == true)
{
if (event == EVENT_IO_TO_APP)
{
T_IO_MSG msg = {0};
if (os_msg_recv(app_task_io_queue_handle, &msg, 0) == true)
{
app_handle_io_msg(msg);
}
}
}
}
}
切换流程
tx_timer_callback()
将每 3 秒被引用一次,它会发送一个事件类型为IO_MSG_TYPE_TIMER
的超时事件消息到app_main_task()
,其中app_handle_io_msg()
负责处理所有传输到应用任务的消息事件。收到超时事件后,它将触发 2.4G/IEEE 802.15.4 对应协议的初始化,并根据预定义的协议演示配置传输数据包。
协议传输演示完成后,会向
app_main_task()
发出一个事件类型为IO_MSG_TYPE_MULTIPROTOCOL
的消息。此消息的子类型指示在本轮传输演示中应用了哪个协议。
2.4G 私有协议
初始化和配置
ppt_cfg()
将初始化和配置无线电,包括频率、PHY 类型、帧格式、CRC 参数、whitening、Access Address 和发射功率。ppt_reg_handler()
注册无线电的中断处理程序。PTX 模式配置,header 设置
ppt_set_tx_header()
,并准备要发送的数据ppt_push_tx_data()
。
主循环
PTX 将循环发送数据三次,过程如下:
准备数据。
启用 PTX 并等待完成。
修改数据内容和长度。
延迟 500 毫秒。
返回步骤 1。
Radio 中断处理程序
在启用 PTX 或 PRX 后,Radio 将运行并触发相应的中断。
注册的中断函数由 ppt_reg_handler()
调用。中断类型可以查阅:2.4G Radio用户指南。
PTX 将处理
tx_int
。如果开启了 ACK 模式,还将处理
rx_int
。如果开启了周期模式,将处理
tx_early_int
。当周期模式中的重传次数达到要求时,PTX 将在 TRX 中断中关闭,然后需要处理
kill_ptx_int
。
在中断处理完成且 2.4G 私有协议的硬件状态机处于空闲状态后,引用 ppt_send_complete_msg_to_apptask()
发送带有子类型 IO_MSG_MPM_PPT
的 2.4G TX 完成消息到应用任务。
去初始化
当 app_handle_io_msg()
接收到 IO_MSG_MPM_PPT
事件时,执行以下功能以禁用 2.4G 协议。
ppt_disable_ptx()
阻塞 CPU 直到 2.4G 私有协议的硬件状态机处于空闲状态ppt_dlps_deinit()
执行 dlps 相关配置并恢复到默认状态。ppt_deinit()
禁用 2.4G MAC 并释放先前分配的缓冲内存。
ppt_disable_ptx(NULL);
ppt_deinit();
ppt_dlps_deinit();
IEEE 802.15.4
初始化和配置
zb_mac_enable()
被引用来启用 IEEE 802.15.4 协议。mac_SetPANId()
,mac_SetChannel()
,mac_SetShortAddress()
被引用来配置预定义的 IEEE 802.15.4 传输数据包。stub_zb_mac_data()
被引用来传输 IEEE 802.15.4 数据包,CPU 在传输完成前将被阻塞。
在 IEEE 802.15.4 协议 TX 完成后,带有子类型 IO_MSG_MPM_154
的 IO 消息被发送到应用任务,来通知应用程序。
void zb_demo(void)
{
zb_mac_disable();
zb_mac_enable();
mac_SetPANId(0x5);
mac_SetChannel(12);
mac_SetShortAddress(0x1);
char *cmds[] = {"1", "7", "7"};
bool ret = stub_zb_mac_data(3, cmds);
if (ret)
{
T_IO_MSG bee_msg = {0};
bee_msg.type = IO_MSG_TYPE_MULTIPROTOCOL;
bee_msg.subtype = IO_MSG_MPM_154;
if (app_send_msg_to_apptask(&bee_msg) == false)
{
APP_PRINT_ERROR0("send message to app queue failed");
}
}
}
去初始化
引用 zb_mac_disable()
来禁用 IEEE 802.15.4 协议。