射频芯片学习-ExpressLRS 对频流程分析
完整对频流程触发方式TX 进入对频: - 手柄 Lua 脚本选 [Bind] → ACTION_BIND - 调用 EnterBindingModeSafely() → EnterBindingMode() RX 进入对频: - 上电时 UID 为空 → updateBindingMode() 检测到未绑定 - 上电插拔3次 → PowerOnCounter 3 - OTA 收到绑定请求 → BindingModeRequest true - 按钮触发 → ACTION_BINDTX 端对频流程EnterBindingMode() // tx_main.cpp:1009 │ ├── 1. 停定时器 等 TX 完成 │ hwTimer::stop(); │ while (busyTransmitting); │ ├── 2. 把 Master UID 封装成 MSP 数据包 │ SendUIDOverMSP(); // UID 通过 MSP over CRSF 发给 TX 模块 │ ├── 3. 锁定到绑定速率 │ OtaCrcInitializer 0; // 绑定模式 CRC 初始值 0 │ InBindingMode true; // ← 全局标志位 │ SetRFLinkRate(RATE_BINDING); // 强制切换到 50Hz (SF8) │ ↓ │ 绑定期间: 不发 RC 数据只发 SYNC MSP 包 │ MSP 包里装着 UID反复发送 │ ├── 4. 恢复定时器开始发送 │ hwTimer::resume(); │ └── 5. 每个时隙循环检查 if (BindingSendCount 25) { // 发了 25 个 MSP 包后 ExitBindingMode(); // 自动退出绑定模式 } #if RADIO_LR1121 // LR1121 特殊处理: 一半包在 900M 发一半在 2.4G 发 // 确保无论 RX 在哪个频段都能收到 if (BindingSendCount 12) { SetRFLinkRate(RATE_DUALBAND_BINDING); // 切换到 2.4GHz 继续发 } #endif ExitBindingMode() // tx_main.cpp:1036 │ ├── OtaUpdateCrcInitFromUid(); // 恢复正常的 CRC 初始化值 ├── InBindingMode false; // 退出绑定模式 └── SetRFLinkRate(config.GetRate()); // 恢复到用户设定的速率RX 端对频流程EnterBindingMode() // rx_main.cpp:1743 │ ├── 1. 锁定到绑定速率 │ OtaCrcInitializer 0; // CRC0 (与 TX 匹配) │ InBindingMode true; │ SetRFLinkRate(RATE_BINDING, true); // 强制 50Hz SF8 │ Radio.RXnb(); // 开始接收 │ └── 2. 等待接收 MSP 包 收到 SYNC → 无 UID先不管 收到 MSP 包 → ProcessRfPacket_MSP() └→ OnELRSBindMSP(payload) UID[2..5] payload[0..3] // 存入 UID config.SetUID(UID); // 写入 EEPROM updateBindingMode() 每循环检查: if (config.IsModified()) { // UID 已写入 EEPROM ExitBindingMode(); // 退出绑定 } #if RADIO_LR1121 // 单频 LR1121 需要轮换频段 // 每 125ms 在 900M 和 2.4G 之间切换 // 确保能收到 TX 发来的绑定包因为 TX 也在两个频段之间发送 SetRFLinkRate(交替 RATE_BINDING ↔ RATE_DUALBAND_BINDING); #endif ExitBindingMode() // rx_main.cpp:1775 │ ├── FHSSrandomiseFHSSsequence(uidMacSeedGet()); // ← 用新的 UID 生成跳频序列! ├── InBindingMode false; ├── scanIndex RATE_MAX; // 从最快的速率开始扫描 └── LostConnection(false); // 进入 disconnected 状态 → 开始速率遍历绑定协议的本质TX 端 (有Master UID) RX 端 (最初无UID) ───────────────────── ───────────────── ① 都锁定在 RATE_BINDING (50Hz SF8) 都设置 CRC_Init 0 都强制 IQ 不反转 (InvertIQ) 都在 Sync Channel 频点上 跳频暂时停止 (InBindingMode 阻止 FHSS) ② TX 发 MSP 包 (封装 UID) ─────────────────────────→ ③ RX 收到提取 UID 写入 EEPROM ④ TX 发够 25 包 → 自动退出绑定 ⑤ RX 检测到 EEPROM 变更 生成新的 FHSS 序列 (基于 UID) 开始速率遍历找 TX ⑥ TX 也退出绑定恢复用户速率 正常发 SYNC 包 ⑦ RX 遍历到正确速率 → 收到 SYNC ✅ 连接成功!关键绑定只交换 UID。有了相同的 UID双方独立生成完全相同的 FHSS 跳频序列确定性伪随机后续就能在各自配置的速率上通信。绑定速率50Hz只是安全网——最可靠、距离最远、双方肯定支持的速率。已配对后的接收机或和发射机在不同时间点上电后分别是怎么跳频操作的已配对后TX/RX 不同时上电的重连流程场景TX 先上电RX 后上电TX 侧上电就开始全频段跳TX 上电 │ ├── SetRFLinkRate(用户配置的速率) │ ├── Radio.Config(SF/BW/CR..., FHSSgetInitialFreq()) // 从 sync channel 开始 │ ├── FHSSsetCurrIndex(0) // FHSS 指针归零 │ └── OtaNonce 0 // 包计数归零 │ ├── connectionState disconnected ├── hwTimer::resume() // ← 定时器启动! │ └── timerCallback() 每 20ms 触发 (50Hz): ├── OtaNonce ├── 每 FHSHopInterval 包: FHSSptr ├── 跳频: SetFrequencyReg(FHSSgetNextFreq()) ├── 不在 sync_channel: 发 RC 数据 └── 在 sync_channel: 发 SYNC 包 (每 600ms 一次) Sync 包包含: [fhssIndex5, nonce127, rateIndex3, UID3, UID4, UID5] ↑ ↑ 我在序列的第5个位置 我发了127个包了TX 在 40 个频道之间一直跳不停歇。无论 RX 什么时候来TX 都在某个频率上发着包。RX 侧上电后死守一个频率不做任何跳频RX 上电 │ ├── LostConnection(false) │ ├── connectionState disconnected │ ├── hwTimer::stop() // ← 定时器停止! 不做任何定时任务 │ ├── SetRFLinkRate(配置速率) │ │ └── Radio.Config(相同的SF/BW/CR..., FHSSgetInitialFreq()) │ │ // 频点 sync_channel 频率 (FCC915 的 915MHz) │ │ // 注意: FHSSptr 和 OtaNonce 没有重置! │ └── Radio.RXnb() // 进入连续接收模式 │ └── 死守 sync channel 频率等 RXdone 中断 不跳频、不定时、只在 sync channel 上持续监听握手瞬间TX 在频道间跳来跳去... 时间 → TX: F0→F1→F2→...→F9→SyncCH→F11→... ↑ TX 终于跳到了 Sync Channel 在这个频率上驻留 4 个时隙 (80ms 50Hz) 发了一个 SYNC 包 RX: SyncCH══════════════════════收到!═══════════════════ 死守不动 ↓ ProcessRFPacket_SYNC(): connectionState disconnected ← 匹配! → FHSSsetCurrIndex(sync-fhssIndex) // 跳到TX的序列位置9 → OtaNonce sync-nonce // 匹配TX的包计数127 → TentativeConnection() // 进入 tentative 状态 RXdoneISR 中: → HandleFHSS() // 不再返回false了! 开始正常跳频 → hwTimer::resume() // 启动定时器! TX: 继续 F11→F12→F13... RX: ↑ ↑ ↑ 已经在相同频率上了! 因为 FHSSptr 和 OtaNonce 完全同步 几个时隙后 → GotConnection() → connectionState connected ✅关键代码证明RX 断开时不跳频rx_main.cpp:408-413bool HandleFHSS() { uint8_t modresultFHSS (OtaNonce 1) % FHSHopInterval; if (... || (connectionState disconnected) || ...) return false; // ← 断开时不跳频! 频率永远不变!RX 定时器停止rx_main.cpp:852-857if (!InBindingMode) { if (hwTimer::running) { while(micros() - PFDloop.getIntEventTime() 250); hwTimer::stop(); // ← 停止定时器, 没有任何周期任务 }收到 Sync 后启动定时器rx_main.cpp:1194-1198if (ProcessRFPacket(status)) { didFHSS HandleFHSS(); // 现在 connectionState ≠ disconnected → 会跳频了! if (doStartTimer) { doStartTimer false; hwTimer::resume(); // ← 启动定时器, RX 开始跟 TX 同步运行 } }时间线对比TX 先上电, RX 后上电: ═══════════════════════════════════════════════════════════ TX: [上电]──跳频中─────────────────────────────────────────→ F0 F1 F2 ... SyncCH F11 ... F23 SyncCH ... RX: [上电]─死守SyncCH────────────────收到SYNC!──同步跳频→ 不跳不动 ↑ 双方在SyncCH相遇 RX 最多等待时间: 一个完整 FHSS 遍历周期 FCC915 50Hz: 40ch × 4 × 20ms 3.2 秒 ISM2G4 500Hz: 80ch × 4 × 2ms 0.64 秒极端情况RX 先上电TX 后上电RX: [上电]─死守SyncCH────────────────────────收到SYNC!──同步→ (可能等几秒) ↑ TX: [上电]─从SyncCH开始发!──────────────┘ FHSSptr0, Nonce0 第一站就是 Sync Channel! 几乎立即被 RX 收到这种情况秒连因为 TX 上电后的第一个频点就是 Sync Channel。如果 RX 速率配错了呢TX: 50Hz SF8 到处跳 RX: 200Hz SF6 死守 SyncCH → 调制参数不匹配, RX 的解调器根本解不出 TX 的信号 → cycleRfMode() 每隔几秒换一个速率 → 遍历到 50Hz 时 → 收到 SYNC ✅这就是之前讨论过的cycleRfMode()速率遍历机制在起作用。

相关新闻

国家中小学智慧教育平台电子课本下载终极指南:三步获取全学科教材PDF

国家中小学智慧教育平台电子课本下载终极指南:三步获取全学科教材PDF

国家中小学智慧教育平台电子课本下载终极指南:三步获取全学科教材PDF 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容…

2026/7/8 6:36:58阅读更多 →
化学AI新范式:ChemBERTa如何用Transformer重塑药物研发

化学AI新范式:ChemBERTa如何用Transformer重塑药物研发

化学AI新范式:ChemBERTa如何用Transformer重塑药物研发 【免费下载链接】bert-loves-chemistry bert-loves-chemistry: a repository of HuggingFace models applied on chemical SMILES data for drug design, chemical modelling, etc. 项目地址: https://gitco…

2026/7/8 6:31:57阅读更多 →
基于JPBC库从零实现SM9国密算法:Java实战指南与避坑详解

基于JPBC库从零实现SM9国密算法:Java实战指南与避坑详解

1. 项目概述:为什么我们要亲手实现SM9?如果你是一名Java开发者,并且对国密算法、密码学或者数据安全领域感兴趣,那么“SM9标识密码算法”这个名字你大概率不会陌生。它不像SM2、SM4那样在数字证书和通信加密中频繁亮相&#xff0c…

2026/7/8 6:31:57阅读更多 →
Paperxie AI科研绘图|打破传统作图桎梏,让科研可视化高效零门槛

Paperxie AI科研绘图|打破传统作图桎梏,让科研可视化高效零门槛

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/科研绘图科研绘图 - PaperXie智能写作PaperXie免费论文查重检测-首款免费论文检测软件,为毕业生提供专业的论文重复率检测、论文降重、Aigc检测、智能排版 、论文写作等一站式服务。https://www.paperxie.c…

2026/7/8 8:47:24阅读更多 →
终极方案:让2007-2017年的老旧Mac免费运行最新macOS系统

终极方案:让2007-2017年的老旧Mac免费运行最新macOS系统

终极方案:让2007-2017年的老旧Mac免费运行最新macOS系统 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否还在为手中的老款Mac无法升级到最新…

2026/7/8 8:47:24阅读更多 →
终极教程:让老旧Mac焕发新生,免费升级到最新macOS系统

终极教程:让老旧Mac焕发新生,免费升级到最新macOS系统

终极教程:让老旧Mac焕发新生,免费升级到最新macOS系统 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为2007-2017年的老旧Mac无法…

2026/7/8 8:47:24阅读更多 →
BetterNCM安装器:终极简单的网易云插件一键安装指南

BetterNCM安装器:终极简单的网易云插件一键安装指南

BetterNCM安装器:终极简单的网易云插件一键安装指南 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件安装的复杂步骤头疼吗?BetterNCM安装器…

2026/7/8 8:47:24阅读更多 →
计算机Java毕设实战-基于前后端分离的新闻发布会现场管控系统的设计与实现 基于 SpringBoot 的媒体新闻采编发布管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机Java毕设实战-基于前后端分离的新闻发布会现场管控系统的设计与实现 基于 SpringBoot 的媒体新闻采编发布管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/8 8:47:24阅读更多 →
vcftools 0.1.16 滑动窗口计算 Pi:100kb窗口/10kb步长参数详解与R可视化

vcftools 0.1.16 滑动窗口计算 Pi:100kb窗口/10kb步长参数详解与R可视化

VCFtools 0.1.16滑动窗口计算π:100kb窗口/10kb步长参数优化与R高级可视化实战群体遗传学研究中,核苷酸多样性(π)是衡量种群遗传变异的重要指标。本文将深入解析VCFtools工具中--window-pi和--window-pi-step参数的科学设置方法&…

2026/7/8 8:42:23阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/8 5:12:14阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/8 7:00:12阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/8 2:26:06阅读更多 →
作为一个给团队打绩效的人,我想说几句

作为一个给团队打绩效的人,我想说几句

我每半年都会给团队成员打绩效,也会参与和 CTO 的绩效校准,所以从管理者的视角,说说这件事 首先,我先把结论告诉你:接受结果,但一定要把原因问清楚。 因为当绩效公布到你这里的时候,结果基本已…

2026/7/8 0:01:17阅读更多 →
A股股指期货:全维度解析(多表格结构化完整版)

A股股指期货:全维度解析(多表格结构化完整版)

一、基础定义与核心本质股指期货全称股票价格指数期货,是中国金融期货交易所(中金所)上市的标准化金融期货合约,交易标的为 A 股大盘指数,约定未来特定时间按约定价格现金交割指数涨跌差价,不交割一篮子股票…

2026/7/8 0:01:17阅读更多 →
iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事

iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事

iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事 【免费下载链接】Jailbreak iOS 26.4 - 26, 17 - 17.7.5 & iOS 18 - 18.7.3 Jailbreak Tools, Cydia/Sileo/Zebra Tweaks & Jailbreak News Updates || AI Jailbreak Finder &…

2026/7/8 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/8 6:59:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/7 5:11:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/7 5:11:21阅读更多 →