AFON // радиотехник affonya@mail.ru
← Все проекты для дронов

Разбор кадра CRSF

Приём кадра CRSF (ELRS/Crossfire) и извлечение канала по адресу/типу.

DMC.24 · Приём управления · ATmega328P

Задача

Собрать кадр CRSF из UART и распаковать 16 каналов по 11 бит из RC-пакета.

Алгоритм

Кадр: [addr][len][type][payload][crc8]. Тип 0x16 = RC-каналы: 22 байта = 16×11 бит, распаковка сдвигами.

Исходный код (C, avr-gcc)

⇩ Скачать 24-crsf-parse.c

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#include <avr/io.h>

void crsf_unpack_channels(const uint8_t *p, uint16_t ch[16]){
  ch[0]=((p[0]    | p[1]<<8) & 0x07FF);
  ch[1]=((p[1]>>3 | p[2]<<5) & 0x07FF);
  ch[2]=((p[2]>>6 | p[3]<<2 | p[4]<<10)&0x07FF);
  ch[3]=((p[4]>>1 | p[5]<<7) & 0x07FF);
  /* ... каналы 4..15 по той же схеме ... */
}
uint8_t crc8_dvb(const uint8_t *d, uint8_t len){
  uint8_t c=0;
  for(uint8_t i=0;i<len;i++){ c^=d[i];
    for(uint8_t b=0;b<8;b++) c=(c&0x80)?(c<<1)^0xD5:c<<1; }
  return c;
}
int main(void){
  uint8_t payload[22]; uint16_t ch[16];
  crsf_unpack_channels(payload, ch);
  volatile uint8_t crc=crc8_dvb(payload,22); (void)crc;
  for(;;){}
}

Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf

Пояснения

CRSF: 420000 бод (частый вариант). CRC8 (poly 0xD5) проверяет payload. Здесь распаковка каналов.

Смотрите также

ExpressLRS: настройка