3. ARINC429字格式与编码规则

ARINC429总线上的每一次传输都以一个32位字为基本单位。理解这32位如何划分、每一位代表什么含义,是后续编写发送驱动、解析接收数据、排查总线异常的基础。本节围绕32位字结构展开,逐字段说明标号(Label)、源/目标标识(SDI)、数据字段、符号/状态矩阵(SSM)和奇偶校验位(P)的编码规则,并给出可直接用于解析的位操作示例。

32位字的整体布局

ARINC429字固定为32位,按位编号通常记为bit1~bit32,其中bit1为最低有效位(LSB),bit32为最高有效位(MSB)。在总线上传输时,字按位串行发送,先发bit1,最后发bit32。整个字可划分为五个字段:标号占bit1~bit8,SDI占bit9~bit10,数据字段占bit11~bit29(共19位),SSM占bit30~bit31,奇偶校验位占bit32。这种划分对标准字和大多数设备都成立,是解析工作的统一参照。

ARINC429 32位字结构(bit1 → bit32 串行发送) bit1 bit8 bit9 bit10 bit11 bit29 bit30 bit31 bit32 Label bit1–bit8(8位) SDI bit9–10 Data 数据字段 bit11–bit29(19位) SSM bit30–31 P bit32 串行发送方向:先发 bit1(LSB),最后发 bit32(MSB) 示例:Label=203₈(0x83),SDI=01,数据=0x1A2B,SSM=11,偶校验 1000 0011 01 0 0011 0100 0101 0110 11 1 • Label 以八进制表示,bit1 为最高位,bit8 为最低位;示例 203₈ = 1000 0011₂ • SDI 两位用于区分同一标号下的多个源/目标设备,00 表示不区分 • SSM 两位编码数据有效性、符号或状态,含义随数据类型变化 • P 位为奇偶校验,发送端按前31位计算,接收端校验失败则丢弃该字

标号(Label)字段

Label位于bit1~bit8,共8位,用于标识这个字承载的是什么参数,例如高度、空速、航向、燃油量等。ARINC429规范中Label通常以八进制书写,范围000₈~377₈,对应二进制0000 0000~1111 1111。需要特别注意的是位序:Label的bit1是最高有效位,bit8是最低有效位,这与整个字“bit1为LSB”的编号习惯相反。例如八进制203₈,展开为二进制是100 000 011,补齐8位为1000 0011,其中bit1=1、bit2=0、bit3=0、bit4=0、bit5=0、bit6=0、bit7=1、bit8=1。如果按普通整数位序去解析,就会得到完全错误的标号,这是初学者最常见的错误之一。

在软件实现中,通常把接收到的32位原始字先做位反转,再按常规整数位序提取字段,或者直接按位掩码操作。以C语言为例,若raw为接收到的32位无符号整数且bit1对应最低位,则Label的提取可写为:

uint8_t label = (raw & 0xFF);          // bit1~bit8
uint8_t sdi   = (raw >> 8) & 0x03;     // bit9~bit10
uint32_t data = (raw >> 10) & 0x7FFFF; // bit11~bit29
uint8_t ssm   = (raw >> 29) & 0x03;    // bit30~bit31
uint8_t par   = (raw >> 31) & 0x01;    // bit32

由于Label的位序是反的,实际解析时往往需要把提取出的8位再做一次位反转,才能得到规范中书写的八进制标号。这一点在编写驱动时必须明确约定,否则发送端和接收端会各按各的理解,导致标号对不上。

源/目标标识(SDI)

SDI位于bit9~bit10,共2位,用于在同一标号下区分不同的源或目标设备。典型编码为:00表示不区分或通用,01、10、11分别对应设备1、设备2、设备3。例如同一个“高度”标号可能由左、右两套大气数据计算机分别发送,接收端通过SDI判断数据来自哪一侧。SDI不是必用字段,很多系统固定填00,但在多余度或双通道系统中,它是实现数据源选择的关键。

数据字段

数据字段位于bit11~bit29,共19位,是承载实际参数值的部分。19位可以表示无符号整数0~524287,也可以表示有符号数、BCD码或离散量,具体含义由该标号的定义决定。例如某标号定义为“高度”,单位英尺,分辨率1英尺,则19位二进制直接对应高度值;若定义为有符号数,则最高位为符号位,采用补码表示。数据字段的编码方式必须与接口控制文件(ICD)一致,不能仅凭位数猜测。

符号/状态矩阵(SSM)

SSM位于bit30~bit31,共2位,用于指示数据的有效性、符号或状态。它的含义随数据类型不同而变化,常见约定如下:对于BCD或二进制数值,00通常表示故障或无效,01表示正常且为正,10表示正常且为负,11表示功能测试或超范围;对于离散量,SSM可能表示有效/无效;对于某些状态字,SSM直接编码状态。接收端必须先根据标号确定数据类型,再按对应规则解释SSM,不能一概而论。SSM是判断“这个数据能不能用”的第一道关口,解析时应当优先检查。

奇偶校验位(P)

奇偶校验位位于bit32,用于检测传输过程中的单比特错误。ARINC429通常采用奇校验:发送端统计bit1~bit31中“1”的个数,若为偶数,则P置1,使整个32位字中“1”的总数为奇数;若为奇数,则P置0。接收端重新统计前31位,与P位比较,若不一致则判定该字出错,通常直接丢弃并等待下一周期。奇校验只能发现奇数个比特错误,无法纠正错误,也不能发现偶数个比特同时翻转的情况,因此它只是基本的完整性保护,不能替代上层的数据有效性判断。

解析一个ARINC429字时,建议按“先校验、再取标号、后看SSM、最后取数据”的顺序处理:校验失败直接丢弃;标号决定数据字段和SSM的解释方式;SSM无效则数据不可用;只有三者都通过,数据字段的值才有意义。

完整解析示例

假设接收到的32位原始字(bit1在最低位)为十六进制0x8B0D2C83,我们按字段逐步解析。先取低8位得到Label原始值0x83,即二进制1000 0011,位反转为1100 0001,对应八进制301₈。取bit9~bit10得到SDI=01。取bit11~bit29得到数据字段0x1A2B,即十进制6699。取bit30~bit31得到SSM=11。取bit32得到P=1。若该标号定义为有符号高度、单位英尺,SSM=11表示功能测试状态,则此时数据6699不应作为正常高度使用,而应标记为测试值。这个例子说明,单看数据字段的数值没有意义,必须结合标号定义和SSM状态才能正确解释。

字段位范围位数示例值作用
Labelbit1–bit88301₈标识参数类型
SDIbit9–bit10201区分源/目标设备
Databit11–bit29196699承载参数数值
SSMbit30–bit31211有效性/符号/状态
Pbit3211奇偶校验

掌握这五个字段的位序、编码和相互关系后,就可以进一步编写发送与接收程序:发送时按ICD填充各字段并计算校验位,接收时按固定顺序提取、校验和解释。下一阶段的工作将围绕具体的驱动实现和总线时序展开。