2. CPRI基本帧结构:基本帧长度、超帧与无线帧结构、控制字与IQ数据映射

好,咱们今天来聊聊CPRI协议里最核心的东西——帧结构。说实话,我刚开始接触CPRI的时候,看着那一堆帧、超帧、无线帧的层级关系,头都大了。但后来在调试中吃过几次亏,才真正理解了这些设计背后的用意。

CPRI的帧结构,说白了就是解决一个问题:怎么把基带的IQ数据和各种控制信息,高效、准时地塞进一根光纤里。它分成了三个层级:基本帧、超帧、无线帧。咱们一层层剥开来看。

2.1 基本帧:最小的传输单元

先看最底层——基本帧。这是CPRI传输的最小数据块,长度固定为1个基本帧 = 1个字节 × 16行 = 16个字节。嗯,这里要注意,基本帧的时长是固定的1/3.84 MHz ≈ 260.42 ns。为什么是这个数?因为CPRI的时钟基准和3.84 MHz的码片速率挂钩,你想想看,这样设计方便和WCDMA/LTE的基带处理对齐。

关键参数:

  • 基本帧长度:16字节(1字 × 16行)
  • 基本帧时长:260.42 ns
  • 每字节对应一个特定的控制字或IQ数据位置

我在项目中遇到过一个问题:有个同事把基本帧的字节顺序搞反了,结果IQ数据解出来全是乱的。后来查了半天,才发现是字节序的问题。所以这里我建议你,拿到CPRI数据流的第一步,先确认字节序是大端还是小端,很多厂商的实现并不完全一致。

2.2 超帧:256个基本帧的集合

基本帧之上是超帧。一个超帧包含256个基本帧,编号从#0到#255。超帧的时长就是 256 × 260.42 ns ≈ 66.67 μs。这个数字熟悉吗?对,正好是LTE一个时隙(slot)的时长。

超帧的作用是什么?说白了,就是给控制字一个“轮巡”的周期。因为基本帧里只有16个字节,控制字和IQ数据是共享这些字节位置的。通过超帧的帧号,接收端就知道当前这个基本帧里,哪些字节是控制字,哪些是IQ数据。

层级 组成 时长
基本帧 16字节 260.42 ns
超帧 256个基本帧 66.67 μs
无线帧 150个超帧 10 ms

个人经验:调试时,我习惯先锁定超帧的起始位置。怎么找?找控制字里的同步字节(比如0x50, 0x51这些)。一旦找到超帧边界,后面的解析就顺了。

2.3 无线帧:10 ms的宏观结构

再往上,是无线帧。一个无线帧包含150个超帧,总时长正好是10 ms。这个10 ms,和LTE/NR的无线帧时长完全一致。你看,CPRI的设计思路很清晰:从基本帧到无线帧,每一层都跟无线空口的时序对齐

无线帧的编号从#0到#149。在CPRI Option 1(线速率614.4 Mbps)下,一个无线帧的数据量是:150 × 256 × 16 = 614,400字节。这个数字刚好和线速率对应上,设计得很巧妙。

我曾经在调试一个5G NR的前传链路时,发现RRU和BBU之间的帧号对不上。排查下来,是无线帧的起始偏移没配置对。嗯,这里要注意:不同厂商的设备,无线帧的起始点可能差几个超帧,一定要在联调前确认好。

2.4 控制字:藏在帧里的“管理通道”

控制字是CPRI里最容易让人迷惑的部分。每个基本帧的16个字节里,有一部分是控制字,一部分是IQ数据。具体怎么分配?看线速率。

以最常见的CPRI Option 2(线速率1.2288 Gbps)为例:

  • 每个基本帧的第1个字节(Byte #0)是控制字
  • 第2~16个字节(Byte #1~#15)是IQ数据

控制字又分两种:

  • 同步控制字(Z.X.0):用于帧同步、超帧号、无线帧号等
  • 慢速控制字(Z.X.Y, Y≠0):用于C&M(控制和维护)信息、Vendor Specific数据等

避坑指南:我曾经在调试时,发现控制字里的C&M数据总是丢包。后来用逻辑分析仪抓了波形,才发现是控制字的超帧周期没算对。控制字不是每个基本帧都更新的,有些控制字只在特定的超帧号上才有效。比如慢速控制字,可能每8个超帧才更新一次。你如果按每个基本帧去读,读到的全是重复数据。

2.5 IQ数据映射:把天线数据塞进帧里

IQ数据是CPRI传输的主体。每个天线载波(AxC)的IQ采样数据,被映射到基本帧的IQ数据字节里。映射方式取决于:

  • IQ位宽:常见的有8位、12位、16位、20位
  • AxC数量:一个CPRI链路可以承载多个天线载波
  • 采样率:和无线制式相关(LTE通常30.72 MHz,NR可能更高)

举个例子,假设一个LTE 20 MHz系统,IQ位宽16位,每个基本帧里能放多少个IQ采样?

基本帧有15个字节给IQ数据,每个IQ采样占4字节(I和Q各16位,共32位)。所以每个基本帧能放 15 × 8 / 32 = 3.75个采样?不对,这里要注意:IQ数据是连续存放的,不会跨基本帧拆分。实际上,每个基本帧放3个完整的IQ采样,剩下的3个字节留给下一个基本帧。

// 伪代码:IQ数据映射示例
// 假设:IQ位宽16位,每个基本帧15字节IQ数据
// 每个基本帧可放3个IQ采样(3 × 4字节 = 12字节)
// 剩余3字节作为填充或留给下一个基本帧

for (int i = 0; i < 256; i++) {  // 遍历超帧内的256个基本帧
    for (int j = 0; j < 3; j++) {  // 每个基本帧3个IQ采样
        iq_sample[i*3 + j].I = (basic_frame[i].iq_data[j*4] << 8) | basic_frame[i].iq_data[j*4 + 1];
        iq_sample[i*3 + j].Q = (basic_frame[i].iq_data[j*4 + 2] << 8) | basic_frame[i].iq_data[j*4 + 3];
    }
}

调试技巧:我建议你在解析IQ数据时,先抓一段已知的测试序列(比如全0、全1、或者正弦波)。如果解出来的IQ数据符合预期,说明映射关系是对的。如果不对,先检查控制字里的AxC配置信息,看看天线数和位宽是否匹配。

2.6 小结:帧结构设计的核心思想

CPRI的帧结构,其实就三个要点:

  1. 层级对齐:基本帧→超帧→无线帧,每一层都和无线空口的时序对齐,方便基带处理
  2. 控制与数据分离:控制字和IQ数据在同一个基本帧里,但通过超帧号来区分用途
  3. 灵活扩展:通过调整IQ位宽、AxC数量、线速率,可以适配不同的无线制式

说实话,CPRI的帧结构设计得相当精巧。你如果理解了这三层结构,后面再看eCPRI的包结构,会发现很多相似之处。好了,这一章就到这里。下一章咱们聊聊CPRI的线速率和链路层,那又是另一个有意思的话题。