2. UWB物理层广播机制详解:帧结构、前导码、SFD、PHR、PSDU
各位工程师朋友,咱们今天来啃一块硬骨头——UWB物理层的广播帧结构。说实话,我刚接触UWB那会儿,看着协议栈里那一堆缩写,头都是大的。前导码、SFD、PHR、PSDU……这些到底在物理层怎么排布的?为什么丢包往往就丢在这些环节?
别急,咱们一层层剥开它。你想想看,UWB的广播本质上就是往空气里扔数据包,接收端得知道什么时候开始收、收多长、收完怎么校验。这套机制,全写在帧结构里了。
核心认知:UWB物理层广播帧 = 前导码 + SFD + PHR + PSDU。前三个是“信封”,PSDU才是“信”。丢包,多半是信封没写好或者没读对。
2.1 帧结构总览:一个数据包的四段旅程
先看整体结构。UWB的物理层帧(PPDU)分为四段,每一段都有明确的职责。我习惯把这四段比作快递包裹的四个部分:
- 前导码(Preamble) —— 快递员的吆喝声:“有包裹来啦!”
- SFD(帧起始定界符) —— 包裹上的“拆封线”,告诉接收端“正文要开始了”
- PHR(物理层头部) —— 快递单,写着包裹有多重、用什么方式包装
- PSDU(物理层服务数据单元) —— 包裹里的实际物品,也就是你要传的数据
下面这张图把整个流程串起来了,我建议你多看几眼,后面每个环节都会对应到这张图上的位置。
2.2 前导码(Preamble):接收端的“唤醒铃”
前导码是帧的第一个部分,说白了就是一段已知的符号序列。接收端在空气里啥也没听到的时候,一直在做“盲搜”——拿本地已知的前导码序列跟接收信号做相关运算。一旦相关峰超过阈值,就知道“有信号来了”。
我在项目中遇到过一个问题:两个标签同时广播,前导码撞在一起,接收端相关峰乱跳,结果两个包全丢了。后来怎么解决的?给不同标签分配不同的前导码序列。嗯,这就是IEEE 802.15.4z里提到的“前导码序列索引”的作用。
实战建议:前导码长度可以配置。长前导码(1024符号)抗干扰强但占空比高,短前导码(32符号)省电但容易丢。我一般建议广播场景用128或256符号,平衡一下。
2.3 SFD(帧起始定界符):精准的“起跑线”
SFD紧跟前导码之后。它的作用很单纯——告诉接收端:“前导码结束了,后面是正经数据了。”SFD也是一个已知序列,但比前导码短得多。
你可能会问:前导码已经做了同步,为什么还要SFD?
原因很简单:前导码的相关峰是一个“平台”,不是精确的边界。SFD的序列设计让相关峰变得尖锐,能精确锁定PHR的起始位置。我记得有一次调试,发现接收端老是解错PHR,查了半天——SFD检测阈值设得太低了,把噪声当成了SFD。
| 参数 | 前导码 | SFD |
|---|---|---|
| 主要功能 | 粗同步、信道估计、AGC | 精确定位帧起始边界 |
| 序列长度 | 32~4096符号 | 8~64符号 |
| 已知性 | 收发双方约定 | 收发双方约定 |
| 检测方式 | 滑动相关 + 峰值检测 | 固定序列匹配 |
| 丢包影响 | 检测不到则整个帧丢失 | 边界偏移导致PHR/PSDU全错 |
2.4 PHR(物理层头部):数据包的“说明书”
PHR只有19比特,但信息量很大。它告诉接收端:后面PSDU有多长、用什么数据速率、有没有使用SECDED(单纠错双检错)编码。
PHR的结构是这样的:
- 数据速率(3比特):110kbps、850kbps、6.8Mbps等
- 帧长度(10比特):PSDU的字节数,最大1023字节
- 保留位(1比特):留给扩展用
- SECDED校验(5比特):对前面14比特做纠错保护
这里有个坑,我踩过。PHR本身是用最低速率(110kbps)传输的,为什么?因为接收端还没从PHR里读到速率信息,只能用默认最低速率解PHR。等PHR解出来,才知道后面PSDU用什么速率。这有点像“先自我介绍,再说正事”。
⚠️ 避坑指南:我曾经在项目中把PHR里的帧长度字段写错了,导致接收端一直等数据,等到超时。广播场景下,PHR错误会让整个网络都收不到这个包。建议在发送端加一个PHR的软件校验,别完全依赖硬件。
2.5 PSDU(物理层服务数据单元):真正的“货”
PSDU就是你要传的数据。在广播场景里,它通常包含:
- 源地址(2字节)
- 序列号(1字节)
- 时间戳(4~8字节)
- 数据载荷(若干字节)
- FCS校验(2字节)
PSDU的传输速率由PHR指定。速率越高,传输时间越短,但接收灵敏度越低。我在做室内定位时,广播包通常用6.8Mbps,因为距离近、干扰少,省电才是硬道理。
但要注意:PSDU的FCS只校验PSDU本身,不校验前导码、SFD和PHR。也就是说,如果PHR被干扰了,接收端可能用错误的参数去解PSDU,FCS大概率过不了——包就丢了。
2.6 广播丢包与帧结构的关系
咱们把丢包原因和帧结构对应起来,你就能精准定位问题了:
| 丢包现象 | 可能出问题的帧段 | 排查方向 |
|---|---|---|
| 接收端完全没检测到信号 | 前导码 | 发射功率、前导码长度、信道干扰 |
| 检测到信号但解不出PHR | SFD / PHR | SFD阈值、PHR校验、速率配置 |
| PHR解出但PSDU校验失败 | PSDU | 数据速率过高、多径干扰、长度字段错误 |
| 部分节点能收到、部分收不到 | 前导码 / PHR | 节点间时钟偏差、前导码序列不匹配 |
你看,丢包不是玄学。每一类丢包都能在帧结构里找到对应的“病灶”。后面几章我们会针对每个环节给出具体的优化方案,但前提是——你得先看懂帧结构。
本章小结:UWB物理层广播帧 = 前导码(唤醒+粗同步)→ SFD(精确定界)→ PHR(速率+长度)→ PSDU(数据)。丢包排查时,先定位是哪个阶段出了问题,再对症下药。