22 KiB
MR16 - 2.4GHz 无线通信模块
产品简介
MR16 是一款高性能 2.4GHz 无线通信模块,基于 SX1281 芯片设计,适用于遥控、传感器数据传输等应用场景。
核心特性
| 特性 | 规格 |
|---|---|
| 无线芯片 | SX1281 (2.4GHz) |
| 主控芯片 | STM32F103C8T6 |
| 通信协议 | BLE/LoRa/GFSK/FLRC |
| 最大距离 | > 1km (开阔环境) |
| 数据速率 | 125bps - 2Mbps |
| 用户接口 | UART2 + CLI命令行 |
| 显示屏 | 240×135 彩色LCD |
| 状态指示 | WS2812 RGB LED |
数据流
TX 端 (发送端)
用户数据 (UART2)
↓
MR16_PackTxBuffer() ← 自动添加 TX_ID
↓
完整数据包
↓
SX1281 无线射频发送 ← 自动添加 同步字节 + CRC
RX 端 (接收端)
SX1281 无线接收 ← 自动校验数据包
↓
分通道 ← 自动校验数据包TXID (与三个RX_ID之一 匹配)
↓
输出数据包
↓
DBUS
代码结构
文件组织
mr16.c - 主实现文件 (1788行)
├─ [PART 1] 核心功能 (MR16 CORE FUNCTIONS)
│ ├─ 无线事件回调
│ ├─ 系统初始化
│ ├─ 主循环
│ └─ 数据包处理
├─ [PART 2] UI显示 (UI DISPLAY FUNCTIONS)
│ ├─ 开机动画
│ ├─ 主界面显示
│ └─ 状态更新
└─ [PART 3] CLI命令 (CLI COMMAND FUNCTIONS)
├─ 帮助文本
├─ MR16命令处理器
├─ Radio命令处理器
└─ CLI初始化
PART 1: 核心功能模块
1.1 数据格式 (Data Format)
可变长度模式 (VARIABLE)
- 触发方式: UART 空闲中断
- 长度: 动态,根据实际接收数据
- 适用场景: 不定长数据传输
- 注意:在VARIABLE模式下,数据包属性中的payloadlenth表示可能的最大数据包长度
固定长度模式 (FIXED)
- 长度: 预定义 (默认122字节)
- 可调范围: 1-123 字节 (纯用户数据)
- 适用场景: 固定格式数据,如遥控器
1.2 数据包格式
完整数据包结构 (最大127字节):
┌─────────┬──────────────────┬─────────┐
│ Header │ User Data │ CRC │
│ 2 bytes │ 1-123 bytes │ 2 bytes │
└─────────┴──────────────────┴─────────┘
Header (2字节)
- Byte 0: TX_ID 高字节
- Byte 1: TX_ID 低字节
- 用途: 识别发送端,支持多机接收
User Data (1-123字节)
- 用户纯数据,不包含 Header 和 CRC
- VARIABLE 模式: 实际接收长度
- FIXED 模式: 配置的
fixedLength值 - ⚠️ 不同协议的数据长度限制详见下表
CRC (2字节)
- 算法: CRC16
- 校验范围: Header + User Data
- Byte N+2: CRC 高字节
- Byte N+3: CRC 低字节
各协议用户数据长度限制
根据 SX1281 硬件限制,不同协议支持的最大用户数据长度不同:
| 协议 | 硬件最大总包长 | 最大用户数据 |
|---|---|---|
| FLRC | 124字节 | 120字节 |
| GFSK | 252字节 | 248字节 |
| LoRa | 253字节 | 249字节 |
建议将数据包长度留出百分之5左右的裕度确保射频稳定工作
1.3 失控保护
仅在 RX 端启用
触发条件
- 100ms 未接收到有效数据
安全帧格式
安全帧结构:
┌─────────┬────────────────────────┬─────────┐
│ Header │ 0xFF 0x00 0xFF 0x00 │ 0x00... │
│ 2 bytes │ 4 bytes (安全标识) │ 填充0 │
└─────────┴────────────────────────┴─────────┘
PART 2: UI 显示模块
2.1 显示界面
开机动画 (MR16_UI_PowerON)
- MR16 Logo
- "Initializing..." 提示
主界面 (MR16_UI_Home)
TX 模式显示:
┌──────────────────────────────┐
│ MR16 Status [TX] │
├──────────────────────────────┤
│ Mode: FIXED Power: 10dBm │
│ Radio: FLRC DataLen: 122B│
│ Freq: 2450MHz │
│ TXID: 0x1234 │
└──────────────────────────────┘
RX 模式显示:
┌──────────────────────────────┐
│ MR16 Status [RX] │
├──────────────────────────────┤
│ Mode: FIXED rxcount: │
│ Radio: FLRC ch1: 1234 │
│ Freq: 2450MHz ch2: 567 │
│ rxid: 0x1234 0x5678 0x9ABC │
└──────────────────────────────┘
PART 3: CLI 命令模块
3.1 MR16 系统命令
mr16 <subcmd> [args] - MR16 系统控制命令
配置管理
save- 保存当前配置到Flashget- 从Flash加载配置reset- 恢复默认配置mode <VARIABLE|FIXED>- 设置/查看数据格式fixedlen <1-123>- 设置用户数据长度(仅FIXED模式)power <-18 to +13>- 设置/查看TX功率(dBm)
接收ID配置
rxid1 <hex>- 设置/查看RX ID通道1rxid2 <hex>- 设置/查看RX ID通道2rxid3 <hex>- 设置/查看RX ID通道3rxid- 显示所有三个RX ID
操作命令
tx- 启动发送模式rx- 启动连续接收模式
信息显示
show- 显示所有MR16配置mode help- 显示模式详细信息
使用示例
mr16 mode FIXED # 切换到固定长度模式
mr16 fixedlen 32 # 设置用户数据长度为32字节
mr16 power 10 # 设置TX功率为+10dBm
mr16 rxid1 0x1234 # 设置RX ID通道1为0x1234
mr16 tx # 启动发送
mr16 rx # 启动接收
重要说明
- fixedlen设置的是仅用户数据长度,不包含总包长度
- MR16自动添加:Header(2字节) + 用户数据 + CRC(2字节)
- 有效RX ID范围:0x0001 到 0xFFFE(0x0000和0xFFFF为保留值)
3.2 Radio 无线命令
radio <subcmd> [args] - SX1281 无线控制命令
基本操作命令
mode <BLE|LORA|GFSK|FLRC>- 更改无线工作模式rffreq <Hz>- 设置RF频率(单位: Hz)power <dBm>- 设置TX功率(-18 到 +13 dBm)ramptime <us>- 设置上升时间: 2, 4, 6, 8, 10, 12, 16, 20 微秒baudrate [index]- 设置当前模式的波特率
参数配置命令
modulation <field> <value>- 设置调制参数- BLE/GFSK可用字段:
br_bw,modindex,shaping - LoRa可用字段:
sf,bw,cr - FLRC可用字段:
br_bw,cr,shaping
- BLE/GFSK可用字段:
packet <field> <value>- 设置数据包参数- BLE可用字段:
ConnectionState,CrcField,BlePacketType,Whitening - GFSK可用字段:
Preamble,SyncWordLength,SyncWordMatch,SyncWord1,SyncWord2,SyncWord3,SyncWord,Header,Payload,Crc,Whitening - LoRa可用字段:
Preamble,Header,Payload,Crc,InvertIQ - FLRC可用字段: 与GFSK相同(SyncWord最大4字节)
- BLE可用字段:
详细帮助命令
modulation help- 显示调制参数详细帮助packet help- 显示数据包参数详细帮助baudrate help- 显示波特率配置详细信息
使用示例
radio mode LORA # 切换到LoRa模式
radio rffreq 2400000000 # 设置频率为2.4GHz
radio power 10 # 设置TX功率为+10dBm
radio baudrate 2 # 为当前模式设置波特率索引2
调制参数 (modulation) 完整说明
br_bw - 比特率与带宽
0x04 = 2.0Mbps / 2.4MHz 0x28 = 1.6Mbps / 2.4MHz
0x4C = 1.0Mbps / 2.4MHz 0x45 = 1.0Mbps / 1.2MHz
0x70 = 0.8Mbps / 2.4MHz 0x69 = 0.8Mbps / 1.2MHz
0x8D = 0.5Mbps / 1.2MHz 0x86 = 0.5Mbps / 0.6MHz
0xB1 = 0.4Mbps / 1.2MHz 0xAA = 0.4Mbps / 0.6MHz
0xCE = 0.25Mbps / 0.6MHz 0xC7 = 0.25Mbps / 0.3MHz
0xEF = 0.125Mbps / 0.3MHz
modindex - 调制指数
0 = 0.35 1 = 0.50 2 = 0.75 3 = 1.00
4 = 1.25 5 = 1.50 6 = 1.75 7 = 2.00
8 = 2.25 9 = 2.50 10 = 2.75 11 = 3.00
12 = 3.25 13 = 3.50 14 = 3.75 15 = 4.00
shaping - 调制整形
0x00 = OFF (无整形)
0x10 = BT=1.0 (高斯整形)
0x20 = BT=0.5 (高斯整形)
LoRa模式参数
sf - 扩频因子
0x50 = SF5 0x60 = SF6 0x70 = SF7 0x80 = SF8
0x90 = SF9 0xA0 = SF10 0xB0 = SF11 0xC0 = SF12
bw - 带宽
0x34 = 200kHz 0x26 = 400kHz 0x18 = 800kHz 0x0A = 1600kHz
cr - 编码率
0x01 = 4/5 0x02 = 4/6
0x03 = 4/7 0x04 = 4/8
0x05 = Long Interleaving 4/5 0x06 = Long Interleaving 4/6
0x07 = Long Interleaving 4/7
FLRC模式参数
br_bw - 比特率与带宽
0x04 = 2.6Mbps / 2.4MHz 0x28 = 2.08Mbps / 2.4MHz
0x45 = 1.3Mbps / 1.2MHz 0x69 = 1.04Mbps / 1.2MHz
0x86 = 0.65Mbps / 0.6MHz 0xAA = 0.52Mbps / 0.6MHz
0xC7 = 0.325Mbps / 0.3MHz 0xEB = 0.26Mbps / 0.3MHz
cr - 编码率
0x00 = CR_1/2 0x02 = CR_3/4 0x04 = CR_1/0
shaping - 调制整形
0x00 = OFF (无整形)
0x10 = BT=1.0 (高斯整形)
0x20 = BT=0.5 (高斯整形)
使用示例:
radio modulation br_bw 0x4C # 设置GFSK比特率为1.0Mbps / 2.4MHz
radio modulation sf 0x70 # 设置LoRa扩频因子为SF7
radio modulation br_bw 0x45 # 设置FLRC比特率为1.3Mbps / 1.2MHz
注意: 更改立即生效。使用radio modulation查看当前值。
数据包参数 (packet) 详细说明
BLE模式参数
ConnectionState - 连接状态
0 = MASTER_SLAVE 1 = ADVERTISER 2 = TX_TEST
3 = RX_TEST 4 = RXTX_TEST
CrcField - CRC字段配置
0 = OFF 1 = CRC_3B (3字节CRC)
BlePacketType - BLE数据包类型
0 = PRBS_9 1 = PRBS_15 2 = EYELONG_1_0 3 = EYELONG_0_1
4 = EYESHORT_1_0 5 = EYESHORT_0_1 6 = ALL_1 7 = ALL_0
Whitening - 白化模式
0x00 = ON 0x08 = OFF
GFSK模式参数
Preamble - 前导码长度
0x00 = 4bits 0x10 = 8bits 0x20 = 12bits 0x30 = 16bits
0x40 = 20bits 0x50 = 24bits 0x60 = 28bits 0x70 = 32bits
SyncWordLength - 同步字长度
0x00 = 1byte 0x02 = 2bytes 0x04 = 3bytes
0x06 = 4bytes 0x08 = 5bytes
SyncWordMatch - 同步字匹配
0x00 = OFF 0x10 = 1 0x20 = 2 0x30 = 1_2
0x40 = 3 0x50 = 1_3 0x60 = 2_3 0x70 = 1_2_3
SyncWord1/2/3 - 设置同步字字节
- 格式:
<hex_bytes>(例如: 0x12345678) - GFSK最大5字节
- 使用
radio packet SyncWord显示所有已配置的同步字
Header - 包头类型
0x00 = VARIABLE (可变长度) 0x20 = FIXED (固定长度)
Payload - 载荷长度
- 范围: 1-255 字节
Crc - CRC长度
0x00 = OFF 0x10 = 1byte 0x20 = 2bytes 0x30 = 3bytes
Whitening - 白化模式
0x00 = ON 0x08 = OFF
LoRa模式参数
Preamble - 前导码符号数
- 范围: 0-255
Header - 包头类型
0x00 = VARIABLE/EXPLICIT (可变长度/显式)
0x80 = FIXED/IMPLICIT (固定长度/隐式)
Payload - 载荷长度
- 范围: 1-255 字节
Crc - CRC模式
0x00 = OFF 0x20 = ON
InvertIQ - IQ反转
0x40 = NORMAL (正常) 0x00 = INVERTED (反转)
FLRC模式参数
与GFSK大部分参数相同
SyncWord1/2/3 - 设置同步字字节
- FLRC最大4字节
使用示例:
radio packet Payload 64 # 设置载荷长度为64字节
radio packet Crc 0x20 # 启用2字节CRC
radio packet SyncWord1 0x1234 # 设置同步字1为0x1234
radio packet SyncWord # 显示所有同步字
注意: 使用radio packet不带参数可查看当前参数。
波特率配置 (baudrate) 详细说明
BLE模式波特率
Index 0 = 250 Kbps
Index 1 = 500 Kbps
Index 2 = 1 Mbps
LoRa模式波特率
Index 0 = 216 bps
Index 1 = 1 Kbps
Index 2 = 5 Kbps
Index 3 = 10 Kbps
Index 4 = 20 Kbps
Index 5 = 61 Kbps
Index 6 = 127 Kbps
Index 7 = 203 Kbps
GFSK模式波特率
Index 0 = 125 Kbps
Index 1 = 250 Kbps
Index 2 = 500 Kbps
Index 3 = 1 Mbps
FLRC模式波特率
Index 0 = 130 Kbps
Index 1 = 260 Kbps
Index 2 = 520 Kbps
Index 3 = 1040 Kbps
使用示例:
radio baudrate # 显示当前所有模式的波特率
radio baudrate 2 # 为当前模式设置波特率索引2
重要说明:
- 波特率索引必须对当前无线模式有效
- 更高的波特率提供更快的数据速率但会减少传输距离
- 更低的波特率增加传输距离但会降低数据速率
配置示例
配置 FLRC模式 :
radio mode FLRC # 切换到FLRC模式
radio rffreq 2450000000 # 设置频率2450MHz
radio power 10 # 设置功率+10dBm
radio ramptime 10 # 设置上升时间10us
radio baudrate 2 # 设置波特率索引2 (520Kbps)
radio modulation br_bw 0x45 # 1.3Mbps / 1.2MHz
radio modulation cr 0x00 # 编码率CR_1/2
radio modulation shaping 0x10 # BT=1.0高斯整形
radio packet Preamble 0x30 # 16bits前导码
radio packet Payload 114 # 载荷114字节
radio packet Crc 0x20 # 2字节CRC
mr16 mode FIXED # 固定长度模式
mr16 fixedlen 110 # 用户数据110字节
mr16 save # 保存配置
3.3 命令特性
- 不区分大小写
- 参数自动解析: 支持十进制、十六进制 (0x前缀)
- 帮助系统: 所有命令支持
help子命令 - 实时生效: 参数修改后立即更新硬件
- 自动刷新: 参数变更后自动更新 LCD 显示
- 手动保存: 需要手动使用
mr16 save命令写入flash
默认配置
/* MR16基本参数 */
format = MR16_FORMAT_VARIABLE // 固定长度模式
fixedLength = 110 // 用户数据长度110字节
TX_ID = 0x0001 // 发送端ID
RX_ID[0] = 0x0001 // 接收端ID通道1
RX_ID[1] = 0x0002 // 接收端ID通道2
RX_ID[2] = 0x0003 // 接收端ID通道3
RadioRole = RadioRoleTX // 默认发送端模式
/* 射频基本参数 */
radioMode = RADIOMODE_FLRC // FLRC模式
rfFrequency = 2426000000 // 频率2426MHz
txOutputPower = 13 // 发射功率+13dBm
rampTime = RADIO_RAMP_02_US // 上升时间2us
/* 波特率索引 */
baudrate.ble = RF_BAUDRATE_BLE_1M // BLE: 1Mbps
baudrate.lora = RF_BAUDRATE_LORA_005K // LoRa: 5Kbps
baudrate.gfks = RF_BAUDRATE_GFSK_125K // GFSK: 125Kbps
baudrate.flrc = RF_BAUDRATE_FLRC_130K // FLRC: 130Kbps
/* BLE调制参数 */
BLE.BitrateBandwidth = GFS_BLE_BR_1_000_BW_2_4 // 1.0Mbps / 2.4MHz
BLE.ModulationIndex = GFS_BLE_MOD_IND_0_50 // 调制指数0.50
BLE.ModulationShaping = RADIO_MOD_SHAPING_BT_0_5 // BT=0.5高斯整形
/* BLE数据包参数 */
BLE.BlePacketType = BLE_EYELONG_1_0 // Eye pattern长序列1_0
BLE.ConnectionState = BLE_ADVERTISER // 广播模式
BLE.CrcField = BLE_CRC_3B // 3字节CRC
BLE.Whitening = RADIO_WHITENING_ON // 启用白化
/* LoRa调制参数 */
LoRa.SpreadingFactor = LORA_SF12 // 扩频因子SF12
LoRa.Bandwidth = LORA_BW_0200 // 带宽200kHz
LoRa.CodingRate = LORA_CR_LI_4_7 // 编码率4/7 (Long Interleaving)
/* LoRa数据包参数 */
LoRa.PreambleLength = 12 // 前导码12符号
LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH // 可变长度
LoRa.PayloadLength = BUFFER_SIZE // 载荷长度
LoRa.CrcMode = LORA_CRC_ON // 启用CRC
LoRa.InvertIQ = LORA_IQ_NORMAL // 正常IQ
/* GFSK调制参数 */
GFSK.BitrateBandwidth = GFS_BLE_BR_0_125_BW_0_3 // 0.125Mbps / 0.3MHz
GFSK.ModulationIndex = GFS_BLE_MOD_IND_0_50 // 调制指数0.50
GFSK.ModulationShaping = RADIO_MOD_SHAPING_BT_0_5 // BT=0.5高斯整形
/* GFSK数据包参数 */
GFSK.PreambleLength = PREAMBLE_LENGTH_32_BITS // 32bits前导码
GFSK.SyncWordLength = GFS_SYNCWORD_LENGTH_5_BYTE // 5字节同步字
GFSK.SyncWordMatch = RADIO_RX_MATCH_SYNCWORD_1 // 匹配同步字1
GFSK.HeaderType = RADIO_PACKET_VARIABLE_LENGTH // 可变长度
GFSK.PayloadLength = BUFFER_SIZE // 载荷长度
GFSK.CrcLength = RADIO_CRC_3_BYTES // 3字节CRC
GFSK.Whitening = RADIO_WHITENING_ON // 启用白化
/* FLRC调制参数 */
FLRC.BitrateBandwidth = FLRC_BR_0_260_BW_0_3 // 0.26Mbps / 0.3MHz
FLRC.CodingRate = FLRC_CR_1_2 // 编码率1/2
FLRC.ModulationShaping = RADIO_MOD_SHAPING_BT_1_0 // BT=1.0高斯整形
/* FLRC数据包参数 */
FLRC.PreambleLength = PREAMBLE_LENGTH_32_BITS // 32bits前导码
FLRC.SyncWordLength = FLRC_SYNCWORD_LENGTH_4_BYTE // 4字节同步字
FLRC.SyncWordMatch = RADIO_RX_MATCH_SYNCWORD_1 // 匹配同步字1
FLRC.HeaderType = RADIO_PACKET_VARIABLE_LENGTH // 可变长度
FLRC.PayloadLength = BUFFER_SIZE // 载荷长度
FLRC.CrcLength = RADIO_CRC_3_BYTES // 3字节CRC
FLRC.Whitening = RADIO_WHITENING_OFF // 禁用白化
/* 同步字默认值 */
GFSK.SyncWord1 = 0x12 0x34 0x56 0x78 0x9A
GFSK.SyncWord2 = 0x23 0x45 0x67 0x89 0xAB
GFSK.SyncWord3 = 0x34 0x56 0x78 0x9A 0xBC
FLRC.SyncWord1 = 0x12 0x23 0x34 0x45
FLRC.SyncWord2 = 0x56 0x67 0x78 0x89
FLRC.SyncWord3 = 0x9A 0xAB 0xBC 0xCD
性能指标
| 参数 | 值 |
|---|---|
| 最大数据包长度 | 127 字节 |
| 最大用户数据 | 123 字节 |
| DBUS 输出频率 | 71Hz (14ms间隔) |
| 失控检测延迟 | 100ms |
| UI 刷新频率 | 1Hz (RX模式) |
| 命令响应 | <10ms |
⚠️ 注意事项
· 数据长度限制
根据不同协议,用户数据长度有严格限制:
┌─────────────────────────────────────────────────────────────────┐
│ 各协议数据长度对照表 │
├─────────────────────────────────────────────────────────────────┤
│ FLRC: 最大 120 字节 | 推荐 ≤ 110 字节 │
│ GFSK: 最大 248 字节 | 推荐 ≤ 240 字节 │
│ LoRa: 最大 249 字节 | 推荐 ≤ 240 字节 │
└─────────────────────────────────────────────────────────────────┘
· ID 配置规则
| 规则 | 说明 |
|---|---|
| 有效范围 | 0x0001 - 0xFFFE |
| 保留值 | 0x0000 和 0xFFFF (禁用通道) |
| TX_ID | 发送端唯一标识 |
| RX_ID | 接收端最多配置3个,自动匹配 |
| 多机通信 | 一个TX可以被多个RX接收 一个RX可以接收至多3个TX |
# ❌ 无效配置
mr16 rxid1 0x0000 # 保留值,无效
mr16 rxid1 0xFFFF # 保留值,无效
# ✅ 有效配置
mr16 rxid1 0x1234 # 有效
mr16 rxid2 0x5678 # 有效
mr16 rxid3 0x9ABC # 有效
· 失控保护
| 特性 | 说明 |
|---|---|
| 启用范围 | 仅RX端 |
| 触发条件 | 100ms 未接收有效数据 |
| 安全帧标识 | 0xFF 0x00 0xFF 0x00 (4字节) |
安全帧示例:
接收无效 100ms → 自动生成安全帧
┌─────────┬────────────────────┬──────────────────┐
│ TX_ID │ 0xFF 0x00 0xFF 0x00│ 剩余数据填充0x00 │
│ 2 bytes │ 4 bytes │ 变长 │
└─────────┴────────────────────┴──────────────────┘
下游应用处理:
// 检测安全帧
if (data[2]==0xFF && data[3]==0x00 && data[4]==0xFF && data[5]==0x00) {
// RC失控,执行安全动作
motor_stop();
printf("RC Failsafe Triggered!\n");
}
⚠️ 避免冲突: 正常数据不应包含连续的 0xFF 0x00 0xFF 0x00 模式
· 通信要求
重要提醒:发送端和接收端必须配置完全一致,否则无法通信!
| 参数 | 命令 | 说明 | 示例 |
|---|---|---|---|
| 1. 无线协议 | radio mode <协议> |
双方必须使用相同协议 | radio mode FLRC |
| 2. 波特率 | radio baudrate <索引> |
同协议下必须相同 | radio baudrate 2 |
| 3. 调制属性 | radio modulation ... |
关键项必须一致 | radio modulation sf 0x70 |
| 4. 数据包属性 | radio packet ... |
关键项必须一致/强烈建议一致 | radio packet Preamble 8 |
| 5. 中心频率 | radio channel <MHz> |
工作频率必须一致 | radio channel 2450 |
| 6. 设备ID | mr16 txid/rxid <ID> |
TX端ID = RX端ID | mr16 txid 0x1234 |
说明:
文档中的
radio baudrate列表为开发者提供的若干示例调制参数预设,便于快速配置。用户也可以通过radio modulation命令自行精细配置调制属性。为了确保通信成功, **调制属性 (modulation )**和 包属性() 必须在发送端和接收端保持一致。
开发者信息
- 版本: 2.0
- 最后更新: 2024-12-09
- 开发团队: MR16 Development Team
相关文件
mr16.c- 主实现文件mr16.h- 头文件定义config.c- 配置管理sx1281_driver.c- SX1281 驱动lcd.c- LCD 驱动
文档结束