3. EFR32无线协议栈基础与配置

EFR32系列SoC的无线能力并不是由单一固件“一锅端”实现的,而是由底层射频抽象层与上层协议栈分层协作完成。理解这套分层关系,是后续做BLE、Zigbee、Thread或私有协议开发与量产配置的前提。本节围绕协议栈架构、RAIL与Connect的关系、网络与射频参数、功耗模式以及初始化流程展开。

一、协议栈分层架构

EFR32的无线软件栈自上而下大致分为四层:应用层、协议栈层(Connect)、无线抽象层(RAIL)、以及硬件外设与射频前端。应用层负责业务逻辑;Connect层提供BLE、Zigbee、Thread、Proprietary等具体协议实现;RAIL(Radio Abstraction Interface Layer)是Silicon Labs提供的射频抽象接口,负责直接操作射频硬件、管理中断、收发数据包、控制信道与功率;最底层是EFR32的射频收发器、PA、天线匹配网络等硬件资源。

关键点在于:RAIL是协议栈与射频硬件之间的唯一通道。无论是BLE还是Zigbee,最终都要通过RAIL把数据交给射频硬件发送。因此RAIL既可以被Connect协议栈调用,也可以被用户直接调用,用于实现自定义私有协议或对时序有极致要求的场景。

EFR32 无线协议栈分层与 RAIL / Connect 关系 应用层 Application 业务逻辑 · 事件回调 · 状态机 · 用户任务 Connect 协议栈层 BLE GAP/GATT/L2CAP Zigbee ZCL/APS/NWK/MAC Thread IPv6/6LoWPAN/MAC Proprietary 自定义帧格式 RAIL 射频抽象层 收发调度 · 中断管理 · 信道/功率控制 · 包缓冲 · 时序校准 EFR32 射频硬件 射频收发器 · PA · 匹配网络 · 天线 · 时钟源 RAIL 可被应用直接调用

二、RAIL与Connect的协作关系

Connect协议栈在初始化时会调用RAIL的初始化接口,把射频配置(频段、调制方式、数据速率、前导码、同步字等)写入RAIL。之后协议栈的每一次收发,都通过RAIL的发送/接收API完成。RAIL负责把协议栈下发的数据包按配置的帧格式发出,并在收到数据时通过回调把包交给协议栈。

对于私有协议开发,可以绕过Connect,直接使用RAIL API。典型场景包括:自定义低延迟遥控、非标帧格式的传感器网络、需要精确控制收发时序的测距应用。此时开发者需要自己实现帧格式、地址过滤、重传机制等,RAIL只提供射频层面的能力。

三、网络参数与射频参数配置

网络参数决定设备如何加入和维持网络,射频参数决定物理层能否正常通信。以Zigbee为例,网络参数包括:PAN ID(网络标识)、Extended PAN ID、信道(11~26)、网络密钥、设备类型(协调器/路由器/终端)。射频参数包括:发射功率(如0~20 dBm,受法规和硬件限制)、接收灵敏度、数据速率(Zigbee通常250 kbps)、调制方式(OQPSK)。

BLE方面,网络参数主要是广播间隔、连接间隔、从机延迟、监督超时;射频参数包括发射功率、广播信道(37/38/39)、数据速率(1M/2M/Coded PHY)。Thread则涉及PAN ID、信道、网络密钥、Mesh-Local Prefix等。

配置时需要注意:发射功率不是越大越好。功率过高会增加功耗、可能超出法规限制、也可能导致接收端饱和。实际产品中通常根据认证要求和通信距离折中选取,例如室内Zigbee设备常用8~10 dBm,BLE可穿戴设备常用0~4 dBm。

四、功耗模式配置

EFR32支持多种功耗模式,从高到低依次为:Run、Sleep、Deep Sleep、Hibernate、Shutoff。无线协议栈在不同状态下会自动切换功耗模式。例如BLE连接间隔期间,协议栈会让MCU进入Deep Sleep,只在连接事件前唤醒。Zigbee终端设备在轮询父节点之间也会进入低功耗状态。

配置功耗模式时,需要关注几个参数:唤醒源(RTC、GPIO、射频中断)、唤醒时间、以及外设时钟是否关闭。RAIL提供了RAIL_SetPowerMode等接口,Connect协议栈则通过sl_power_manager统一管理。实际开发中,常用sl_power_manager_add_em_requirement来声明某段时间不允许进入低功耗,避免射频收发被中断。

五、协议栈初始化流程

以BLE为例,典型的初始化顺序如下:

1. 系统初始化:时钟、GPIO、电源管理
2. 初始化RAIL:RAIL_Init(),配置射频参数
3. 初始化Connect协议栈:sl_bt_init()
4. 配置BLE参数:设备名、广播数据、连接参数
5. 启动广播:sl_bt_advertiser_start()
6. 进入事件循环:sl_bt_process_event() + 低功耗管理

Zigbee的初始化类似,但多了一步网络层初始化:sl_zigbee_init()之后需要调用sl_zigbee_network_init(),然后根据设备类型选择sl_zigbee_form_network()(协调器)或sl_zigbee_join_network()(路由器/终端)。Thread则通过sl_ot_init()初始化OpenThread实例,再调用otIp6SetEnabled()和otThreadSetEnabled()启动协议栈。

初始化顺序不能随意调换:RAIL必须在Connect之前初始化,Connect必须在应用层使用协议栈API之前初始化。否则会出现射频未就绪、协议栈状态异常等问题。

六、配置检查要点

完成上述配置后,建议按以下要点自查:射频参数是否与认证要求一致;网络参数是否与目标网络匹配;功耗模式是否满足产品续航目标;初始化顺序是否正确;中断优先级是否合理(射频中断通常需要较高优先级)。这些检查能帮助在量产前发现大部分配置类问题。