513 lines
14 KiB
Markdown
513 lines
14 KiB
Markdown
# MR16 模块说明文档
|
||
|
||
## 概述
|
||
MR16 是基于 SX1281 2.4GHz 无线收发芯片的遥控数据传输系统,支持多种无线协议(BLE/LoRa/GFSK/FLRC),提供 FreeRTOS CLI 命令行接口和 LCD 状态显示。
|
||
|
||
## ⚠️ 通信要求 (Critical Requirements)
|
||
|
||
**发送端和接收端必须配置一致,否则无法通信!**
|
||
|
||
### 必须匹配的参数:
|
||
1. **无线协议模式** - `radio mode <BLE|LORA|GFSK|FLRC>`
|
||
- 双方必须使用相同的协议(如都用 FLRC)
|
||
|
||
2. **波特率** - `radio baudrate <index>`
|
||
- 同一协议下,双方必须使用相同的波特率索引
|
||
- 例如:FLRC 模式下,双方都用 `radio baudrate 2` (520kbps)
|
||
|
||
3. **频率** - `radio channel <MHz>`
|
||
- 双方必须工作在相同频率
|
||
- 例如:都设置为 `radio channel 2450`
|
||
|
||
4. **TX/RX ID** - `mr16 txid <id>` / `mr16 rxid <id>`
|
||
- 发送端的 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 驱动
|
||
|
||
---
|
||
|
||
**文档结束**
|