CRSF 协议详细设计

CRSF 协议详细设计说明书

版本信息

  • 协议版本:CRSF Protocol Rev07

  • 编制日期:基于 2017 年 8 月 14 日协议版本

  • 适用场景:无人机(UAV)遥控与遥测通信系统,含地面遥控设备、飞行控制器、图传发射器、传感器等设备间的数据交互

一、概述

1.1 设计目标

本设计基于 CRSF 协议 Rev07 版本,实现无人机系统中多设备间的低延迟、双向数据传输,支持遥控信号下发、遥测数据回传、设备参数配置、功能指令控制等核心需求,保障通信稳定性与兼容性。

1.2 核心特性

  • 低延迟高更新率:RC 信号传输延迟低,更新率适配无人机控制需求。

  • 双向通信:支持地面→无人机(遥控 / 指令)与无人机→地面(遥测 / 状态)双向数据流转。

  • 多设备兼容:适配飞行控制器、图传发射器(VTX)、GPS、电池传感器、蓝牙模块等多种设备。

  • 灵活配置:支持本地 / 远程设备参数读写,支持分块传输大尺寸参数。

  • 高可靠性:通过 CRC 校验、心跳检测、路由防环路机制保障数据传输完整性。

二、协议基础设计

2.1 硬件接口设计

2.1.1 单线半双工 UART

  • 应用场景:遥控器与 Crossfire 发射器(XF TX)之间的通信。

  • 电气参数:3.3V 电平,支持反相 / 非反相模式,通信速率 416kbaud,数据格式 8N1(8 位数据位 + 1 位停止位 + 无校验位)。

  • 主从架构:遥控器作为主机,XF TX 作为从机,仅在同步到主机 RC 帧后发送遥测数据。

  • 时序要求:RC 帧更新率不高于 4ms / 次(即每秒最多 250 帧)。

2.1.2 双线全双工 UART

  • 应用场景:无人机飞行平台端设备互联(如飞行控制器与图传发射器、传感器)。

  • 电气参数:3.0-3.3V 电平,仅支持非反相模式,通信速率 416kbaud,数据格式 8N1。

  • 连接方式:采用标准 UART 引脚(TX/RX)直接连接,无需额外同步信号。

2.1.3 多主 I2C(BST)

  • 应用场景:多设备共享总线的低速通信场景(如传感器集群)。

  • 电气参数:3.3V 电平,通信速率 100kHz,采用 7 位地址编码(含读写位)。

  • 地址规则:读地址 = 写地址 + 1,设备需支持广播地址(0x00)的通用呼叫帧。

  • 总线保障:设备需在任何情况下释放 SDA 线,避免总线阻塞;需监测心跳消息,超时(>1.5s)时重置接口。

2.2 设备地址设计

采用 8 位地址编码,核心设备地址分配如下(全量地址见协议文档),地址未使用时标记为 “Reserved”(预留):

设备地址 设备名称 用途说明
0x00 广播地址 向所有支持 CRSF 的设备发送通用消息
0xC8 飞行控制器(FC) 核心控制设备,接收遥控指令、上报状态
0xEC Crossfire/UHF 接收器 接收地面遥控信号,转发至飞行控制器
0xEE Crossfire 发射器 向地面传输无人机遥测数据
0xEA 无线电发射器 地面遥控信号发射设备
0x12 蓝牙模块 蓝牙通信扩展设备
0xC2 PNP PRO GPS 定位数据采集设备
0xC0 PNP PRO 数字电流传感器 电流、电压数据采集设备
0x80 TBS CORE PNP PRO 集成式核心设备

2.3 字节序设计

  • 协议统一采用大端序(Big endian) 存储多字节数据,即高位字节在前、低位字节在后。

  • 示例:32 位整数 0x12345678,传输顺序为 0x12 → 0x34 → 0x56 → 0x78。

三、帧结构设计

3.1 帧通用规则

  • 同步字节:串行通信场景下固定为 0xC8,用于帧起始识别。

  • 帧长度定义:包含 “类型(Type)、负载(Payload)、CRC” 的总字节数(8 位无符号整数)。

  • CRC 校验:所有帧均含 8 位 CRC 校验位,校验范围为 “类型 + 负载”;命令帧额外增加 Command_CRC8 校验。

3.2 帧类型划分与结构

协议帧分为两类:广播帧(用于全局消息下发 / 状态上报)和扩展头帧(用于点对点参数交互)。

3.2.1 广播帧(Type:0x00-0x27)

  • 结构:[设备地址/同步字节] → [帧长度] → [类型(Type)] → [负载(Payload)] → [CRC]

  • 核心字段说明:

    • 设备地址 / 同步字节:串行通信填 0xC8,I2C 通信填目标设备地址或广播地址 0x00。

    • 类型(Type):8 位,标识帧功能(如 GPS 数据、电池状态、RC 通道数据)。

    • 负载(Payload):随类型变化,存储具体业务数据(如经纬度、电压值)。

3.2.2 扩展头帧(Type:0x28-0x96)

  • 结构:[设备地址/同步字节] → [帧长度] → [类型(Type)] → [目标地址] → [源地址] → [负载(Payload)] → [CRC]

  • 核心新增字段:

    • 目标地址:8 位,指定帧的接收设备地址(点对点通信)。

    • 源地址:8 位,标识帧的发送设备地址(用于接收方响应)。

3.3 核心帧类型设计细则

3.3.1 广播帧(常用类型)

帧类型(Type) 帧名称 负载设计细节
0x02 GPS 数据 1. 纬度(int32_t,单位:度 / 10⁷)2. 经度(int32_t,单位:度 / 10⁷)3. 地速(uint16_t,单位:km/h/100)4. 航向(uint16_t,单位:度 / 100)5. 高度(uint16_t,单位:米 - 1000m 偏移)6. 卫星数(uint8_t)
0x08 电池传感器数据 1. 电压(uint16_t,单位:mV×100)2. 电流(uint16_t,单位:mA×100)3. 容量(uint24_t,单位:mAh)4. 剩余电量(uint8_t,单位:%)
0x0B 心跳帧 仅含源设备地址(uint8_t),用于设备在线状态检测
0x16 RC 通道打包数据 16 个通道,每个通道 11 位,压缩为 22 字节存储;中心值 1500us 对应 992 ticks,转换公式:- TICKS_TO_US(x) = (x-992)×5/8 + 1500- US_TO_TICKS(x) = (x-1500)×8/5 + 992
0x21 飞行模式文本 以 null(0x00)结尾的 ASCII 字符串(如 “STAB”“ACRO”“GPS HOLD”),最长不超过协议帧负载上限

3.3.2 扩展头帧(常用类型)

帧类型(Type) 帧名称 负载设计细节
0x28 参数 ping 设备 1. 目标地址(uint8_t):指定 ping 的设备,0x00 为广播 ping2. 源地址(uint8_t):发送 ping 的设备地址
0x29 设备信息响应 1. 目标地址(uint8_t):ping 请求的发送方地址2. 设备地址(uint8_t):自身地址3. 设备名(null 终止字符串)4. 序列号(uint32_t)5. 硬件 ID(uint32_t)6. 固件 ID(uint32_t)7. 参数数量(uint8_t)8. 参数版本(uint8_t)
0x2B 参数配置(条目) 1. 目标地址(uint8_t)2. 源地址(uint8_t)3. 参数号(uint8_t,从 1 开始)4. 剩余分块数(uint8_t)5. 父文件夹(uint8_t,0 为根目录)6. 数据类型(uint8_t,含隐藏位)7. 参数名(null 终止字符串)8. 值 / 最小值 / 最大值 / 默认值(长度随数据类型)9. 小数点位数(仅 float 类型,uint8_t)10. 步长(仅 float 类型,int32_t)11. 单位(null 终止字符串,string/folder 类型不发送)12. 字符串最大长度(仅 string 类型,uint8_t)
0x2C 参数读取请求 1. 目标地址(uint8_t)2. 源地址(uint8_t)3. 参数号(uint8_t)4. 分块号(uint8_t);超时时间 2s
0x2D 参数写入指令 1. 目标地址(uint8_t)2. 源地址(uint8_t)3. 参数号(uint8_t)4. 数据(长度随数据类型);超时时间 2s

四、命令系统设计

4.1 命令帧基础结构

  • 命令帧类型(Type):固定为 0x32,用于标识该帧为命令帧。

  • 完整结构:[设备地址/同步字节] → [帧长度] → [0x32(命令帧标识)] → [目标地址] → [源地址] → [命令ID] → [子命令ID] → [负载] → [Command_CRC8] → [帧CRC]

  • 双重校验设计:

    • 帧 CRC:校验 “0x32 + 目标地址 + 源地址 + 命令 ID + 子命令 ID + 负载 + Command_CRC8”。

    • Command_CRC8:仅校验命令相关字段(目标地址 + 源地址 + 命令 ID + 子命令 ID + 负载),多项式为 0xBA(x⁷+x⁵+x⁴+x³+x¹)。

4.2 命令分类与详细设计

4.2.1 FC 命令(命令 ID:0x01)

子命令 ID 命令名称 负载设计 功能说明
0x01 强制解锁(Force Disarm) 紧急解锁飞行控制器,忽略常规解锁条件
0x02 通道缩放(Scale Channel) 1. 通道号(uint8_t,1-16)2. 缩放比例(根据设备定义) 调整指定 RC 通道的输出范围,适配设备控制需求

4.2.2 蓝牙命令(命令 ID:0x03)

子命令 ID 命令名称 负载设计 功能说明
0x01 重置(Reset) 重启蓝牙模块,恢复初始配置
0x02 启用 / 禁用(Enable) 使能状态(uint8_t:0 = 禁用,1 = 启用) 控制蓝牙模块工作状态
0x64 回声(Echo) 自定义测试数据(字节流) 验证蓝牙通信链路,模块需原样回传数据

4.2.3 OSD 命令(命令 ID:0x05)

子命令 ID 命令名称 负载设计 功能说明
0x01 发送按键(Send Buttons) 按键位掩码(uint8_t):bit7=Enter,bit6=Up,bit5=Down,bit4=Left,bit3=Right 远程模拟 OSD 菜单按键操作

4.2.4 VTX 命令(命令 ID:0x08)

子命令 ID 命令名称 负载设计 功能说明
0x01 切换通道 通道号(uint8_t,0-47) 切换图传频段通道(对应协议内置 6 个频段的 8 个通道)
0x02 切换频率 频率值(uint16_t,5000-6000MHz) 直接指定图传工作频率
0x03 切换功率 功率枚举(uint8_t):0=25mW,1=200mW,2=500mW,3=800mW 调整图传发射功率
0x04 切换 PitMode 模式枚举(uint8_t):0 = 关闭,1=In_Band,2=Out_Band 开启 / 关闭低功率测试模式
0x05 从 PitMode 唤醒 退出低功率模式,恢复正常工作

4.2.5 LED 命令(命令 ID:0x09)

子命令 ID 命令名称 负载设计 功能说明
0x01 恢复默认 重置 LED 为设备默认显示逻辑
0x02 覆盖颜色 打包数据(共 24 位):9 位 Hue(0-359°),7 位 Saturation(0-100%),8 位 Value(0-100%) 自定义 LED 固定颜色
0x03 覆盖脉冲 1. 持续时间(uint16_t,ms)2. 起始色(H/S/V,24 位)3. 结束色(H/S/V,24 位) LED 从起始色渐变到结束色的脉冲效果
0x03 覆盖闪烁 1. 间隔时间(uint16_t,ms)2. 起始色(H/S/V,24 位)3. 结束色(H/S/V,24 位) LED 在起始色与结束色间循环闪烁
0x04 覆盖渐变 1. 间隔时间(uint16_t,ms)2. 固定色(H/S/V,24 位) LED 按间隔持续渐变显示固定色

4.2.6 通用命令

命令 ID 子命令 ID 命令名称 负载设计 功能说明
0x0A 0x0A 启动引导程序 设备进入固件更新模式
0x0A 0x0B 擦除内存 清除设备旧固件数据,为更新做准备
0x10 0x01 进入绑定模式 RC 接收器进入与发射器的绑定状态

4.2.7 预留命令(命令 ID:0x78-0x79)

  • 用途:专为 KISS 飞行控制器预留,具体子命令与负载设计需参考 KISS FC 专属硬件协议。

  • 设计约束:非 KISS FC 设备不得使用该命令区间,避免通信冲突。

五、路由设计

5.1 路由架构

  • 采用星型网络架构,核心设备(如飞行控制器)作为中心节点,其他设备通过 CRSF 端口接入。

  • 设备若具备多个 CRSF 端口,需支持帧转发功能,实现全网设备互联互通。

5.2 转发规则

5.2.1 广播帧转发

  • 接收广播帧(Type:0x00-0x27)后,转发至所有其他 CRSF 端口(排除接收端口)。

  • 确保广播消息能覆盖全网所有设备,无遗漏。

5.2.2 扩展头帧转发

  1. 接收扩展头帧(Type:0x28-0x96)后,解析 “目标地址” 字段。

  2. 查询本地端口 - 地址映射表,找到匹配目标地址的端口。

  3. 仅将帧转发至该匹配端口;若未找到匹配端口,转发至除接收端口外的所有其他端口。

5.3 防环路设计

  • 设备需记录自身发送的 “参数 ping 设备(0x28)” 和 “心跳帧(0x0B)”。

  • 若收到自身发送的上述帧,判定为环路异常,立即触发报错(向用户反馈)并停止转发该帧。

六、CRC 校验设计

6.1 帧 CRC(通用校验)

  • 多项式:0xD5(x⁷+x⁶+x⁴+x²+x⁰)。

  • 校验范围:帧的 “类型(Type)+ 负载(Payload)”。

  • 实现代码(C 语言):

/* CRC8 implementation with polynom = 0xD5 */

unsigned char crc8tab[256] = {0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54, ...}; // 完整表见协议文档

uint8_t crc8(const uint8_t *ptr, uint8_t len) {

   uint8_t crc = 0;

   for (uint8_t i = 0; i < len; i++) {

       crc = crc8tab[crc ^ *ptr++];

   }

   return crc;

}

6.2 命令 CRC(Command_CRC8)

  • 多项式:0xBA(x⁷+x⁵+x⁴+x³+x¹)。

  • 校验范围:命令帧的 “目标地址 + 源地址 + 命令 ID + 子命令 ID + 负载”。

  • 实现代码(C 语言):

/* Command_CRC8 implementation with polynom = 0xBA */

unsigned char command_crc8tab[256] = {0x00, 0xBA, 0xCE, 0x74, ...}; // 完整表见协议文档

uint8_t command_crc8(const uint8_t *ptr, uint8_t len) {

   uint8_t crc = 0;

   for (uint8_t i = 0; i < len; i++) {

       crc = command_crc8tab[crc ^ *ptr++];

   }

   return crc;

}

七、参数配置设计

7.1 参数类型定义

参数类型为 8 位字段,bit7 表示隐藏状态(1 = 隐藏,0 = 可见),bit6-0 为数据类型,核心类型如下:

数据类型值 类型名称 存储格式与设计说明
0 UINT8 无符号 8 位整数,取值范围 0-255
1 INT8 有符号 8 位整数,取值范围 - 128~127
2 UINT16 无符号 16 位整数,大端序存储
3 INT16 有符号 16 位整数,大端序存储
8 FLOAT 以 INT32 存储,通过 “小数点位数” 字段转换为浮点数;需同步存储步长(推荐增减量)
9 TEXT_SELECTION 选项字符串(以 “;” 分隔,null 终止)+ 选项索引(uint8_t);修改时仅需发送索引值
10 STRING 文本类型,仅传输当前值和默认值(null 终止),无最值限制
11 FOLDER 用于参数分类,仅作为父文件夹标识,无实际值
13 COMMAND 功能执行指令,含状态(READY/START/PROGRESS 等)、超时时间、信息描述字符串

7.2 分块传输设计

  • 最大帧负载限制:62 字节(总帧长度 64 字节 - 2 字节头部字段)。

  • 分块逻辑:

  1. 主机默认请求分块号 0,设备返回参数时携带 “剩余分块数”。

  2. 若剩余分块数 > 0,主机依次请求后续分块(分块号递增),直至剩余分块数 = 0。

  • 示例流程:

    • 主机:请求参数 2,分块 0 → 设备:返回参数 2,分块 2(剩余 2 块)→ 主机:请求参数 2,分块 1 → 设备:返回参数 2,分块 1 → 主机:请求参数 2,分块 2 → 设备:返回参数 2,分块 0(传输完成)。

八、测试与验证设计

8.1 接口通信测试

  • 测试目标:验证硬件接口的通信稳定性与兼容性。

  • 测试场景:

  1. 单线半双工 UART:遥控器与 XF TX 通信,验证反相 / 非反相模式、416kbaud 速率下的数据传输成功率。

  2. 双线全双工 UART:飞行控制器与 VTX 通信,连续发送 1000 帧命令,统计丢包率。

  3. 多主 I2C:3 个传感器接入总线,发送广播帧,验证所有设备均能接收。

8.2 命令执行测试

  • 测试目标:验证所有命令的执行逻辑正确性。

  • 测试用例:

  1. VTX 功率切换:发送 0x08+0x03 命令,验证 VTX 实际功率与命令参数一致。

  2. 参数写入:向飞行控制器写入通道缩放参数,读取并验证参数值更新。

  3. LED 控制:发送 0x09+0x02 命令,验证 LED 颜色与 H/S/V 参数匹配。

8.3 CRC 校验测试

  • 测试目标:验证 CRC 校验的容错能力。

  • 测试方法:

  1. 人为修改帧负载的 1 位数据,验证接收方能否检测 CRC 错误并丢弃帧。

  2. 发送 1000 帧正常数据,统计 CRC 校验通过比例(需达到 100%)。

8.4 路由转发测试

  • 测试目标:验证路由规则的正确性,无环路产生。

  • 测试场景:

  1. 广播帧转发:中心设备发送广播帧,验证所有接入设备均能接收。

  2. 扩展头帧转发:发送点对点命令帧,验证仅目标设备接收,其他设备不转发。

  3. 环路检测:模拟环路场景,验证设备能触发报错并停止转发。

九、设计约束与注意事项

  1. 电气参数约束:所有设备需严格遵循接口电平(3.0-3.3V),避免电平不匹配导致设备损坏。

  2. 时序约束:RC 帧更新率不得高于 4ms / 次,I2C 超时需严格控制在 1.5s 内。

  3. 兼容性约束:命令枚举值、参数类型、帧结构需严格遵循协议定义,不得自定义扩展(预留字段除外)。

  4. 可靠性约束:关键命令(如固件更新、强制解锁)需增加二次确认机制,避免误触发。

posted @ 2025-12-04 12:21  Afangdong  阅读(423)  评论(0)    收藏  举报