ARINC 429¶
Overview¶
ARINC 429 is the predominant avionics data bus standard used in commercial transport aircraft. It defines a unidirectional, point-to-point serial data bus operating at 12.5 kHz (low speed) or 100 kHz (high speed).
Key Facts
- Word size: 32 bits
- Bus topology: Single transmitter, up to 20 receivers
- Encoding: Bipolar Return-to-Zero (RZ)
- Speeds: 12.5 kbps (low) / 100 kbps (high)
- Usage: Air data, navigation, engine, flight controls
Word Format¶
Bit 32 Bits 31-30 Bits 29-11 Bits 10-9 Bits 8-1
┌───────┬──────────┬──────────────────┬───────────┬──────────────┐
│Parity │ SSM │ Data Field │ SDI │ Label │
│(odd) │ (2 bits) │ (19 bits) │ (2 bits) │ (8 bits) │
└───────┴──────────┴──────────────────┴───────────┴──────────────┘
MSB LSB
Field Descriptions¶
| Field | Bits | Description |
|---|---|---|
| Label | 1-8 | Equipment identifier (octal, BIT-REVERSED) |
| SDI | 9-10 | Source/Destination Identifier |
| Data | 11-29 | Payload (BNR, BCD, or Discrete) |
| SSM | 30-31 | Sign/Status Matrix |
| Parity | 32 | Odd parity over bits 1-31 |
Label Bit Reversal¶
Critical Implementation Detail
The label field uses reversed bit order. The label is specified in octal notation, but stored in the word with bits reversed. Bit 1 (LSB of word) contains the MSB of the label.
Label 0310 (octal) = binary 11_001_000
In word (reversed): bit1=1, bit2=1, bit3=0, bit4=0, bit5=1, bit6=0, bit7=0, bit8=0
Wire byte: 0x13 (reversed from 0xC8)
SSM Interpretation¶
| SSM | Meaning |
|---|---|
| 00 | Failure Warning |
| 01 | No Computed Data |
| 10 | Functional Test |
| 11 | Normal Operation |
| SSM | Meaning |
|---|---|
| 00 | Plus / North / East / Right / To |
| 01 | No Computed Data |
| 10 | Functional Test |
| 11 | Minus / South / West / Left / From |
Data Encoding¶
BNR (Binary Number Representation)¶
Two's complement scaled integer. The MSB of the data field is the sign bit.
Example: Barometric Altitude (Label 203)
- Range: ±131,072 feet
- Significant bits: 18 (including sign)
- Resolution: 131,072 / 2^17 = 1 ft/bit
- +35,000 ft → data field = 35000 = 0x88B8
BCD (Binary Coded Decimal)¶
Each decimal digit encoded in 4 bits. Supports up to 5 digits in the 19-bit data field.
Example: VOR Frequency (Label 110)
- 115.30 MHz encoded as BCD:
1-1-5-3-0→0001_0001_0101_0011_0000
API Reference¶
Core Functions¶
#include "arinc429.h"
// Encode a word structure to 32-bit wire format
uint32_t a429_encode(const a429_word_t *decoded);
// Decode 32-bit wire word to fields (returns parity validity)
bool a429_decode(uint32_t word, a429_word_t *decoded);
// Label conversion (octal ↔ reversed wire format)
uint8_t a429_label_from_octal(uint16_t octal_label);
uint16_t a429_label_to_octal(uint8_t reversed_label);
// Parity
uint8_t a429_compute_parity(uint32_t word);
bool a429_verify_parity(uint32_t word);
// BNR encode/decode
uint32_t a429_bnr_encode(double value, double range, int data_bits);
double a429_bnr_decode(uint32_t data, double range, int data_bits);
// BCD encode/decode
uint32_t a429_bcd_encode(uint32_t value);
uint32_t a429_bcd_decode(uint32_t data);
Usage Example¶
#include "arinc429.h"
// Encode altitude of 35,000 feet
a429_word_t word = {
.label = 0xC8, // Label 310 (binary, not reversed)
.sdi = 0,
.data = a429_bnr_encode(35000.0, 131072.0, 18),
.ssm = A429_SSM_NORMAL_OP,
.encoding = A429_ENC_BNR
};
uint32_t wire = a429_encode(&word); // 32-bit word for transmission
// Decode received word
a429_word_t decoded;
bool valid = a429_decode(wire, &decoded);
double altitude = a429_bnr_decode(decoded.data, 131072.0, 18);
// altitude ≈ 35000.0
Build & Run¶
Output:
=== ARINC 429 Bit-Level Codec Verification ===
Word size: 32 bits | Label: 8b reversed | Data: 19b | Parity: odd
...
=== RESULTS: 50 passed, 0 failed ===
=== ALL TESTS PASSED ===
Common Labels¶
| Label (Octal) | Parameter | Encoding | Range |
|---|---|---|---|
| 203 | Baro Altitude | BNR | ±131,072 ft |
| 206 | Airspeed | BNR | 0-1024 kts |
| 314 | True Heading | BNR | ±180° |
| 310 | Selected Altitude | BNR | 0-65,536 ft |
| 110 | VOR Frequency | BCD | 108.0-117.95 MHz |
| 012 | Distance to Go | BNR | 0-4096 NM |
References¶
- ARINC Specification 429, Part 1-18
- ARINC Report 429P1-18 (2004)