☰
5G小基站PHY-MAC接口的FAPI SPI规范SCF222核心机制与实现
2026/10/20 18:11:48 网站建设 项目流程

简介:Small Cell Forum 发布的 SCF222 规范(5G FAPI: PHY API)是面向 5G 小基站物理层接口研发的标准文档,旨在为小基站与射频单元之间的 FAPI/SPI 通信提供统一接口定义,解决不同厂商硬件、软件和应用层之间的互操作与定制化难题。该规范隶属 SCF Release 10.0 的 5G 系列文档,发布于 2020 年 3 月,版本 2.0.0,正文界定了功能应用平台接口的范围,并围绕公共 API 给出物理层控制与数据交互的标准化约定。资源包内为 1 个 PDF 文件,大小 2.36MB,目前已有 1438 人学习。阅读者可系统掌握 FAPI PHY API 的设计思路、SPI 物理层消息参数、调度与帧结构要求,理解 Small Cell Forum 面向多厂商生态的标准化方法,适合从事 5G 小基站 L1 开发、基带设计或系统集成的工程师作为设计参考。

1. 5G小基站PHY-MAC接口:FAPI PHY SPI规范拆解与落地思路

做5G小基站的L1/L2开发,迟早会碰上一个问题:MAC层怎么把调度结果交给PHY层,PHY层处理完后怎么把结果还回来。不同基带方案各有各的私有接口,但跨厂商协作时基本都往FAPI标准上靠。SCF222就是5G小基站场景下MAC与PHY之间的FAPI PHY SPI规范,把配置、调度、数据、反馈四类交互定义成一套可对照实现的服务原语接口。这份文档值得下载下来当对接蓝本,尤其适合正在做5G小基站PHY集成或MAC-PHY联调的工程师,以及想了解小基站基带内部接口的新人。后面几章我按“接口定位→核心机制→落地避坑→验证技巧”的顺序,把这份规范讲透。

2. FAPI与SPI接口的定位:PHY-MAC之间为什么需要标准化对接

2.1 小基站基带分层:MAC与PHY之间到底隔着什么

小基站基带的协议栈和终端侧类似又不同。从高层看是MAC、RLC、PDCP往上走,往下看是PHY。MAC负责调度、HARQ进程管理、逻辑信道复用,PHY负责CRC加扰、编码调制、OFDM符号生成、射频前端控制。两层的职责边界很清楚,但实际芯片实现里,MAC和PHY经常是两个不同的硬件模块,甚至来自不同供应商。

这就出现一个现实问题:MAC要告诉PHY“下一个时隙该用哪个MCS、占哪些RB、用哪个HARQ进程发什么数据”,PHY要告诉MAC“这个传输块CRC过了没有、HARQ该清掉还是重传”。如果没有统一接口,每换一个PHY方案就要重新协商一套私有通信协议,适配工作量大且容易出错。

FAPI就是把这层标准化。FAPI全称Functional Application Platform Interface,定义了L2与L1之间的控制面与数据面原语。它不关心PHY是DSP实现、ASIC实现还是纯软件实现,只要两端都按FAPI原语组包、解包,就能对上。

注意:FAPI里的SPI全称是Service Primitive Interface,服务原语接口,和硬件上常见的四线串行外设接口SPI总线是两个东西。读SCF222时凡是出现SPI,都指服务原语,不要被名字带偏。

SCF222这个编号对应的是5G NR版本的PHY SPI规范。它把4G时代的FAPI能力做了扩展,新增了NR必需的高阶MCS、可配置numerology、TDD灵活帧结构、波束管理等参数定义。如果你之前只看过4G的FAPI文档,跳到5G时最容易翻车的地方是消息字段的扩展与移位,后面会单独拆。

2.2 SCF222的消息类别:配置、控制、数据、信息四件事

SCF222把PHY-MAC之间的交互按消息方向和作用划分成几类。理解这个分类,是后面读字段定义和处理流程的基础。

第一类是配置类消息。典型的是PARA_CONFIGURE和CONFIG_REQUEST/CONFIG_RESPONSE。PARA_CONFIGURE用于下发小区级PHY参数,比如小区ID、系统带宽、numerology、CP长度、天线端口数。CONFIG_REQUEST/CONFIG_RESPONSE一般用于查询或动态修改参数,MAC发起请求,PHY回响应。

第二类是控制类消息。核心是SLOT_INDICATION,MAC在每个处理周期告诉PHY当前帧号和时隙号,触发PHY开始处理下行或准备上行接收。还有DL_TTI_CONFIG、UL_TTI_CONFIG这类针对单个TTI的调度配置,里面带RB分配、MCS、HARQ进程、NDI等信息。

第三类是数据类消息。DL_TTI_DATA承载从MAC到PHY的下行传输块数据,UL_TTI_DATA承载PHY解调译码后交回MAC的上行传输块。数据消息和控制消息在时序上通常分开,而且有严格的先后约束。

第四类是反馈类信息,统一用各种INFO消息上报。比如DL_INFO把下行信道处理结果、HARQ相关状态带回MAC,UL_INFO上送上行链路的测量与译码状态。

消息类别典型消息流向作用
配置类PARA_CONFIGURE / CONFIG_REQUESTMAC→PHY下发小区级参数、查询或修改生效配置
控制类SLOT_INDICATION / DL_TTI_CONFIGMAC→PHY指示时隙与单TTI调度配置
数据类DL_TTI_DATA / UL_TTI_DATA双向承载上下行传输块数据
信息类DL_INFO / UL_INFOPHY→MAC上送CRC状态、HARQ反馈与测量信息

这四类消息在一个调度周期内的典型顺序是:配置完成之后,MAC先发SLOT_INDICATION,再下发DL_TTI_CONFIG和DL_TTI_DATA,PHY处理完后在约定时间把DL_INFO回给MAC。上行路径则是MAC通过UL_TTI_CONFIG授权,PHY在收完空口数据后通过UL_TTI_DATA和UL_INFO上报。这套顺序两端都要实现,违反顺序就会出现数据错乱或时序超时。

2.3 选型理由:私有接口与FAPI的取舍

很多项目在立项时纠结过:自己定义一套MAC-PHY内部接口不行吗?可以,尤其在单一厂商自研端到端的时候,私有接口往往更高效,消息可以按内部数据结构精简,省去标准化的序列化开销。

但一旦涉及多厂商组件,私有接口的代价就显现了。MAC侧调度器对接不同PHY实现时,要重复开发适配层,每次都要重新对齐寄存器或消息定义。反过来,PHY供应商要适配不同MAC方案也一样。

FAPI的优势在于边界清晰。MAC侧只需要发标准原语,PHY侧按SCF222实现原语处理,两边各自的内部逻辑可以自由优化。这种边界对小基站产品尤其合适,因为很多小基站方案是上层协议栈软件与底层PHY射频硬件解耦采购的。

我一般会从这几个条件判断要不要切到FAPI:一是MAC与PHY来自不同团队或供应商,二是想要未来替换PHY时只改适配不重写调度,三是有现成的FAPI参考实现可以借力。如果全是自研且无替换计划,私有接口确实能用,但最好预留一层SCF222映射适配,为后续扩展留一条路。实际开发中,不少模拟项目X就是在私有接口基础上加了SCF222适配层,这个适配层修改成本不高但价值不小。

3. SCF222核心机制拆解:配置流程、时隙调度与HARQ交互

3.1 PARA_CONFIGURE配置流程:小心“发过去就完事”的错觉

SCF222里最容易被看轻的就是配置流程。很多开发者习惯性地认为,配置消息发到PHY,只要PHY不报错,参数就算生效了。问题是配置类消息的处理结果不是只有一种。

PARA_CONFIGURE的典型处理流程是:MAC组包下发,PHY收到后执行参数写入与初始化,完成后回送CONFIGURE_RESPONSE或参数校验结果。如果参数组合非法,比如带宽索引配了保留值、numerology与CP类型搭配不支持,PHY会在响应里给出错误指示,而不是悄悄忽略。

我在对接时必须看完整的配置阶段时序:

第一步先确认PHY已经处于可配置状态,有些实现要求PHY先就绪才能接收PARA_CONFIGURE; 第二步检查PARA_CONFIGURE携带的小区级参数是否和空口配置一致,比如带宽、子载波间隔、循环前缀; 第三步等CONFIGURE_RESPONSE回来,比对响应里带的事务ID和本端发出去的是否一致; 第四步做参数回读确认,很多PHY实现支持通过CONFIG_REQUEST把当前生效参数读回来。

下面是PARA_CONFIGURE里比较关键的参数字段,按我拆过的项目经验,最容易出问题的集中在标红的这几类:

参数项作用常见错误
Cell ID小区标识,用于加扰初始化与高层配置不一致,导致解扰失败
System Bandwidth系统带宽,决定RB范围带宽索引与RB数换算关系用错
Numerology子载波间隔索引,影响时隙时长5G NR的numerology对应关系不熟
CP Length循环前缀长度TDD配比切换时未跟随调整
TX/RX Antenna Count天线端口数与波束配置联动检查遗漏

提示:配置消息“发出去了”不等于“生效了”,必须等PHY回确认回执,并建议再做一次参数回读才能算数。

上面这张表不是全量字段,实际SCF222里还有更多配置项。我的建议是拿到规范后先画一张分类表——哪些参数只在配置阶段下发,哪些参数每个TTI都会变化,哪些参数是UE级别,哪些是小区级别。这样后面联调时能快速定位问题出在哪个消息里。

3.2 SLOT_INDICATION时隙调度:触发链路的关键命门

SLOT_INDICATION是FAPI里最像时钟信号的消息。MAC在每一个需要PHY处理的时间点发出一条SLOT_INDICATION,消息里带System Frame Number和Slot Index,PHY根据这个指示确定当前处理的是哪个时隙。

这张“时隙地图”非常重要,因为5G NR的时隙时长随numerology变化。同样是1毫秒,30kHz子载波间隔下对应2个时隙,60kHz下对应4个时隙。PHY内部有大量按时间片预分配的任务,比如下行编码、上行译码、测量上报,都要以SLOT_INDICATION为基准对齐。

SCF222里除了帧号、时隙号,SLOT_INDICATION通常还会带当前时隙类型是否上行、是否包含同步信号等信息。MAC发出SLOT_INDICATION到PHY开始处理,这之间的时间预算在系统设计时就要量好。如果MAC侧调度软件偶发阻塞,SLOT_INDICATION到达变晚,后面的DL_TTI_CONFIG和DL_TTI_DATA全都会跟着压到处理窗口外面,PHY要么丢数据要么报时序错误。

具体时序链上,我一般按这个顺序核对:

第一,确认PHY在收到SLOT_INDICATION后是否立即刷新内部时隙状态; 第二,确认DL_TTI_CONFIG紧跟SLOT_INDICATION到达,且消息里的时隙号与SLOT_INDICATION一致; 第三,确认PHY处理完下行数据后,通过携带对应时隙号的反馈消息上送结果; 第四,如果中间插入测量GAP或者SSB调度,要确认TDD上下行配比变化时PHY内部状态没有错位。

这里有个容易被忽略的细节:SLOT_INDICATION的提前量不是越大越好。发太早,PHY可能还没准备好接收对应时隙的配置;发太晚,处理时间不够。提前量本身也是一项需要校准的参数,不同PHY实现给出的建议窗口不一样。

3.3 HARQ反馈交互:ACK/NACK与CRC状态的消息对应关系

HARQ进程管理在MAC侧,物理层的HARQ相关状态却是PHY在管。SCF222用DL_INFO消息把下行传输块的CRC状态上报给MAC,MAC据此生成ACK/NACK,调度重传或初传。

这里面最容易绕弯的是下行HARQ反馈路径。PHY完成译码后,把每个传输块的CRC状态、HARQ进程号、NDI信息打包进DL_INFO;MAC收到后,通过HARQ_id找到对应进程,更新状态变量。如果这个映射不对,就会把新传数据当成重传,或者把重传混进新传进程。

上行方向相对简单一点,PHY把解调译码后的MAC PDU带上行CRC状态通过UL_TTI_DATA送上来,MAC按进程处理。

做联调时,我发现一个提高排查效率的技巧:把HARQ交互涉及的关键字段单独打印出来,形成一张映射检查表。比如:

字段期望行为异常表现
HARQ Process ID与MAC侧进程管理一致进程号越界或重复
New Data Indicator新传翻转、重传保持NDI不变但被当成新传
CRC Status成功后置位长时间CRC全0
Slot Offset反馈时隙偏移符合配置反馈提前或滞后

按这个表逐项核对,大多数HARQ错乱问题都能收敛到某一个字段上。尤其是Slot Offset,它在不同numerology下的换算结果完全不同,我曾经因为统一按15kHz子载波间隔换算时隙偏移,导致TDD站点在上行时隙反馈延迟差了整整一个时隙,查了快两天。

4. 对接实践与避坑:SCF222落地时的常见问题与排查

4.1 配置不生效:PHY不回响应,消息像进了黑洞

现象:MAC下发PARA_CONFIGURE后,迟迟等不到PHY的CONFIGURE_RESPONSE,状态机卡在配置等待阶段,反复超时重发。

原因:这种问题多半不是PHY没收到消息,而是收到了但解析失败或参数校验没通过。最常见的原因是消息体格式不对,比如结构体字节对齐规则不一致、大小端处理反了、参数校验字段位置偏移。还有一次排查让我印象很深,问题出在消息长度字段没更新,PHY按错误长度截断了解析。

解决:先在MAC侧把原始报文的十六进制打出来,与规范附录里的消息格式逐字节比对;再检查结构体定义的对齐规则,尤其是用了不同编译器或不同架构的处理器时,强制确认结构体打包方式一致;最后把PHY侧日志打开,看配置入口有没有收到完整消息、校验错误码是什么。从那以后我每次联调第一件事就是先做一次全量原始报文字节对齐比对,提前把这种低级坑踩掉。

4.2 处理窗口不够:SLOT_INDICATION到达抖动导致数据迟到

现象:空口信号正常发射,但终端侧总上报下行速率不稳,或者PHY频繁报时隙超时错误。抓日志发现SLOT_INDICATION到达PHY的时间点偏差很大,有时提前、有时滞后。

原因:MAC侧软件在高负载时发生调度延迟,SLOT_INDICATION的触发时间被挤到处理窗口边缘,留给PHY的处理时间不足。另一个相关原因是相邻时隙的调度间隔没有设置余量,低估了PHY从收到指示到完成数据准备的最差时延。

解决:这类问题没有玄学空间,只能算时间预算。常见做法是MAC侧给SLOT_INDICATION设置一个安全提前量,宁可让它早到一点也不要迟到;PHY侧把时隙处理任务拆成收到指示立即执行的短路径和等完整配置后再执行的长路径,尽量把能提前算的都预计算好。另一个有效措施是统计一昼夜的到达抖动,按最大值加上安全余量来定处理预算。光靠调高PHY时钟频率只会掩盖问题,治标不治本。

4.3 CRC与HARQ映射错乱:重传数据被当新传

现象:下行吞吐率不稳,误块率抬升,MAC侧的HARQ进程状态频繁混乱,重传数据被当成新传数据处理。

原因:DL_INFO消息里上报的HARQ进程号与MAC侧当前激活的进程号没有对上。常见原因有两种:反馈消息里的时隙偏移填错,MAC按错误时隙索引到了别的进程;或者上行方向收到的ACK/NACK周期与MAC侧记录不一致。

解决:先把HARQ进程映射表打出来,确认每个进程号在MAC与PHY两侧的状态是否一致。然后核对DL_INFO里的时隙偏移字段换算出来的时隙序号,看是不是真的指向当前传输对应的HARQ进程。最后检查NDI翻转逻辑,确认MAC侧是不是按标准流程处理新传与重传。这一步没有捷径,只能按字段逐项排查。

4.4 参数与标准表格脱节:MCS越高性能反而越差

现象:把调度MCS调高后,传输块大小增长不匹配,空口速率不升反降,BLER也明显恶化。

原因:这属于很典型的“两张表错位”——用LTE的MCS-TBS对应关系去算NR的传输块大小,或者没有按NR的调制阶数和资源块数重新计算TBS。SCF222消息里下发的是mcs索引、rb数量、tbs_size等字段,但tbs_size必须来自NR标准定义的表格或计算公式,不能沿用4G概念。

解决:先对照NR标准里的传输块大小确定流程,重算当前RB数与MCS下的TBS;再比对SCF222消息里填的tbs_size,看两者是否一致;最后检查调制阶数与MCS索引是否匹配。这个坑在4G转5G的项目里尤其容易踩,因为老代码里通常带了一套LTE的TBS表被顺带继承下来。建议在代码里单独建一个NR的TBS计算模块,避免老代码被无意复用。

5. 进阶验证:用SPI日志与参数回环确认PHY-MAC对接质量

SCF222落地不能光靠上板联调,我习惯在无空口环境里先把接口通道验证到七八成,再推射频联调。

第一个技巧是参数回环验证。PHY支持配置回读的话,可以设计一条测试序列:下发一组已知参数,再用CONFIG_REQUEST把生效参数读回来比对。多试几组带宽、numerology、天线数的组合,能覆盖大部分配置字段的对接错误。

第二个技巧是SLOT_INDICATION时间戳打点。在MAC侧和PHY侧分别记录同一条SLOT_INDICATION消息的到达时刻,再统计一周期的差值分布。我一般会写个小脚本从日志里提取时间和消息类型:

import re from collections import defaultdict lines = open("spi_log.txt", encoding="utf-8").readlines() records = defaultdict(list) for line in lines: m = re.search(r"(\d+\.\d+)\s+(SLOT_INDICATION|DL_TTI_DATA|DL_INFO)", line) if m: records[m.group(2)].append(float(m.group(1))) slots = records["SLOT_INDICATION"] if len(slots) > 1: jitter = [b - a for a, b in zip(slots[:-1], slots[1:])] print("slot delta: min=%.3fms max=%.3fms" % (min(jitter), max(jitter)))

这段脚本做了两件事:一是用正则从日志里抓时间戳和消息名,二是把相邻SLOT_INDICATION时间戳做差,算出抖动范围。如果想换消息类型,把正则里的消息名改成DL_INFO或UL_TTI_DATA就行。时间格式最好统一成毫秒级浮点数,否则差值会出现微秒与毫秒混算的问题。实际用的时候,还要把PHY内部处理完成的打点也加进去,形成从SLOT_INDICATION到PHY完成处理的完整时延链,这样才能看出瓶颈在编码段还是反馈段。

第三是数据回环验证。不上空口时,可以把DL_TTI_DATA的数据回环到上行路径,让MAC发下行数据后在上行反馈中看到预期的传输块内容,验证数据通路完整性。配不同的RB数、不同的传输块大小做回归,可以得到一张成功率对照表。

印象最深的一次教训是某项目中跳过配置回读,结果小区带宽参数静默写成保留值,整机在空口测试时各种异常,查了一整天才发现配置阶段根本没做参数比对。从那以后我每次对接SCF222相关的接口,都强制走一遍配置回读加时延统计,这两步花不了多少时间,却能把后面联调的问题提前过滤掉一大半。希望这套验证习惯对你也有用。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询