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 板卡编号

用途

EVB Board1

发送 Realtek 2.4G 私有协议或是 IEEE 802.15.4 的数据包

EVB Board2

Realtek 2.4G 私有协议接收器

EVB Board3

Realtek IEEE 802.15.4 接收器

硬件连线

请参考 快速入门 中的 RTL8752H EVB 接口和模块

配置选项

  • 关于 Realtek 2.4G 私有协议配置,请参考 src\app\ppt_154_switch_demo\ppt\ppt_cfg.h

    备注

    EVB Board1EVB Board2 应共享相同的私有配置。

  • 关于 IEEE 802.15.4 协议的配置,请参考 src\app\ppt_154_switch_demo\zb\zb_main.c 中的 zb_demo。默认配置为 PanID=0x05ShortAddr=1Channel=12

    备注

    • EVB Board1EVB Board3 应共享相同的 IEEE 802.15.4 配置。

    • 请参考 IEEE 802.15.4 TRXEVB Board3 配置接收来自 EVB Board1 的数据包。

编译和下载

此示例可以在 SDK 文件夹中找到:

Project file: sdk\board\evb\ppt_154_switch_demo\mdk

目前该项目仅支持 Keil 编译器。

要构建和运行示例,请按照以下步骤操作:

  1. 打开项目文件。

  2. 要构建目标,请按照 快速入门编译 APP Image 中列出的步骤进行操作。

  3. 成功编译后,APP bin app_MP_sdk_xxx.bin 将生成在目录 bin 中。

  4. 要将 APP bin 下载到评估板中,请按照 快速入门MP Tool 中列出的步骤进行操作。

  5. 按下评估板上的重置按钮,它将开始运行。

测试验证

将示例编程到 EVB Board1 后,使用 Debug Analyzer 获取日志并查看运行结果。

测试

在按下重置按钮后,EVB Board1 使用一个三秒周期的软件定时器来周期性地循环执行以下程序。

  1. APP 收到来自软件定时器的3秒超时事件。

  2. 切换到 IEEE 802.15.4 协议。

  3. 发送 IEEE 802.15.4 数据包。

  4. 空闲等待下一个超时事件。

  5. APP 收到来自软件定时器的 3 秒超时事件。

  6. 切换到 2.4G 私有协议。

  7. 发送 2.4G 私有协议数据包。

  8. 空闲等待下一个超时事件。

  1. 按下重置按钮并轮到 2.4G 后,EVB Board1 将开始发送 2.4G 私有协议封包并监听响应。

  2. 如果启用了 ACK_MODE, EVB Board2 会将包发送回 EVB Board1

  3. 如果成功启动,将打印以下日志:[APP] !**ptx: statistics tx 95, rx 70, miss 25(26.315%)

  4. 按下重置按钮后, EVB Board2 将根据 2.4G 私有协议配置开始监听空中信号。

  5. 如果成功启动,当它从空中接收到一个数据包时,将打印以下日志:[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 设备。

  1. 按下重置按钮并轮到 IEEE 802.15.4 协议时, EVB Board1 将开始发送 IEEE 802.15.4 数据包并监听响应。

  2. 如果成功启动,将打印以下日志:[APP] !**IO_MSG_TYPE_154

  3. 请参阅 IEEE 802.15.4 TRX 查看 EVB Board3 的测试结果。

代码介绍

本章的主要目的是帮助 APP 开发者熟悉开发过程,分为以下部分:

  • 源码路径:介绍项目目录和源代码文件。

  • 初始化:介绍芯片的初始化流程。

  • 切换流程:介绍 2.4G 私有协议和 IEEE 802.15.4 协议的切换流程以及初始化/去初始化。

源码路径

  • 项目目录: 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 将循环发送数据三次,过程如下:

  1. 准备数据。

  2. 启用 PTX 并等待完成。

  3. 修改数据内容和长度。

  4. 延迟 500 毫秒。

  5. 返回步骤 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 协议。