SpaceWire(简称 SpW)是由 ESA(欧洲空间局)和 NASA 联合制定的星载高速数据链路与网络协议,核心用于航天器内部设备(处理器、存储、遥测模块等)之间的高速数据传输,是星载通信的核心协议之一。
核心优势:高可靠性、低延迟、可扩展性强,支持多设备组网(通过路由器),可复用不同任务的硬件模块,降低星载设备研发成本。
1、总线结构
SpaceWire总线网络由节点、路由器和链路组成,节点之间通过链路和路由器(可选)连接。一个最简网络,由两个节点和一条链路组成;一个较为复杂的网络,由多个节点、路由器及多条链路组成。
2、协议栈
SpaceWire协议栈由物理层、信号层、字符层、交换层、包层、网络层及应用层组成。
①物理层提供传送数据的物理通路,包括电缆、连接器、电缆组件、PCB走线等物理介质。
②信号层提供可靠的信号传输模式。本标准规定了信号经DS编码后以LVDS电平形式传输。
③字符层定义数据字符、控制字符和控制码;
④交换层旨在物理通道上建立可靠的数据传输链路;
⑤包层定义数据链路上传输的数据包格式;
⑥网络层定义网络构成和运行机制;
⑦应用层由用户自行定义。
2.1物理层
物理层连接器信号定义如下:
连接方式如下
2.2信号层
信号编码方式:
SpaceWire采用DS编码方式,编码规则:D信号与数据位流一致,即当数据位为1时为高电平,当数据位为0时为低电平;S信号则在相邻数据位不变化时翻转电平。
链路速率:
- 最低信令速率:2 Mbit/s
- 初始链路建立速率:10 ± 1 Mbit/s
- 常规运行速率:2 Mbit/s 至 200 Mbit/s
2.3字符层
①数据字符
数据字符编码后字符为10位,含1位校验位、1位数据控制位和8位数据;其中,数据控制位为“0”,表示当前为数据字符;8位数据应先传低位再传高位。
②控制字符
控制字符编码后为 4 位,其中包含1位奇偶校验位 + 1位标志位 + 2位控制码。数据控制位为“1”。
③控制码
控制字符本身只携带2位信息,其能力通过特定的序列进行扩展,形成了两种核心的控制码:
- NULL (空标志):由ESC (转义码) + FCT (流控制令牌)序列构成,中间的校验位(P)为“0”。当链路上没有实际数据需要发送时,接口会持续发送NULL字符,以此来维持链路的活动状态,并支持链路断开检测功能。
- Broadcast Code (时间码):由ESC (转义码) + 一个数据字符序列构成,中间的校验位为“1”其中B0~B5为数据,B6、B7为类型。广播编码用于时间码和分布式中断码。
时间码的广播编码类型应设置为 0b00。时间码的值字段应包含一个6位的时间码值,该值为无符号二进制整数。
分布式中断码的广播编码类型应设置为 0b10。中断支持两种工作模式:
1)中断模式:仅通过网络发送中断码;
中断码值字段的位0到位4应包含中断标识符,其取值范围为0到31。中断码值字段的第5位应为0。中断码应与由其中断标识符值确定的32个可能中断之一相关联。
2)带应答的中断模式:通过网络发送中断码和中断应答码。
中断应答码应用于向中断源回传中断的应答。中断应答码值字段的位0到位4应包含中断标识符,其取值范围为0到31。中断应答码值字段的第5位应为1。与中断标识符值为N(0 ≤ N ≤ 31)的中断码相对应的中断应答码,其中断标识符值应为N。
④奇偶校验
SpaceWire采用奇校验方式,因此检验作用域内“1”的数量应为奇数。奇偶校验所覆盖的范围(包括前一个字符的部分字段(数据字符的低8位或控制字符的低2位)、当前字符的标志位和奇偶校验位本身)中,"1"的个数必须为奇数。
⑤初始传输字符
复位或链路出错时,D信号和S信号应先置0。发送器复位后应先发送校验位,且该位应置0,以使S信号先发生翻转。
2.4交换层
2.4.1链路字符和标准字符
交换层有两类字符,分别是链路字符(link-character,L-Char)和标准字符(normal-character,N-Char)。L-Char包括FCT、ESC、NULL及Time-Code,这些字符不会被传递到包层。N-Char包含传输的数据字符及包结束标识(EOP和EEP),这些字符校验正确后将被传递到包层。
①链路字符(L-Char)详解
链路字符是为数据链路自身维护设计的专用字符,不承载业务数据,仅负责链路层面的控制,四类核心 L-Char 如下:
- FCT:通常为帧控制字符(Frame Control Token),是链路层的帧定界、控制标识,用于定义帧的起始 / 结束、控制字段解析等,是链路帧结构的核心控制符。
- ESC:即转义字符(Escape Character),用于实现字符转义,解决数据中出现特殊字符时的冲突问题(例如当数据中包含 FCT、EOP 等字符时,通过 ESC 标记实现区分,避免链路解析错误)。
- Null:空字符,常用于链路同步、填充、空闲状态标识,在链路无数据传输时维持链路连接状态,或用于数据帧的空白填充。
- Time-Code:时间码字符,用于链路层的时间同步、时序校准、时延测量等,保障链路设备间的时间基准一致,常见于对同步性要求高的通信系统。
关键特性:所有 L-Char 仅在交换层内部处理,完成链路控制功能后直接丢弃,不会被转发到包层(如网络层、应用层对应的包处理模块),避免链路控制信息干扰业务数据传输。
②标准字符(N-Char)详解
标准字符是业务数据的载体,是用户实际需要传输的内容,分为两部分:
1)传输的数据字符
这是核心的业务数据,包括文本、二进制数据、业务报文等用户 / 应用层产生的有效数据,是数据传输的核心内容。
2)包结束标识
用于标识数据包的传输结束,包含两种标识:
- EOP:End of Packet,数据包结束标识,最常用的数据包终止符;
- EEP:Error End of Packet,包错误结束标识,用于标记传输过程中出现异常、存在错误的数据包的终止场景,为包层提供错误感知依据。
关键特性:N-Char 需要经过校验机制(如奇偶校验),校验正确后,才会被传递到包层,由包层进行数据包的重组、解析、路由等后续处理;若校验失败,该字符(及对应数据包)会被丢弃,确保传输数据的完整性。
2.4.2字符传输优先级
- 广播码,最高优先级;
- 帧控制字符(FCT);
- 标准字符(N-Char);
- 空字符(Null),最低优先级。
2.4.3流量控制
SpaceWire 链路针对标准字符(N-Char)的传输采用FCT(帧控制令牌)信用计数机制实现流量控制,核心由接收端授权、发送端按额度发送数据,通过双维度信用计数、固定额度限制、异常处理机制,保障链路数据传输不发生缓存溢出,实现收发端速率匹配。
①核心基础规则
- 控制信号:FCT 是流量控制的唯一核心令牌,由数据接收端发送至发送端,作为发送 N-Char 的授权依据。
- 额度映射:1 个 FCT 固定对应8 个 N-Char 的发送/接收额度,是流量控制的基本单位。
- 字符归属:EOP、EEP 属于 N-Char 范畴,无论空数据包是否被丢弃,均计入信用计数。
- 状态复位:当链路状态机进入错误复位(ErrorReset) 状态时,所有信用计数器强制置 0,重置流量控制状态。
②信用计数规则
1)发送信用计数(记录发送端可发送的 N-Char 额度)
- 计数增加:每接收到 1个FCT,发送信用计数+8;
- 计数减少:每向对端发送 1个N-Char,发送信用计数-1;
- 行为约束:计数为 0 时,发送端停止发送 N-Char,仅可发送链路控制类字符(FCT Null、广播码、L-Char)。
2) 接收信用计数(记录接收端已授权但未接收的 N-Char 额度)
- 计数增加:每向对端发送 1 个 FCT,接收信用计数 **+8**;
- 计数减少:每从对端接收 1 个 N-Char,接收信用计数 **-1**;
- 发送约束:仅当接收端有足够缓存容纳 8 个新 N-Char,且接收信用计数未溢出时,方可发送新 FCT。
③额度限制与边界规则
- 数值上限:发送信用计数、接收信用计数的最大值均为 56,对应 7 个 FCT;任意时刻,未完成确认的 FCT 数量不得超过 7 个。
- 动态适配:若接收端缓存容量不足 56 个 N-Char,接收信用计数的最大值可动态调整为小于 56 的数值;接收端实际可缓存的 N-Char 数量,可大于接收信用计数的最大值。
④异常处理机制
- 计数超限:若接收到 FCT 导致发送信用计数超过最大值 56,触发信用错误,计数器不增加并上报异常。
- 计数为 0:发送端无可用发送额度时,暂停 N-Char 传输,仅维持链路控制字符的发送,直至收到新的 FCT 恢复额度。
⑤发送行为规范
- 发送前提:发送端必须在接收到对端发送的 FCT 后,方可向对端发送 N-Char;
- 无数据场景:当无广播码、FCT、N-Char 待发送时,发送端发送 Null,维持链路激活状态;
- FCT发送条件:接收端需同时满足「缓存可容纳 8 个新 N-Char」和「接收信用计数未达上限」两个条件,才能发送 FCT。
2.4.4链路状态机
链路状态机包含以下6个状态:
- 错误复位状态(ErrorReset)
- 错误等待状态(ErrorWait)
- 准备好状态(Ready)
- 启动状态(Start)
- 连接状态(Connect)
- 运行状态(Run)
正常链路建立流程:错误复位 → 错误等待 → 准备好 → 启动 → 连接 → 运行。
发生任何异常 →直接跳回错误复位状态。
各状态核心功能如下:
①错误复位状态
1)进入条件(任一):
- 端口复位
- 在错误等待/准备好/启动状态时,发生:
- 端口无效或断开
- 校验错误、转义错误
- 接收到 FCT、N-Char 或 Time-Code
- 在启动或连接状态时,停留超过 12.8 μs 未能正常跳转
- 在运行状态时,发生:
- 端口无效或断开
- 校验错误、转义错误
- 信用错误
2)本状态操作:
- 开始6.4μs计时;
- 清除发送使能控制位;
- 清除接收使能控制位;
- 发送信用计数器置 0;
- 接收信用计数器置 0;
- 接收到 FCT 状态指示清零;
- 丢弃未发送的 Time-Code。
3)退出条件:
端口复位后,在错误复位状态停留 ≥ 6.4 μs →错误等待状态
②错误等待状态
1)进入条件:
- 从错误复位状态停留 6.4 μs 后进入
2)本状态操作:
- 开始12.8μs计时;
- 清除发送使能控制位;
- 置位接收使能控制位,但不向字符层传递 N-Char,也不寄存所有 Time-Code。
3)退出条件:
- 端口复位 →错误复位状态
- 端口无效或链路断开 →错误复位状态
- 校验错误、转义错误 →错误复位状态
- 接收到 FCT、N-Char 或 Time-Code →错误复位状态
- 停留 12.8 μs 后 →准备好状态
③准备好状态
1)进入条件:
- 从错误等待状态停留 12.8μs后进入
2)本状态操作:
- 清除发送使能控制位;
- 置位接收使能控制位,但不向字符层传递 N-Char,也不寄存所有 Time-Code
3)退出条件:
- 端口复位/无效/断开 →错误复位状态
- 校验错误、转义错误 →错误复位状态
- 接收到 FCT、N-Char 或 Time-Code →错误复位状态
- 链路使能且链路启动允许 →启动状态
- 链路使能且自启动允许,并接收到一个 Null →启动状态
④启动状态
1)进入条件:
- 从准备好状态,满足以下任一:
- 链路使能 + 链路启动允许
- 自启动允许 + 接收到一个 Null
2)本状态操作:
- 开始12.8μs计时;
- 持续发送 Null;
- 置位接收使能控制位,但不向字符层传递 N-Char,也不寄存所有 Time-Code。
3)退出条件:
- 端口复位/无效/断开 →错误复位状态
- 校验错误、转义错误 →错误复位状态
- 接收到 FCT、N-Char 或 Time-Code →错误复位状态
- 使能状态下,至少接收到一个 Null 且发送了一个 Null →连接状态
- 停留12.8μs后未正常跳转 →错误复位状态
⑤连接状态
1)进入条件:
- 从启动状态,至少接收到一个 Null 且发送了一个 Null
2)本状态操作:
- 开始12.8μs计时;
- 发送 FCT 使能;
- 无数据/控制字符时持续发送 Null;
- 发送 FCT 和 Null;
- 置位接收使能控制位;
- 接收到 FCT 时,向字符层发送 N-Char 并寄存接收到的 Time-Code;
3)退出条件:
- 端口复位/无效/断开 →错误复位状态
- 校验错误、转义错误 →错误复位状态
- 在使能状态下,至少发送了一个 FCT 且接收到了一个 FCT →运行状态
- 未发送 FCT 时接收到 N-Char 或 Time-Code →错误复位状态
- 停留12.8μs后 →错误复位状态
⑥运行状态
1)进入条件:
- 从连接状态,至少发送了一个 FCT 且接收到了一个 FCT
2)本状态操作:
- 发送 FCT、N-Char 和 Time-Code 使能
- 无数据/控制字符时持续发送 Null
- 置位接收使能控制位
- 发送 N-Char 和 Time-Code 到字符层
- 将接收到的 Time-Code 发送至网络层
3)退出条件:
- 端口复位/无效/断开 →错误复位状态
- 校验错误、转义错误 →错误复位状态
- 信用错误 →错误复位状态
2.4.5链路初始化
2.4.6差错检测
交换层可检测并处理五种接收错误,任何错误都会导致复位初始化字符同步和流控制进程。
2.5数据包层
①SpaceWire 数据包由一个或多个数据字符构成,其后跟随数据包结束标识(EOP)或数据包错误结束标识(EEP)。
②数据包的起始位置应为以下之一:
- 链路初始化之后,或链路断开后重新初始化之后发送的第一个数据字符。
- 紧接在 EOP 或 EEP 之后的数据字符。
注:前一个数据包结束后的第一个数据字符即为下一个数据包的起始。
③数据包的结束应由 EOP 或 EEP 标识。
④数据包应包含零个或多个数据字符。
注:若数据包包含零个数据字符,则该数据包将被其遇到的第一个路由交换机丢弃。
⑤数据包前部的零个或多个数据字符应构成目的地址。
⑥目的地址之后、直到 EOP 或 EEP 之前的剩余数据字符,应构成有效载荷。
2.6网络层
2.6.1 SpaceWire路由
SpaceWire 路由是一个多端口交换设备,根据数据包首字节(地址)查表或直接映射到输出端口,采用虫洞交换、信用流控、优先级转发时间码,支持路径寻址、逻辑寻址、组自适应路由和可选组播。
①路由开关(Routing Switch)核心结构
一个标准 SpaceWire 路由必须包含:
- 一个或多个端口:包括连接外部链路的SpaceWire端口和连接内部并行接口的FIFO端口(最多31个外部端口)。
- 交换矩阵(Switch Matrix):连接输入端口与输出端口,是数据转发核心。
- 路由表(Routing Table):用于逻辑地址 → 物理端口映射。
- 配置节点(Configuration Node):通过端口地址 0 访问,用于配置路由表、端口参数。
- 可选时间码寄存器:保存最近收到的时间码,并广播有效时间码。
- 可选中断中继寄存器:指示当前激活的中断,并广播中断码。
②端口寻址
- 配置端口 = 端口 0
- SpaceWire/FIFO 端口 = 1–31
- 路由根据数据包首字节决定输出端口。
③路径寻址
首字节 0–31 为路径地址(Path Address),用于直接指定下一跳端口。
- 首字节 = 0 → 路由到配置端口(端口 0)
- 首字节 1–31 → 直接路由到对应编号端口
- 路径地址可由多个字节组成(多级路由)
- 每个路由使用后删除该字节,露出下一个地址给下一个路由
- 配置端口只能通过路径寻址访问
④逻辑寻址
首字节 32–254 为逻辑地址(Logical Address),用于查表转发。
- 路由根据首字节查路由表 → 得到输出端口
- 逻辑地址不删除(除非启用 “逻辑地址删除” 功能)
- 路由表保存逻辑地址 → 物理端口映射
- 255 保留,不可使用
⑤逻辑寻址删除
路由可配置在转发前删除首字节逻辑地址。
- 每个路由可选择是否删除首字节
- 只删除一个字节
- 删除后露出下一个地址(路径 / 逻辑)给下一个路由
- 用于网络分区、多级逻辑地址扩展
⑥寻址错误处理
以下情况必须丢弃数据包:
- 首字节指向不存在的端口
- 路由表项未配置有效端口
- 逻辑地址 255(保留地址)
⑦虫洞路由
SpaceWire 路由的核心交换机制:
- 数据包到达后立即决定输出端口
- 输入端口与输出端口直通连接
- 逐字符(N‑Char)转发,不缓存整包
- 输出端口忙时,数据包在输入端口等待
- 输出端口完成当前包后才能接收新包
⑦路由仲裁
多个输入端口竞争同一个输出端口时:
- 必须使用公平仲裁(fair arbitration)
- 输出端口空闲时,选择一个输入端口接入
- 传输完成后释放端口,重新仲裁
- 公平竞争,轮流使用输出端口。
2.6.2 SpaceWire网络时间
- 组成:时间码 = ESC字符 + 数据字符(6 位计时器 + 2 位控制位)。
- 全网唯一主节点:仅一个端口作为时间主机,向网络广播时间码。
- 计时机制:
- 全网节点/路由均维护6 位计时器(0~63 循环)。
- 时间主机周期性发计时信号,本地计时器 + 1 并发出新时间码。
- 从节点/路由仅在新时间码 = 当前值 + 1时,视为有效并更新、广播。
- 传输与分发流程
- 链路端收发:接收→校验有效性→更新计时器;无效则丢弃。
- 网络分发:主机发码→中间节点校验有效→转发至其他链路;无效不转发。
- 最终实现全网计时器同步。
- 时间码丢失处理
- 丢失导致部分节点本次无法更新。
- 下次校时,未更新节点用新码更新,但不转发新码。
- 经若干次校时后,全网自动恢复同步,次数取决于网络规模与丢失位置。
3、SpaceWire 协议标识
3.1协议标识说明
- 核心作用:为实现多种协议在 SpaceWire 网络中并发运行且互不干扰,标准定义了协议标识符机制。接收节点根据数据包中的协议标识符处理报文,不支持的标识符则丢弃报文。
- 上层协议规范:基于 SpaceWire 运行的上层协议,统一在 ECSS-E-ST-50-5x 系列标准中定义,文中列举了两类典型协议:
- 远程内存访问协议(RMAP):支持对远程 SpaceWire 节点的内存读写,可用于网络配置、节点控制及数据收发,规范依据为 ECSS-E-ST-50-52。
- CCSDS数据包传输协议:将 CCSDS数据包封装进 SpaceWire 数据包进行传输,在目标节点解封装,规范依据为 ECSS-E-ST-50-53。
①数据包寻址规则
携带协议标识符的数据包到达目标节点时,结构包含单字节逻辑地址,相关规则如下:
- 地址传递:发起端发送的数据包可能包含多个前置路径/逻辑地址字节,在 SpaceWire 网络传输中会被剥离,仅保留单字节逻辑地址到达目标节点。
- 默认逻辑地址:当目标节点未配置专属逻辑地址时,固定使用254(0xFE) 作为默认值;发起端若未知目标地址,也可使用该默认地址。
- 节点适配规则:
- 目标节点可选择忽略逻辑地址为 0xFE 的数据包,并可统计并上报此类被忽略的数据包数量。
- 目标节点可支持接收一个或多个不同逻辑地址的数据包(例如同时支持 60、61、0xFE)。
②基础协议标识符
协议标识符是紧跟逻辑地址后的单字节字段,有严格的取值与分配规则:
- 核心取值定义:
- 取值0(0x00):保留用于扩展协议标识符(EPI),是扩展标识的触发标识。
- 取值255(0xFF):保留用于未来扩展,禁止使用。
- 标识符分配范围:
- 1~239(0x01~0xEF):标准化标识符,由 SpaceWire 工作组统一分配,是当前已批准协议的专用范围,可保证多协议并发运行。
- 240~254(0xF0~0xFE):项目自定义标识符,由项目自行分配,存在与其他用户协议冲突的风险,无标准化保障。
③扩展协议标识符
当基础单字节标识符无法满足需求时,可使用扩展标识符,其规则如下:
- 启用条件:仅当节点支持扩展协议标识符时生效,此时基础协议标识符取值为 0x00,其后紧跟两个字节组成 16 位的扩展协议标识符,最多可支持 65535 种协议。
- 禁用与丢弃规则:
- 若节点不支持扩展协议标识符,所有基础标识符为 0x00 的数据包必须丢弃。
- 扩展标识符取值 0x0000~0x00FF 为未来保留值,禁止使用,包含该范围的数据包必须丢弃。
- 统计机制:不支持扩展协议标识符的节点,可统计并上报接收到的扩展标识符数据包数量。
3.2 CCSDS数据包传输协议
CCSDS 数据包传输协议用于将CCSDS 空间数据包封装进 SpaceWire 数据包,在 SpaceWire 网络中从发起端传输至目标端,解封装后交付给目标用户应用;不提供传输确认、重传机制,也不校验 CCSDS 数据包内容与格式,仅负责封装/解封装与数据透传。
①协议定位与服务特性
- 服务类型:单向、异步、无确认的数据传输服务,仅提供单源到单目的地的透传能力。
- 服务访问点(SAP):通过 SpaceWire 地址标识,服务数据单元按提交顺序处理,协议不强制定义流控方案。
- 服务能力:不保证数据完整性、无重传、不校验 CCSDS 数据包格式、不保证数据单元序列保持;端到端服务质量由底层 SpaceWire 网络提供。
- 序列保持:仅单路由拓扑(无组自适应路由)可保持数据包序列,多路由拓扑无法保证。
②核心参数定义
- CCSDS 数据包:遵循 CCSDS 133.0-B-1 标准,为协议服务数据单元。
- 数据包长度:最小 7 字节,最大 65542 字节;项目可自定义任务级最大长度。
- 状态码:用于标识数据包有效性,取值:
- 0x00:数据包正常
- 0x01:以数据包结束符(EEP)终止到达
- 0x02:保留字段非零
- 目标地址:包含目标 SpaceWire 路径地址、目标逻辑地址(默认值 254/0xFE,目标可支持多逻辑地址)。
- 用户应用值:8 位自定义字段,可用于虚拟通道标识等用户专属用途。
③CCSDS数据包格式
- 字段结构与顺序:空间数据包必须包含两个连续的必选字段,顺序固定:
- 数据包主包头(Packet Primary Header):固定长度为 6 字节,是所有空间数据包的必备头部。
- 数据包数据域(Packet Data Field):长度为 1~65536 字节,承载业务数据。
- 总长度约束:单个空间数据包的总长度(主包头 + 数据域)必须满足:
- 最小长度:7 字节(6 字节包头 + 1 字节数据域)
- 最大长度:65542 字节(6 字节包头 + 65536 字节数据域)
- 空闲包(Idle Packet)特殊说明:
- 当数据包的应用进程标识符(APID)为保留值,且数据域填充为项目指定的空闲模式时,该包被称为空闲包。
- 空闲包由遥测(TM)、高级在轨系统(AOS)、统一空间数据链路协议(USLP)等协议按需生成,用于维持数据传输过程的同步。
1)数据包主包头
4、典型应用
①路由器:采用IP核或专用芯片,实现协议栈与数据包路由功能,提供两类接口:
- 与节点或其他路由器连接的链路接口
- 与主机系统连接的主机接口
②节点:采用IP核或专用芯片,实现协议栈及数据包的源起与接收功能,提供两类接口:
- 与路由器或其他节点连接的链路接口
- 与内部控制器(如CPU、FPGA逻辑)连接的控制器接口
③链路物理介质:
使用SpaceWire专用电缆与接插件,统一采用9芯插座/插针(设备端为插座,电缆端为插针),电缆按接点3互连方式连接。为保证传输可靠性,链路两端设备必须良好共地。