Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/dsyx/docs.silabs.com_zh/llms.txt

Use this file to discover all available pages before exploring further.

RAIL(Radio Abstraction Interface Layer,无线电抽象接口层)是 Silicon Labs 为所有网络协议栈提供的最底层无线电软件库,旨在将复杂的 EFR32 无线电硬件抽象为统一、易用的 C API。开发者无需直接操作数百个寄存器,即可实现 proprietary 或 standards-based 协议的开发,同时保证代码在 Silicon Labs 产品系列之间的可移植性。

RAIL 概述

RAIL 库通过 Gecko SDK Suite 提供,并作为 Flex SDK 的核心组件对外发布。在 Flex SDK 中,开发者可以:
  • 直接基于 RAIL 开发自定义协议
  • 使用 Silicon Labs Connect stack 构建低功耗简单网络应用

RAIL 库

提供配置和控制无线电的编程接口,将直观的 API 命令转换为寄存器级操作代码

Radio Configurator

Simplicity Studio 内置工具,根据频率、比特率等参数生成无线电物理层静态配置

RAILtest

通用测试工具,包含每个 RAIL 功能的串行命令,支持脚本化测试和临时实验

示例应用

可直接用于评估或作为应用开发起点,涵盖多种无线场景
所有 EFR32FG 设备均支持 Proprietary 协议。对于其他产品,请在设备数据手册的 Ordering Information > Protocol Stack 下确认是否支持 Proprietary。

API 设计目标

RAIL API 的设计遵循两个核心目标:
  1. 向后兼容性:RAIL API 在主要版本内向后兼容。为 RAIL 2.0 开发的代码应能够与最新的 RAIL 2.x 版本一起运行。
  2. 跨芯片一致性:RAIL API 在所有支持的器件之间尽可能保持一致。尽管部分 API 并非在所有器件上均可用,但通用操作(如接收、发送和状态转换)在各器件间保持相同。

RAIL 库架构

RAIL 库作为静态链接库提供,链接到开发者的应用程序中。其工作原理是将 API 命令转换为控制无线电和通信功能的寄存器级代码,实现跨 IC 的 API 一致性。
┌──────────────────────────────────┐
│         应用程序 / 协议栈         │
├──────────────────────────────────┤
│           RAIL API 层            │
├──────────────────────────────────┤
│       RAIL 库(寄存器操作)       │
├──────────────────────────────────┤
│        EFR32 无线电硬件           │
└──────────────────────────────────┘
RAIL API 由两类元素构成:
  • 命令(Commands):由软件主动调用,用于启动某些操作(如开始发送、开始接收)
  • 事件(Events):由硬件产生(通常通过中断),通知软件某些状态变化(如接收到帧)
该库支持用于 ARM 的 GCC 和 IAR 编译器。

RAIL 核心特性

发送和接收均可通过单个 API 启动。发送完成和接收到的数据包通过 RAIL 事件进行通知。
可配置的状态转换机制,根据发送/接收操作的成功或失败自动切换状态。支持可选的延迟设置,以实现状态间的一致时序。
提供两个可配置大小的帧缓冲区,分别用于接收和发送,均可保存多个帧。
RAIL 自动维护微秒精度的时基,支持:
  • 数据包时间戳(默认启用,可在不同数据包位置采样)
  • 调度发送和接收操作
  • 一个通用定时器(带可选的 MultiTimer 虚拟化)
  • 可选的 RTC 同步,支持从 EM2 睡眠模式进行调度
支持在绝对或相对未来时间点发送数据包;接收可设置起始时间和可选超时。
支持两种媒体访问机制:
  • CSMA/CA:基于 IEEE 802.15.4 规范
  • LBT(Listen Before Talk):基于 ETSI EN 300 220-1 规范
可读取瞬时和平均 RSSI 值,以及每个接收帧的 RSSI 和 LQI(Link Quality Indicator)测量值。
支持两个地址字段(固定位置),每个字段最长 4 字节,每个字段可过滤 4 个地址(如单播和广播地址)。地址可在运行时启用和配置。
在每次成功接收后,经过可配置延迟自动发送响应数据包。响应负载可以是固定内容,也可以在发送前由用户动态加载。
PHY 配置可在运行时更改。RAIL 可动态加载 PHY 配置。
RAIL 提供专用的多协议库版本,内置无线电调度器,可管理来自不同无线电配置的请求:
  • 支持 N ≥ 2 个不同无线电配置的时分复用
  • 允许不同配置的不同优先级任务,始终保证最高优先级任务完成
  • 允许在时序不严格时移动任务,以实现最稳健的网络
器件特定校准,通常包括温度大幅变化时的重校准和镜像抑制校准(提高灵敏度)。
RAIL 可生成连续波(CW)和 PN9 伪随机调制流,支持任意 PHY 配置,用于 RF 测试。
在接收模式下在两根天线之间切换,选择信号较强的天线以提高灵敏度(仅部分芯片和 PHY 配置支持)。
启用后,当无线电开启时通知电源管理器组件,防止进入 EM2 深度睡眠模式。

事件处理示例

RAIL 事件通过回调函数处理。以下是一个典型的事件回调实现:
// RAIL 事件回调(从中断上下文调用)
static void sl_rail_app_on_event(RAIL_Handle_t railHandle, RAIL_Events_t events)
{
    // 处理发送完成事件
    if (events & RAIL_EVENT_TX_PACKET_SENT) {
        // 在多协议场景中,发送完成后必须让出无线电
        RAIL_YieldRadio(railHandle);
    }

    // 处理接收到数据包事件
    if (events & RAIL_EVENT_RX_PACKET_RECEIVED) {
        RAIL_RxPacketInfo_t packetInfo;

        RAIL_GetRxPacketInfo(railHandle,
                            RAIL_RX_PACKET_HANDLE_NEWEST,
                            &packetInfo);

        if (packetInfo.packetStatus == RAIL_RX_PACKET_READY_SUCCESS) {
            // 将数据包内容拷贝到接收缓冲区
            RAIL_CopyRxPacket(rxFifo, &packetInfo);
            // 通知主循环有新数据包
            // (推荐使用 RTOS 标志或信号量)
        }
    }
}
事件回调函数从中断上下文中调用,因此只应在其中执行 time-critical 操作。其他所有处理逻辑应移至应用程序主循环或 RTOS 任务中完成。

多协议支持与无线电调度器

RAIL 用于实现同时支持多个协议栈的动态多协议解决方案。Silicon Labs 的动态多协议解决方案通过无线电调度器实现——这是一个抢占式优先级调度器,可在协议之间调度无线电硬件。
单协议应用直接使用 RAIL API,通过 RAIL_StartRx()RAIL_StartTx() 控制无线电状态,使用 RAIL_YieldRadio() 在发送完成后让出无线电。
对于单协议和多协议 RAIL,API 接口完全相同。多协议 RAIL 库只是在背后增加了调度器仲裁逻辑。详情请参阅 UG305: Dynamic Multiprotocol User’s Guide

RAIL 版本历史

与 RAIL 1.x 相比,RAIL 2.x 新增了多项功能,包括动态多协议支持,并提供了更简洁易理解的 API。RAIL 2.x API 在主要版本内向后兼容,详情参见 AN1113: Porting RAIL Applications to RAIL Version 2.x

项目结构

基于 Gecko SDK 3.x 的 RAIL 项目采用 component-based 架构,项目结构如下:
目录/文件说明
autogen/仅包含生成的代码:PHY 配置(rail_config.c)、初始化代码、链接器脚本等
config/组件配置头文件,可通过 Component Editor 或直接编辑
gecko_sdk_x.x.x/组件添加的源文件和二进制文件
根目录文件仅包含应用特定文件:源文件、.slcp 项目配置文件、.pintool 文件
所有项目均包含 main.c(不建议修改)。初始化代码应添加到 app_init.c,主循环应在 app_process.c 中实现。

下一步

  • 要了解如何安装 Simplicity Studio 并开始 RAIL 开发,请参阅 QSG168: Proprietary Flex SDK v3.x Quick Start Guide
  • 深入了解 RAIL 软件开发,请参阅 RAIL API 文档 和 Silicon Labs RAIL 教程
  • 多协议应用开发请参阅 UG305: Dynamic Multiprotocol User’s Guide

Build docs developers (and LLMs) love