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的工作流程:

TI CC13xx DMM 共存状态机 BLE 活动 BLE占用天线 Sub-1G 活动 Sub-1G占用天线 空闲 天线空闲 DMM 仲裁器 比较优先级 + 时间窗口 授权天线使用权 优先级规则 BLE连接事件 > Sub-1G数据 Sub-1G信标 > BLE扫描

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上,结果因为信号抖动导致误触发。正确的做法是:

  1. PTA信号走最短路径,不要经过长走线
  2. 在接收端加一个RC滤波器(1kΩ + 100pF)
  3. 软件里做去抖处理,至少采样两次

避坑指南:我曾经在一个项目里把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的优先级。