# MR16 模块说明文档 ## 概述 MR16 是基于 SX1281 2.4GHz 无线收发芯片的遥控数据传输系统,支持多种无线协议(BLE/LoRa/GFSK/FLRC),提供 FreeRTOS CLI 命令行接口和 LCD 状态显示。 ## ⚠️ 通信要求 (Critical Requirements) **发送端和接收端必须配置一致,否则无法通信!** ### 必须匹配的参数: 1. **无线协议模式** - `radio mode ` - 双方必须使用相同的协议(如都用 FLRC) 2. **波特率** - `radio baudrate ` - 同一协议下,双方必须使用相同的波特率索引 - 例如:FLRC 模式下,双方都用 `radio baudrate 2` (520kbps) 3. **频率** - `radio channel ` - 双方必须工作在相同频率 - 例如:都设置为 `radio channel 2450` 4. **TX/RX ID** - `mr16 txid ` / `mr16 rxid ` - 发送端的 TX_ID 必须等于接收端的 RX_ID - 例如:发送端 `txid 0x1234`,接收端 `rxid 0x1234` ### 配置示例 ```bash # 发送端配置 radio mode FLRC # 选择 FLRC 协议 radio baudrate 2 # 波特率索引 2 (520kbps) radio channel 2450 # 频率 2450MHz mr16 txid 0x1234 # 发送ID # 接收端配置(必须完全一致) radio mode FLRC # 相同协议 radio baudrate 2 # 相同波特率 radio channel 2450 # 相同频率 mr16 rxid 0x1234 # 接收ID = 发送端的TX_ID ``` ### 验证方法 ```bash # 使用 show 命令查看当前配置 mr16 show # 查看 TX_ID/RX_ID radio mode # 查看当前协议 radio baudrate # 查看当前波特率 radio modulation # 查看详细调制参数 ``` ### 常见错误 - ❌ 双方协议不同(一个BLE,一个FLRC)→ 完全无法通信 - ❌ 波特率索引不同(一个用2,一个用3)→ 解调失败 - ❌ 频率偏差过大 → 接收不到信号 - ❌ ID不匹配 → 接收到数据但被过滤丢弃 --- ## 硬件平台 - **MCU**: STM32F103C8T6 (20KB RAM, 64KB Flash) - **无线芯片**: SX1281 2.4GHz 收发器 - **显示**: LCD 彩屏 (240x135) - **接口**: UART2 (CLI + 数据输入), 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 空闲中断 - 长度: 动态,根据实际接收数据 - 适用场景: 不定长数据传输 #### 固定长度模式 (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 低字节 ### 1.3 数据流向 #### TX 端 (发送端) ``` 用户数据 (UART2) ↓ MR16_PackTxBuffer() ← 添加 Header + CRC ↓ 完整数据包 → SX1281 无线发送 ``` #### RX 端 (接收端) ``` SX1281 无线接收 ↓ 验证 Header (RX_ID 匹配) ↓ 验证 CRC (数据完整性) ↓ 输出完整包 (含Header) → DBUS/UART ``` ### 1.4 失控保护 (Failsafe) **仅在 RX 端启用** #### 触发条件 - 100ms 未接收到有效数据 #### 安全帧格式 ``` 安全帧结构: ┌─────────┬────────────────────────┬─────────┐ │ Header │ 0xFF 0x00 0xFF 0x00 │ 0x00... │ │ 2 bytes │ 4 bytes (安全标识) │ 填充0 │ └─────────┴────────────────────────┴─────────┘ ``` #### 实现位置 - `MR16_Main()` 函数中 - 自动构造安全帧到 `txbuffer` - DBUS 输出自动发送安全帧 ### 1.5 核心函数 #### `MR16_Init()` **功能**: 系统初始化 - 从 Flash 加载配置(失败则用默认值) - 初始化 CLI 命令系统 - 初始化 SX1281 无线模块 - 初始化 LCD 显示 #### `MR16_Main()` **功能**: 主循环 - 处理 UART2 数据(区分 CLI 命令 / 用户数据) - 执行无线收发 - RX 端失控保护 - 定时更新 UI 显示 #### `MR16_PackTxBuffer()` **功能**: 封装数据包 - 输入: 用户纯数据 - 输出: Header + 数据 + CRC - 自动添加 TX_ID 和 CRC16 校验 #### `SX1281_Callback()` **功能**: 无线事件回调 - `RX_DONE`: 接收成功,验证ID,更新计数 - `TX_DONE`: 发送成功,继续发送 - `RX_TIMEOUT` / `TX_TIMEOUT`: 超时处理 --- ## 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 │ └──────────────────────────────┘ ``` ### 2.2 UI 函数 | 函数 | 功能 | 调用时机 | |------|------|----------| | `MR16_UI_PowerON()` | 开机动画 | 系统初始化时 | | `MR16_UI_Home()` | 主界面 | 初始化完成 / 模式切换 | | `MR16_UI_UpdateStatus()` | 状态更新 | RX模式 1秒刷新一次 | --- ## PART 3: CLI 命令模块 ### 3.1 MR16 系统命令 #### 配置管理 ```bash mr16 save # 保存配置到 Flash mr16 get # 从 Flash 加载配置 mr16 reset # 恢复默认配置 ``` #### 数据格式 ```bash mr16 mode # 查看当前格式 mr16 mode VARIABLE # 设置可变长度模式 mr16 mode FIXED # 设置固定长度模式 ``` #### 固定长度设置 ```bash mr16 fixedlen # 查看当前长度 mr16 fixedlen 100 # 设置用户数据长度为100字节 # 范围: 1-123 字节(不含Header和CRC) # 总包长 = fixedlen + 4 ``` #### 发射功率 ```bash mr16 power # 查看当前功率 mr16 power 10 # 设置功率为 10dBm # 范围: -18 到 +13 dBm ``` #### RX ID 配置 ```bash mr16 rxid # 显示所有 RX ID mr16 rxid1 0x1234 # 设置 RX ID 1 为 0x1234 mr16 rxid2 0x5678 # 设置 RX ID 2 mr16 rxid3 0x9ABC # 设置 RX ID 3 # 有效范围: 0x0001-0xFFFE ``` #### 操作命令 ```bash mr16 tx # 启动发送模式 mr16 rx # 启动接收模式 ``` #### 信息查看 ```bash mr16 show # 显示所有配置 mr16 help # 显示帮助信息 ``` ### 3.2 Radio 无线命令 #### 协议模式 ```bash radio mode # 查看当前协议 radio mode BLE # 切换到 BLE 模式 radio mode LORA # 切换到 LoRa 模式 radio mode GFSK # 切换到 GFSK 模式 radio mode FLRC # 切换到 FLRC 模式 ``` #### 频率设置 ```bash radio rffreq # 查看当前频率 radio rffreq 2450000000 # 设置为 2450MHz ``` #### 调制参数 ```bash radio modulation help # 查看调制参数帮助 radio modulation # 显示当前调制参数 # BLE/GFSK 示例: radio modulation br_bw 0x4C # 设置比特率/带宽 radio modulation modindex 1 # 设置调制指数 radio modulation shaping 0x10 # 设置波形整形 # LoRa 示例: radio modulation sf 0x70 # 设置扩频因子 SF7 radio modulation bw 0x18 # 设置带宽 800kHz radio modulation cr 0x01 # 设置编码率 4/5 # FLRC 示例: radio modulation br_bw 0x45 # 比特率/带宽 radio modulation cr 0x00 # 编码率 radio modulation shaping 0x10 # 波形整形 ``` #### 数据包参数 ```bash radio packet help # 查看数据包参数帮助 radio packet # 显示当前包参数 # GFSK/FLRC 示例: radio packet Preamble 0x30 # 前导码长度 radio packet SyncWordLength 0x04 # 同步字长度 radio packet Header 0x00 # 包头类型 (VARIABLE) radio packet Payload 127 # 载荷长度 radio packet Crc 0x20 # CRC 类型 radio packet Whitening 0x00 # 白化开启 # 同步字设置: radio packet SyncWord # 显示所有同步字 radio packet SyncWord1 0x12345678 # 设置同步字1 radio packet SyncWord2 0xABCDEF00 # 设置同步字2 radio packet SyncWord3 0x11223344 # 设置同步字3 # LoRa 示例: radio packet Preamble 8 # 前导码符号数 radio packet Header 0x00 # 显式包头 radio packet Payload 64 # 载荷长度 radio packet Crc 0x20 # CRC 开启 radio packet InvertIQ 0x40 # IQ 正常 ``` #### 波特率 ```bash radio baudrate # 显示所有协议波特率 radio baudrate BLE 1 # 设置 BLE 波特率 radio baudrate LORA 3 # 设置 LoRa 波特率 radio baudrate GFSK 2 # 设置 GFSK 波特率 radio baudrate FLRC 3 # 设置 FLRC 波特率 ``` #### 其他参数 ```bash radio power 10 # 设置发射功率 (dBm) radio ramptime 10 # 设置上升时间 (us) # 可选: 2/4/6/8/10/12/16/20 ``` ### 3.3 命令特性 - **不区分大小写**: `MODE` = `mode` = `Mode` - **参数自动解析**: 支持十进制、十六进制 (0x前缀) - **帮助系统**: 所有命令支持 `help` 子命令 - **分页输出**: 长帮助文本自动分页显示 - **实时生效**: 参数修改后立即更新硬件 - **自动刷新**: 参数变更后自动更新 LCD 显示 --- ## 典型应用场景 ### 场景1: 遥控器发射端 ```bash # 初始配置 mr16 mode FIXED # 固定长度模式 mr16 fixedlen 18 # 18字节遥控数据 radio mode FLRC # 使用 FLRC 协议(低延迟) mr16 power 10 # 10dBm 发射功率 mr16 save # 保存配置 # 启动发送 mr16 tx ``` ### 场景2: 接收机 ```bash # 配置多机接收 mr16 rxid1 0x1234 # 遥控器1 mr16 rxid2 0x5678 # 遥控器2 mr16 rxid3 0x9ABC # 遥控器3 radio mode FLRC mr16 save # 启动接收(带失控保护) mr16 rx ``` ### 场景3: 透传模式 ```bash # 可变长度透传 mr16 mode VARIABLE # 不定长数据 radio mode GFSK # GFSK 协议 mr16 save ``` --- ## 配置参数说明 ### Flash 存储结构 ```c Config_t { MR16_Param_t mr16; // MR16 参数 uint32_t earsed_count; // 擦写次数 } MR16_Param_t { SX1281_Params_t radioParams; // 无线参数 MR16_DataFormat_t format; // 数据格式 uint16_t fixedLength; // 固定长度 uint16_t TX_ID; // 发送ID uint16_t RX_ID[3]; // 接收ID (3个) } ``` ### 默认配置 ```c format = MR16_FORMAT_FIXED fixedLength = 122 TX_ID = 0x1234 RX_ID[0] = 0x5678 RX_ID[1] = 0x0000 (禁用) RX_ID[2] = 0x0000 (禁用) radioMode = FLRC rfFrequency = 2450000000 (2450MHz) txOutputPower = 10 (dBm) ``` --- ## 性能指标 | 参数 | 值 | |------|---| | 最大数据包长度 | 127 字节 | | 最大用户数据 | 123 字节 | | DBUS 输出频率 | 71Hz (14ms间隔) | | 失控检测延迟 | 100ms | | UI 刷新频率 | 1Hz (RX模式) | | 命令响应 | <10ms | --- ## 注意事项 ### 数据长度限制 ⚠️ **已知问题**: 117-118 字节总包长(113-114字节用户数据)会触发 SX1281 TX 超时 - 建议用户数据不超过 112 字节 - 固定长度模式建议设置 ≤ 110 字节 ### ID 配置 - TX_ID / RX_ID 有效范围: `0x0001` - `0xFFFE` - `0x0000` 和 `0xFFFF` 为无效值,用于禁用通道 ### 失控保护 - **仅 RX 端检测**: TX 端正常发送,不关心接收状态 - **安全帧识别**: 下游设备需检测 `0xFF 0x00 0xFF 0x00` 模式 - **避免冲突**: 正常数据避免出现连续的安全帧模式 ### Flash 寿命 - STM32 Flash 擦写次数: 约 10,000 次 - 避免频繁 `mr16 save` 操作 - 建议只在配置完成后保存一次 --- ## 开发者信息 - **版本**: 2.0 - **最后更新**: 2024-12-09 - **开发团队**: MR16 Development Team ## 相关文件 - `mr16.c` - 主实现文件 - `mr16.h` - 头文件定义 - `config.c` - 配置管理 - `sx1281_driver.c` - SX1281 驱动 - `lcd.c` - LCD 驱动 --- **文档结束**