4. 4GHz频谱资源与信道规划
各位工程师朋友,咱们今天聊点实在的。BLE和WiFi打架,光靠软件调度有时候真不够。你得从芯片层面下手,把硬件管脚接对,把PTA接口配好。我这些年调试过的板子,十块里有七八块都是因为管脚没接对,导致共存方案没跑起来。
说白了,芯片级共存就是让WiFi和BLE共用一根天线,或者至少让它们别互相抢信道。主流厂商都有自己的绝活。咱们一个一个看。
4.1 乐鑫ESP32:双模单天线的老大哥
ESP32这芯片,我用了好几年。它内置了WiFi和BLE双模,共用一根天线。硬件上有个关键管脚叫ANT_SEL,用来切换天线归属。
ESP32的共存方案,核心是硬件包仲裁。芯片内部有个仲裁器,WiFi和BLE的收发请求都得经过它。谁优先级高,谁先用天线。优先级可以软件配,但我建议你保持默认——WiFi的Beacon帧优先级最高,其次是BLE的连接事件,最后才是普通数据。
ESP32共存关键点:
- ANT_SEL管脚必须接天线开关的控制端
- WiFi和BLE共用同一个MAC地址(可改)
- 内部仲裁延迟约2-3μs,对BLE连接间隔影响很小
我在一个智能家居项目里遇到过一个问题:ESP32同时跑WiFi AP模式和BLE扫描,结果BLE老是丢包。后来查出来是WiFi的Beacon间隔设得太短(100ms),把BLE的扫描窗口全挤占了。把Beacon间隔调到200ms,问题就解决了。你想想看,有时候不是方案不行,是参数没调对。
4.2 Nordic nRF52系列:PTA接口的教科书
nRF52系列,尤其是nRF52840,是BLE芯片里的标杆。它支持3线PTA(Packet Traffic Arbitration)接口,专门用来和外部WiFi芯片协同工作。
PTA接口长什么样?三根线:
| 信号名 | 方向 | 作用 |
|---|---|---|
| WLAN_ACTIVE | WiFi → BLE | WiFi正在收发,BLE让路 |
| BT_ACTIVE | BLE → WiFi | BLE正在收发,WiFi让路 |
| BT_PRIORITY | BLE → WiFi | BLE有高优先级事件(如连接参数更新) |
这三根线一接,WiFi和BLE就能互相打招呼了。WiFi要发数据了,拉高WLAN_ACTIVE,BLE就乖乖等着。反过来也一样。
我的经验:nRF52的PTA接口默认是推挽输出,但有些WiFi芯片(比如TI的WL18xx)需要开漏。记得加上拉电阻,不然信号电平不匹配。我曾经因为这个原因浪费了两天时间。
nRF52的PTA还有个好处——它支持优先级抢占。比如BLE正在发一个连接更新包,这时候WiFi想发Beacon,BT_PRIORITY拉高,WiFi就得等。这个机制在音频传输场景里特别有用。
4.3 TI CC13xx系列:Sub-1G与BLE的共存方案
TI的CC13xx系列有点特殊。它同时支持Sub-1G和BLE,两个射频共用一根天线。共存方案叫DMM(Dynamic Multi-protocol Manager)。
DMM的核心是一个状态机。它管理着两个协议栈的射频访问请求。每个协议栈可以设置优先级,DMM根据优先级和当前状态决定谁用天线。
我画了一张图,帮你理解DMM的工作流程:
DMM的配置通过TI的RF Core API完成。你需要告诉它每个协议栈的优先级、最大占用时间、最小空闲时间。我一般这么配:
// TI DMM 配置示例
DMM_Policy_t policy = {
.blePriority = 2, // BLE连接事件优先级
.sub1Priority = 1, // Sub-1G数据优先级
.bleMaxDuration = 5000, // BLE最大占用5ms
.sub1MaxDuration = 3000, // Sub-1G最大占用3ms
.guardInterval = 150 // 切换保护间隔150μs
};
DMM_setPolicy(&policy);
注意:CC13xx的DMM有个坑——如果你把BLE的优先级设得比Sub-1G高太多,Sub-1G的信标帧可能会被饿死。我在一个水表项目里就遇到过,Sub-1G每隔10秒才发一次数据,结果因为BLE一直占着天线,Sub-1G的数据延迟到了15秒。后来我把Sub-1G信标的优先级调高了一级,问题解决。
4.4 PTA接口详解:三根线怎么玩出花
PTA接口,全称Packet Traffic Arbitration。它最早是WiFi联盟定义的,后来被蓝牙SIG拿过来用。现在主流的WiFi+BLE combo芯片都支持。
PTA有三种模式:
- 2线PTA:只有WLAN_ACTIVE和BT_ACTIVE,没有优先级信号。适合简单场景,比如BLE只做广播。
- 3线PTA:多了BT_PRIORITY,支持优先级抢占。适合BLE做连接或音频传输。
- 4线PTA:再加一根WLAN_PRIORITY,WiFi也能声明优先级。适合高吞吐场景。
我建议你直接用3线PTA。2线太简陋,4线大多数芯片不支持。3线是甜点。
管脚连接时要注意时序。PTA信号是异步的,WiFi和BLE的时钟域不同。我见过有人把PTA信号直接连到GPIO上,结果因为信号抖动导致误触发。正确的做法是:
- PTA信号走最短路径,不要经过长走线
- 在接收端加一个RC滤波器(1kΩ + 100pF)
- 软件里做去抖处理,至少采样两次
避坑指南:我曾经在一个项目里把BT_ACTIVE和BT_PRIORITY接反了。结果BLE的高优先级事件(比如连接参数更新)被WiFi无视了,导致连接断开。查了两天才发现是管脚顺序搞错了。所以,接完线之后一定要用逻辑分析仪抓一下波形,确认信号方向正确。
4.5 硬件管脚连接:一张表说清楚
不同芯片的PTA管脚命名不一样。我整理了一张对照表,方便你查:
| 信号功能 | ESP32 | nRF52 | TI CC13xx | 备注 |
|---|---|---|---|---|
| WiFi活动指示 | GPIO(软件模拟) | WLAN_ACTIVE | RF_CORE(内部) | ESP32无专用PTA引脚 |
| BLE活动指示 | GPIO(软件模拟) | BT_ACTIVE | RF_CORE(内部) | CC13xx通过DMM内部处理 |
| BLE优先级 | 不支持 | BT_PRIORITY | RF_CORE(内部) | nRF52必须接 |
| 天线切换 | ANT_SEL | 外部GPIO | DIO(可配置) | ESP32专用引脚 |
看到没?ESP32没有专用的PTA引脚,它靠软件模拟。nRF52和TI CC13xx都有硬件PTA支持。如果你用的是ESP32,我建议你至少把ANT_SEL接好,然后通过软件配置WiFi和BLE的优先级。