Understanding CRSF: The Protocol Behind Drone RC, Telemetry, and Parameter Interaction

Editor’s note

CRSF is not a simple “RC channel format” like SBUS. It is a high-speed bidirectional communication protocol running over UART. It can deliver RC channel data from the transmitter to the flight controller, while simultaneously transmitting battery, current, GPS, flight mode, and link quality information back to the transmitter. CRSF also supports device discovery, parameter read/write, and Lua script menu interaction.

1. CRSF Protocol Overview and Interface

CRSF (Crossfire Serial Protocol) originated from the TBS Crossfire system. ExpressLRS and other RC links also widely use CRSF as the interface protocol between receiver and flight controller.

Figure 1: CRSF two-wire full-duplex and single-wire half-duplex connection diagrams

In practice, CRSF appears in two locations:

  1. Transmitter MCU ↔ External RF module
  2. Receiver ↔ Flight controller

Both locations can use CRSF, but the hardware connection differs.

A. Receiver to Flight Controller: Two-Wire Full-Duplex

The most common CRSF wiring on the flight controller side is standard UART dual-wire:

  • Receiver TX → Flight Controller RX
  • Receiver RX ← Flight Controller TX
  • GND ↔ Flight Controller GND
  • Receiver VCC ← Flight Controller power

In this configuration, the receiver continuously sends RC channel frames to the flight controller while the flight controller simultaneously transmits telemetry data back.

Parameter Common Value
Communication UART
Baud rate 416666 bps
Data format 8N1
Logic level 3.0V ~ 3.3V
Signal logic Non-inverted
Direction Two-wire full-duplex

Full-duplex is simpler and more stable — no bus contention, no GPIO direction switching.

The 416666 bps rate may seem unusual, but it is the standard CRSF high-speed UART rate on the flight controller side. Unlike conventional PC serial rates (9600, 115200), it is designed for low-latency RC link communication.

At 416666 bps, each bit takes ~2.4µs. With UART 8N1, each byte requires ~10 bits on the wire, so byte transmission time is ~24µs. A 26-byte RC channel frame takes approximately 0.62ms to transmit. This is one reason CRSF can simultaneously handle RC channels, link status, and telemetry at low latency.

B. Transmitter to RF Module: Single-Wire Half-Duplex

CRSF also supports single-wire half-duplex mode, common between the transmitter MCU and external RF module. A single DATA line handles both transmission and reception. The key constraint: only one side may transmit at a time; the other must be in receive or high-impedance state.

Single-wire half-duplex CRSF relies on master-slave timing and direction switching rather than complex arbitration. The transmitter acts as timing controller; the RF module responds.

Three key software actions:

  1. Switch DATA pin to output / UART TX before sending
  2. Transmit CRSF frame normally
  3. After transmission, disable output driver, release the bus, switch back to input / UART RX

Releasing the bus is critical. If the driver continues to push output after sending, it blocks the response and causes bus contention.

For flight controller-receiver interfaces, full-duplex is strongly preferred. Aomway’s engineering team always uses two-wire full-duplex for FC-receiver CRSF connections in our drone platforms — it eliminates an entire class of timing bugs.

2. CRSF Frame Structure and Common Type Values

CRSF uses variable-length frames, not fixed-length frames.

Figure 2: CRSF data frame structure

Field Description
Address Address or sync byte
Length Subsequent data length
Type Frame type
Payload Data content
CRC8 Checksum byte

2.1 Does CRSF Have a Fixed Header?

Unlike SBUS (which always starts with 0x0F), CRSF has no invariant frame header. The first byte (Address/Sync) serves as both address and frame-start synchronizer.

For RC channel frames from receiver to flight controller, the first byte is typically 0xC8 (Flight Controller address). However, payload bytes could also happen to contain 0xC8, so relying on Address alone is insufficient for synchronization.

Proper parsing: search for candidate Address/Sync byte → read Length → validate plausibility → verify with CRC8. CRSF synchronization relies on Address + Length + Type + CRC8 jointly, not on any single fixed header.

2.2 Length Semantics

Length does not include Address or Length itself. It represents: Length = Type + Payload + CRC8 total bytes.

For example, Length = 0x18 (decimal 24) means Type (1 byte) + Payload (22 bytes) + CRC8 (1 byte) = 24 bytes.

CRSF single frames generally do not exceed 64 bytes. If Length exceeds a reasonable range during parsing, discard and resynchronize.

2.3 Type Determines Frame Structure

Type ≤ 0x27: Standard frame
Type ≥ 0x28: Extended frame

This division is inherent to CRSF’s Frame Type address space:

  • 0x00–0x27: Standard frame type region
  • 0x28–0xFF: Extended frame type region

When Type ≥ 0x28, two additional bytes follow Type: Destination Address and Origin Address, specifying the recipient and sender.

2.4 Common Address Values

Address Meaning
0x00 Broadcast
0xC8 Flight Controller
0xEA Remote Control
0xEC R/C Receiver
0xEE R/C Transmitter Module

2.5 CRC8 Checksum

CRSF frames end with a CRC8 checksum using polynomial 0xD5. CRC calculation covers Type through the last Payload byte — excluding Address, Length, and CRC itself. For extended frames, Destination and Origin are included in the CRC calculation.

2.6 Common Type Values

Type Name Purpose Category
0x02 GPS GPS telemetry Standard
0x08 Battery Sensor Voltage, current, capacity Standard
0x14 Link Statistics Link quality, RSSI, SNR, TX power Standard
0x16 RC Channels Packed 16-channel RC data Standard
0x1C Link Statistics RX Receiver-side link stats Standard
0x1D Link Statistics TX Transmitter-side link stats Standard
0x1E Attitude Attitude data Standard
0x21 Flight Mode Current FC mode string Standard
0x28 Parameter Ping Devices Device discovery Extended
0x29 Parameter Device Information Device parameter info Extended
0x2B Parameter Settings Entry Parameter definition Extended
0x2C Parameter Settings Read Read parameter Extended
0x2D Parameter Value Write Write parameter Extended
0x32 Direct Commands Direct device commands Extended
0x7A MSP Request MSP request passthrough Extended
0x7B MSP Response MSP response passthrough Extended
0xAA CRSF MAVLink Envelope MAVLink encapsulation Extended

3. Typical Frame Examples

Having covered the basic structure and common types, let’s connect the dots with two typical scenarios: the RC channel frame (most used by flight controllers) and the extended frame for Lua parameter interaction.

Figure 3: 0x16 RC channel frame and 0x2D Lua parameter extended frame examples

3.1 0x16 RC Channels Packed Frame

For RC input, the core frame is 0x16 RC Channels Packed. Since 0x16 ≤ 0x27, it is a standard frame — Type is followed directly by the RC channel payload.

Typical format: 0xC8 0x18 0x16 [22-byte RC channel data] CRC8

Length = 0x18 (24) = Type (1) + Payload (22) + CRC8 (1).

CRSF RC channel data is not 2 bytes per channel. Instead, 16 channels × 11 bits = 176 bits, packed into 22 bytes × 8 bits = 176 bits. Unpacking extracts 16 channels of 11-bit values sequentially. Packing reverses the process.

CRSF RC channel values are not PWM pulse widths. Typical mapping: 192 ≈ 1000µs, 992 ≈ 1500µs, 1792 ≈ 2000µs. Aomway’s flight controller implementations use this mapping for consistent RC input across different receiver types.

3.2 Lua Parameter Interaction Extended Frame

Extended frames are used for device discovery, parameter read/write, and Lua script menu interaction. When you open the ELRS or Crossfire Lua configuration interface on an EdgeTX/OpenTX transmitter, the controller reads parameter lists from the module or receiver and writes modified values back — all via CRSF extended frames.

Extended frame example: EE 08 2D EA EC [Payload…] CRC

Field Value / Meaning
Address 0xEE (Transmitter Module)
Length 0x08
Type 0x2D (Parameter Value Write)
Destination 0xEA (Remote Control)
Origin 0xEC (R/C Receiver)
Payload Subsequent data
CRC8 Last byte

0x2D is for parameter writes; parameter reads and entry returns use 0x2C and 0x2B respectively. Lua menu interaction typically uses these parameter-related extended frames for device parameter read/write operations.

4. Failsafe

CRSF failsafe cannot rely on a single fixed flag bit. It requires comprehensive judgment: whether 0x16 RC channel frames are being received continuously, CRC correctness, RC frame interval timeout, and link statistics frame anomalies.

  • 0x16 received with valid CRC: RC input is valid
  • 0x16 not received for a short period: possible packet loss
  • 0x16 not received for an extended period: enter RC failsafe

Because CRSF includes CRC8, the receiver can distinguish between: received error frame, no frame received, and received valid frame. This is a significant advantage over protocols without checksums, and Aomway leverages this in our failsafe detection logic for industrial drone platforms.

5. Summary

CRSF is a UART-based high-speed bidirectional RC and telemetry protocol with variable-length frames. It uses Address/Length/Type/Payload/CRC8 structure, commonly at 416666 bps 8N1, non-inverted, on the flight controller side.

Key takeaways:

  • CRSF uses variable-length frames
  • No fixed frame header — synchronization relies on Address + Length + CRC jointly
  • Length excludes Address and Length itself
  • CRC8 is calculated from Type through the last Payload byte
  • 0x16 frame carries 16 channels of 11-bit RC data
  • Type ≥ 0x28 triggers extended frame handling

Have questions about CRSF protocol implementation, receiver configuration, or flight controller integration? Contact Aomway at [email protected] — our team provides protocol-level consulting and system integration support for drone platforms.

Frequently Asked Questions

1. What is the difference between CRSF and SBUS protocols?

SBUS is a one-way protocol that only transmits RC channel data from receiver to flight controller at a fixed 100kbps. CRSF is bidirectional, running at 416666 bps, supporting simultaneous RC channel transmission and telemetry back to the transmitter. CRSF also supports device discovery, parameter read/write, and Lua script interaction via extended frames — none of which SBUS offers. Aomway recommends CRSF for any modern drone platform requiring real-time telemetry or in-flight parameter adjustment.

2. Why does CRSF use 416666 bps instead of standard baud rates?

416666 bps is optimized for low-latency RC communication. At this rate, a 26-byte RC channel frame completes transmission in ~0.62ms, enabling the high update rates needed for responsive flight control. Standard baud rates like 115200 would introduce unacceptable latency for RC control loops running at 1-8kHz. The non-standard rate is a deliberate design choice shared across TBS Crossfire and ExpressLRS ecosystems.

3. How does CRSF handle frame synchronization without a fixed header byte?

CRSF achieves synchronization through a combination of Address/Sync byte validation, Length range checking, and CRC8 verification. The parser searches for candidate sync bytes, reads the Length field, validates it falls within acceptable range (≤64 bytes), and confirms the entire frame with CRC8. This multi-layered approach is more robust than relying on a single fixed header, as it prevents false synchronization from payload bytes that coincidentally match the sync value.

4. Can I use CRSF with I2C instead of UART?

No. CRSF is designed exclusively for UART communication. I2C’s addressing scheme and slower clock speeds (typically 400kHz) are incompatible with CRSF’s 416666 bps requirement and frame structure. For flight controller integration, always use a dedicated UART port configured for CRSF protocol. SPI is used internally by some receiver modules but is not part of the CRSF specification for external interfaces.

5. How do I implement CRSF failsafe detection in my flight controller?

Implement a multi-condition failsafe detector: (1) Track time since last valid 0x16 frame with correct CRC8; (2) Monitor link statistics frames (0x14) for RSSI/SNR degradation; (3) Define a short-term timeout (e.g., 100ms) for packet loss warning and a long-term timeout (e.g., 1s) for full failsafe. Log all failsafe events for post-flight analysis. Aomway’s industrial drone platforms use a 3-tier failsafe system: warning, hold-position, and autonomous landing, triggered by progressively longer signal loss durations.


Building a drone system and need help with CRSF integration? Contact Aomway at [email protected] — we provide protocol implementation, receiver configuration, and flight controller development services for industrial UAV applications.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top