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 扩展头帧转发
-
接收扩展头帧(Type:0x28-0x96)后,解析 “目标地址” 字段。
-
查询本地端口 - 地址映射表,找到匹配目标地址的端口。
-
仅将帧转发至该匹配端口;若未找到匹配端口,转发至除接收端口外的所有其他端口。
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 字节头部字段)。
-
分块逻辑:
-
主机默认请求分块号 0,设备返回参数时携带 “剩余分块数”。
-
若剩余分块数 > 0,主机依次请求后续分块(分块号递增),直至剩余分块数 = 0。
-
示例流程:
- 主机:请求参数 2,分块 0 → 设备:返回参数 2,分块 2(剩余 2 块)→ 主机:请求参数 2,分块 1 → 设备:返回参数 2,分块 1 → 主机:请求参数 2,分块 2 → 设备:返回参数 2,分块 0(传输完成)。
八、测试与验证设计
8.1 接口通信测试
-
测试目标:验证硬件接口的通信稳定性与兼容性。
-
测试场景:
-
单线半双工 UART:遥控器与 XF TX 通信,验证反相 / 非反相模式、416kbaud 速率下的数据传输成功率。
-
双线全双工 UART:飞行控制器与 VTX 通信,连续发送 1000 帧命令,统计丢包率。
-
多主 I2C:3 个传感器接入总线,发送广播帧,验证所有设备均能接收。
8.2 命令执行测试
-
测试目标:验证所有命令的执行逻辑正确性。
-
测试用例:
-
VTX 功率切换:发送 0x08+0x03 命令,验证 VTX 实际功率与命令参数一致。
-
参数写入:向飞行控制器写入通道缩放参数,读取并验证参数值更新。
-
LED 控制:发送 0x09+0x02 命令,验证 LED 颜色与 H/S/V 参数匹配。
8.3 CRC 校验测试
-
测试目标:验证 CRC 校验的容错能力。
-
测试方法:
-
人为修改帧负载的 1 位数据,验证接收方能否检测 CRC 错误并丢弃帧。
-
发送 1000 帧正常数据,统计 CRC 校验通过比例(需达到 100%)。
8.4 路由转发测试
-
测试目标:验证路由规则的正确性,无环路产生。
-
测试场景:
-
广播帧转发:中心设备发送广播帧,验证所有接入设备均能接收。
-
扩展头帧转发:发送点对点命令帧,验证仅目标设备接收,其他设备不转发。
-
环路检测:模拟环路场景,验证设备能触发报错并停止转发。
九、设计约束与注意事项
-
电气参数约束:所有设备需严格遵循接口电平(3.0-3.3V),避免电平不匹配导致设备损坏。
-
时序约束:RC 帧更新率不得高于 4ms / 次,I2C 超时需严格控制在 1.5s 内。
-
兼容性约束:命令枚举值、参数类型、帧结构需严格遵循协议定义,不得自定义扩展(预留字段除外)。
-
可靠性约束:关键命令(如固件更新、强制解锁)需增加二次确认机制,避免误触发。

浙公网安备 33010602011771号