Go to file
2025-12-10 20:18:07 +08:00
.settings SPI通了,但驱动不通 2025-11-21 18:20:12 +08:00
.vscode SPI通了,但驱动不通 2025-11-21 18:20:12 +08:00
cmake 保存sx1281文件,由于修改参数需求,把sx1281.h中radio主结构体中的param改为指针 2025-12-03 22:57:04 +08:00
Core 保存 2025-12-10 20:18:07 +08:00
Drivers SPI通了,但驱动不通 2025-11-21 18:20:12 +08:00
MDK-ARM 保存 2025-12-10 20:18:07 +08:00
Middlewares/Third_Party/FreeRTOS/Source 保存sx1281文件,由于修改参数需求,把sx1281.h中radio主结构体中的param改为指针 2025-12-03 22:57:04 +08:00
User 保存 2025-12-10 20:18:07 +08:00
.clangd SPI通了,但驱动不通 2025-11-21 18:20:12 +08:00
.gitignore SPI通了,但驱动不通 2025-11-21 18:20:12 +08:00
.mxproject 保存sx1281文件,由于修改参数需求,把sx1281.h中radio主结构体中的param改为指针 2025-12-03 22:57:04 +08:00
CMakeLists.txt 保存sx1281文件,由于修改参数需求,把sx1281.h中radio主结构体中的param改为指针 2025-12-03 22:57:04 +08:00
CMakePresets.json SPI通了,但驱动不通 2025-11-21 18:20:12 +08:00
MR16.ioc 保存 2025-12-10 20:18:07 +08:00
README.md 保存 2025-12-10 20:18:07 +08:00
startup_stm32f103xb.s SPI通了,但驱动不通 2025-11-21 18:20:12 +08:00
STM32F103XX_FLASH.ld SPI通了,但驱动不通 2025-11-21 18:20:12 +08:00

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

配置示例

# 发送端配置
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

验证方法

# 使用 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 系统命令

配置管理

mr16 save             # 保存配置到 Flash
mr16 get              # 从 Flash 加载配置
mr16 reset            # 恢复默认配置

数据格式

mr16 mode             # 查看当前格式
mr16 mode VARIABLE    # 设置可变长度模式
mr16 mode FIXED       # 设置固定长度模式

固定长度设置

mr16 fixedlen         # 查看当前长度
mr16 fixedlen 100     # 设置用户数据长度为100字节
                      # 范围: 1-123 字节不含Header和CRC
                      # 总包长 = fixedlen + 4

发射功率

mr16 power            # 查看当前功率
mr16 power 10         # 设置功率为 10dBm
                      # 范围: -18 到 +13 dBm

RX ID 配置

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

操作命令

mr16 tx               # 启动发送模式
mr16 rx               # 启动接收模式

信息查看

mr16 show             # 显示所有配置
mr16 help             # 显示帮助信息

3.2 Radio 无线命令

协议模式

radio mode            # 查看当前协议
radio mode BLE        # 切换到 BLE 模式
radio mode LORA       # 切换到 LoRa 模式
radio mode GFSK       # 切换到 GFSK 模式
radio mode FLRC       # 切换到 FLRC 模式

频率设置

radio rffreq          # 查看当前频率
radio rffreq 2450000000   # 设置为 2450MHz

调制参数

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    # 波形整形

数据包参数

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 正常

波特率

radio baudrate            # 显示所有协议波特率
radio baudrate BLE 1      # 设置 BLE 波特率
radio baudrate LORA 3     # 设置 LoRa 波特率
radio baudrate GFSK 2     # 设置 GFSK 波特率
radio baudrate FLRC 3     # 设置 FLRC 波特率

其他参数

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: 遥控器发射端

# 初始配置
mr16 mode FIXED           # 固定长度模式
mr16 fixedlen 18          # 18字节遥控数据
radio mode FLRC           # 使用 FLRC 协议(低延迟)
mr16 power 10             # 10dBm 发射功率
mr16 save                 # 保存配置

# 启动发送
mr16 tx

场景2: 接收机

# 配置多机接收
mr16 rxid1 0x1234         # 遥控器1
mr16 rxid2 0x5678         # 遥控器2
mr16 rxid3 0x9ABC         # 遥控器3
radio mode FLRC
mr16 save

# 启动接收(带失控保护)
mr16 rx

场景3: 透传模式

# 可变长度透传
mr16 mode VARIABLE        # 不定长数据
radio mode GFSK           # GFSK 协议
mr16 save

配置参数说明

Flash 存储结构

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个)
}

默认配置

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
  • 0x00000xFFFF 为无效值,用于禁用通道

失控保护

  • 仅 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 驱动

文档结束