4. nRF54射频寄存器与协议栈基础

nRF54 系列的 Radio 外设是短距离协议栈的物理层核心,它把 2.4 GHz 收发器、调制解调、包处理、CRC、地址匹配和部分链路层时序逻辑集成在同一组寄存器与任务/事件接口之下。理解寄存器映射,是后续用协议栈 API 或直接操作底层外设进行调试的前提。本节从寄存器结构、初始化顺序和调试接口三个角度展开,帮助建立“地址—任务—事件—状态”的完整认知。

一、Radio 外设的寄存器映射结构

nRF54 的 Radio 采用 Nordic 一贯的“任务触发、事件反馈、寄存器配置”模型。外设基地址由芯片手册给出,例如 Radio 基址为 0x5000_0000 量级(具体以对应型号手册为准),所有寄存器相对该基址偏移。寄存器大致分为四类:

  • 任务寄存器(TASKS_*):写 1 触发动作,如 TASKS_TXEN 使能发射、TASKS_RXEN 使能接收、TASKS_START 启动、TASKS_STOP 停止、TASKS_DISABLE 关闭。
  • 事件寄存器(EVENTS_*):硬件置位,如 EVENTS_READY、EVENTS_ADDRESS、EVENTS_PAYLOAD、EVENTS_END、EVENTS_DISABLED、EVENTS_CRCOK、EVENTS_CRCERROR。
  • 配置寄存器(如 FREQUENCY、MODE、PCNF0/1、CRCCNF、CRCPOLY、CRCINIT、BASE0/1、PREFIX0/1、TXADDRESS、RXADDRESSES、SHORTS、INTENSET):决定频率、速率、包格式、地址和中断。
  • 数据寄存器(PACKETPTR、DATA、STATE、CRCSTATUS、RXMATCH):指向包缓冲、读取状态和匹配结果。

调试时最常打交道的三个状态量是 STATE(当前处于 DISABLED/RXRU/TXRU 等)、CRCSTATUS(0 表示 CRC 错误,1 表示正确)和 RXMATCH(匹配到的逻辑地址索引)。它们能快速判断“是否收到包、包是否正确、是否发给本机”。

nRF54 Radio 寄存器映射与任务/事件关系 Radio 基址 0x5000_0000 + 偏移 TASKS_* 写1触发 EVENTS_* 硬件置位 配置寄存器 频率/速率/地址 数据/状态 PACKETPTR 典型收发任务—事件链 TXEN/RXEN 使能 START 启动 READY 就绪 ADDRESS 地址 END/CRC 结束/校验 关键状态寄存器 STATE:DISABLED / RXRU / TXRU / RXIDLE CRCSTATUS:0=错误,1=正确 RXMATCH:匹配的逻辑地址索引 SHORTS:任务与事件自动联动 调试接口与观察点 INTENSET:使能事件中断 PACKETPTR:指向包缓冲 DEBUG 外设:寄存器快照 SWD/断点:单步观察事件

二、短距离协议栈初始化流程

无论使用 Bluetooth LE、802.15.4 还是私有 2.4 GHz 协议,初始化都遵循“时钟—电源—Radio 配置—协议栈使能”的顺序。以私有协议为例,典型流程如下:

  1. 时钟与电源准备:使能 HFCLK,确保 Radio 使用的高频时钟稳定;配置 POWER 相关寄存器,避免在 Radio 工作时进入低功耗模式。
  2. Radio 基础配置:设置 MODE(如 1 Mbps、2 Mbps 或 802.15.4 模式)、FREQUENCY(信道频率偏移)、TXPOWER(发射功率)。
  3. 包格式配置:通过 PCNF0、PCNF1 设置前导码长度、地址字段长度、最大包长、白化使能;通过 CRCCNF、CRCPOLY、CRCINIT 设置 CRC 长度、多项式和初值。
  4. 地址配置:写入 BASE0/1、PREFIX0/1,并通过 RXADDRESSES 使能需要匹配的逻辑地址;TXADDRESS 选择发送时使用的地址。
  5. 中断与 SHORTS:在 INTENSET 中使能 END、CRCERROR 等事件中断;用 SHORTS 让 READY→START、END→DISABLE 自动衔接,减少 CPU 干预。
  6. 协议栈使能:若使用 SoftDevice 或协议栈库,调用其初始化 API,把 Radio 中断向量和回调注册进去,再启动广播或连接。

下面是一段直接操作寄存器的初始化示例(寄存器名按 nRF54 风格书写,地址以宏或结构体映射为准):

// 示例:私有 2.4 GHz 模式基础配置(参数为教学假设值)
NRF_RADIO->MODE      = RADIO_MODE_MODE_Nrf_2Mbit;
NRF_RADIO->FREQUENCY = 40;          // 信道频率偏移
NRF_RADIO->TXPOWER   = RADIO_TXPOWER_TXPOWER_0dBm;

NRF_RADIO->PCNF0 = (8 << RADIO_PCNF0_LFLEN_Pos)   // 长度字段 8 bit
                 | (0 << RADIO_PCNF0_S0LEN_Pos);  // 无 S0
NRF_RADIO->PCNF1 = (4 << RADIO_PCNF1_BALEN_Pos)  // 地址 4 字节
                 | (32 << RADIO_PCNF1_MAXLEN_Pos)
                 | RADIO_PCNF1_WHITEEN_Msk;

NRF_RADIO->CRCCNF  = RADIO_CRCCNF_LEN_Two;
NRF_RADIO->CRCPOLY = 0x1021;
NRF_RADIO->CRCINIT = 0xFFFF;

NRF_RADIO->BASE0   = 0xE7E7E7E7;
NRF_RADIO->PREFIX0 = 0xC0;
NRF_RADIO->RXADDRESSES = RADIO_RXADDRESSES_ADDR0_Msk;
NRF_RADIO->TXADDRESS   = 0;

NRF_RADIO->SHORTS = RADIO_SHORTS_READY_START_Msk
                  | RADIO_SHORTS_END_DISABLE_Msk;
NRF_RADIO->INTENSET = RADIO_INTENSET_END_Msk
                    | RADIO_INTENSET_CRCERROR_Msk;

NVIC_EnableIRQ(RADIO_IRQn);
NRF_RADIO->PACKETPTR = (uint32_t)&tx_packet;
NRF_RADIO->TASKS_TXEN = 1;

这段代码的关键点在于:SHORTS 让 READY 自动触发 START,END 自动触发 DISABLE,从而把一次发送压缩成“使能—等待 END 中断”两步。调试时若发现 EVENTS_READY 不出现,应优先检查 HFCLK 是否稳定、MODE 是否合法;若 EVENTS_END 出现但 CRCSTATUS 为 0,则检查 CRC 配置和接收端是否一致。

三、调试接口与寄存器观察方法

nRF54 提供 SWD 调试接口,配合 J-Link 和 nRF Connect for Desktop 或命令行工具,可以在线读写 Radio 寄存器。常用手段包括:

  • 寄存器快照:在 EVENTS_END 中断里读取 STATE、CRCSTATUS、RXMATCH,判断本次收发的最终状态。
  • 断点与单步:在 RADIO_IRQHandler 入口设断点,观察事件顺序是否符合预期;注意断点会暂停时序,不适合测量精确时间。
  • DEBUG 外设:部分 nRF54 型号提供 DEBUG 外设,可在不停机的情况下抓取外设状态快照,适合观察 Radio 在运行中的状态迁移。
  • GPIO 翻转:在任务触发和事件响应处翻转 GPIO,用逻辑分析仪或示波器测量从 TASKS_START 到 EVENTS_END 的实际耗时,验证时序参数。
调试 Radio 时,建议先确认 STATE 是否按 DISABLED→RXRU/TXRU→RXIDLE 迁移,再看 CRCSTATUS 和 RXMATCH。若状态卡在某一级,问题通常出在时钟、电源或 SHORTS 配置,而不是协议栈上层。
直接写 Radio 寄存器时,务必先关闭协议栈或确保协议栈未占用 Radio;否则协议栈的中断和 SHORTS 配置会与手动配置冲突,导致事件丢失或状态异常。

把寄存器映射、初始化顺序和调试接口串起来看,Radio 调试的本质就是“配置—触发—观察—判断”的闭环:配置决定行为,任务触发动作,事件和状态寄存器给出反馈,调试接口让你看到这些反馈。掌握这套闭环,后续无论是调协议栈 API 还是排查射频异常,都能快速定位到具体寄存器或事件。