第三章 ARINC 429 总线协议详解:Label 编码规则、SDI 与 SSM 字段含义、奇偶校验机制

各位同学,今天我们聊聊 ARINC 429 协议里最核心的几个字段。说实话,搞懂这几个字段,你基本就能读懂 90% 的 429 报文了。我当年刚接触航电时,对着示波器上的波形一头雾水,后来才发现,其实就是这几个字节在翻来覆去地讲故事。

3.1 Label 编码规则:报文的“身份证号”

每个 ARINC 429 数据字,最前面 8 个比特就是 Label。它用来告诉接收端:这条报文里装的是什么数据。比如是空速、高度,还是航向角。

Label 的编码方式有点特别。它采用 反向传输顺序,也就是最低有效位(LSB)先发。你想想看,如果你在总线上抓到一个字节是 0x12,实际对应的 Label 值其实是 0x48。为什么?因为比特顺序是反的。

举个例子:

假设你要发送 Label = 203(八进制),二进制是 010 000 011。

反向排列后变成 110 000 010,也就是十六进制的 0xC2。

所以你在总线上看到的字节是 0xC2,但实际 Label 是 203。

我个人习惯在调试时,先把示波器抓到的字节做个比特反转,再查表。不然很容易搞错。我记得有一次帮同事排查问题,他死活说接收到的空速数据不对,我一看 Label 值,反转后才发现他解析错了字段。

常用的 Label 值我列个表,你们可以存一下:

Label(八进制) 含义 数据来源
203 气压高度 大气数据计算机
204 指示空速 大气数据计算机
206 真空速 大气数据计算机
310 磁航向 磁罗盘
320 真航向 惯性导航系统

小技巧:很多老工程师习惯用八进制表示 Label,因为 ARINC 429 规范里就是这么定义的。你如果看到 203、204 这种数字,别以为是十进制,那是八进制。

3.2 SDI 字段:区分同一类数据的“分身”

SDI 全称是 Source/Destination Identifier,占用第 9、10 两个比特。说白了,就是用来区分同一类数据来自哪个设备,或者要发给哪个设备。

举个例子,飞机上有两台大气数据计算机,左系统和右系统。它们都会发送气压高度,Label 都是 203。那接收端怎么知道哪个是左、哪个是右?靠 SDI 字段。

SDI 的编码规则很简单:

  • 00:未指定或通用数据
  • 01:设备 1(比如左系统)
  • 10:设备 2(比如右系统)
  • 11:测试或备用

我在项目中遇到过一个问题:某次系统联调时,飞控计算机一直报数据无效。查了半天,发现是大气数据计算机把 SDI 设成了 00,但飞控那边只认 01 和 10。说白了,两边对 SDI 的约定没对齐。后来我们在接口控制文档(ICD)里明确写死了 SDI 的分配,再没出过问题。

注意:SDI 字段不是所有 Label 都会用到。有些 Label 只由一个设备发送,那 SDI 就可以固定为 00。但如果你要支持冗余系统,SDI 就必须用起来。

3.3 SSM 字段:数据的“健康状态”

SSM 是 Sign/Status Matrix,占用第 29、30、31 三个比特。它告诉你这条数据到底能不能信。嗯,这里要注意,SSM 是 ARINC 429 里最容易忽略但又最重要的字段。

SSM 的编码分两类:一类是二进制数据(BNR),一类是二进制编码十进制数据(BCD)。我主要讲 BNR 的情况,因为航电里大部分数据都用 BNR 格式。

SSM 编码(比特 31-29) 含义 说明
00 故障告警 数据不可用,设备故障
01 无计算数据 设备正常但未计算出结果
10 功能测试 设备处于自检模式
11 正常 数据有效,可以放心使用

我曾经吃过一次亏。某次试飞中,飞控计算机突然切到备份模式,飞行员吓了一跳。后来查数据记录,发现大气数据计算机发送的高度数据 SSM 是 01(无计算数据),但飞控那边没检查 SSM,直接拿数据去算了。结果算出来的高度是错的,触发了保护逻辑。

从那以后,我给自己定了个规矩:任何接收端在解析 429 数据时,必须先检查 SSM,再处理数据。你想想看,如果 SSM 不是 11,后面的数据再漂亮也没用。

3.4 奇偶校验机制:总线的“最后一道防线”

ARINC 429 使用奇校验,占用第 32 比特(最高位)。规则很简单:32 个比特里,1 的个数必须是奇数。如果接收端算出来是偶数,说明传输过程中出了错,这条数据直接丢弃。

为什么用奇校验而不是偶校验?我个人理解,奇校验能避免全 0 的情况。如果数据全是 0,偶校验的校验位也是 0,那接收端就分不清是正常数据还是总线空闲。奇校验下,全 0 数据的校验位是 1,至少能保证总线上有信号跳变。

校验计算示例:

假设数据字的前 31 个比特里,1 的个数是 12(偶数)。

那么第 32 比特(校验位)必须设为 1,这样总共有 13 个 1,是奇数。

如果前 31 个比特里 1 的个数是 13(奇数),校验位就设为 0。

实际项目中,奇偶校验出问题的概率其实不高。但一旦出现,往往意味着硬件有问题。我记得有一次,某条总线上频繁出现校验错误,排查后发现是连接器针脚氧化,接触不良导致的。换了连接器后,问题消失。

避坑指南:我曾经在调试时发现,有些老旧的 ARINC 429 板卡对校验位的处理不严格。它们发送的数据字里,校验位永远是 0。这种板卡如果用在关键系统里,后果很严重。所以,采购板卡时一定要确认它是否严格遵循奇校验。

3.5 小结:一个完整的 ARINC 429 数据字

把上面几个字段拼起来,一个完整的 32 比特数据字长这样:

比特位:  32    31-29    28-11    10-9    8-1
        奇偶位  SSM      数据区   SDI    Label

举个例子,假设我们要发送左大气数据计算机的气压高度,高度值是 10000 英尺,Label 是 203(八进制),SSM 正常:

  • Label(8 比特):203 八进制 = 010 000 011 二进制,反向排列后是 110 000 010
  • SDI(2 比特):左系统 = 01
  • 数据区(18 比特):10000 英尺按 BNR 格式编码
  • SSM(3 比特):正常 = 11
  • 奇偶位(1 比特):根据前 31 位计算

你看,其实没那么复杂。搞懂 Label、SDI、SSM 和奇偶校验,你就能读懂 ARINC 429 总线上跑的任何一条数据。下一章我们聊聊怎么用硬件和软件来收发这些数据字,到时候我会拿我手头的一个实际项目来演示。