RF 共存
概览
ESP系列芯片最多支持三种射频收发模块: Bluetooth(BT 和 BLE), IEEE 802.15.4 (Thread / Zigbee) 和 Wi-Fi, 而每款芯片只支持一路被多个射频收发模块共享的 RF,不同模块无法同时使用 RF 收发数据,因此采用时分复用的方法调节不同模块的数据包收发。
ESP32-H2 支持的共存场景
BLE |
||||
Scan |
Advertising |
Connected |
||
Thread / Zigbee |
Scan |
X |
Y |
Y |
Router |
X |
Y |
Y |
|
End Device |
C1 |
Y |
Y |
备注
Y:支持且性能稳定。
C1:不能保证性能处于稳定状态。
X:不支持。
备注
Thread 和 Zigbee 网络中的路由节点与其邻居保持非同步连接,因此需要持续接收信号。在仅有单一 RF 通路的情况下,Wi-Fi 或 BLE 流量的增加可能导致 Thread 和 Zigbee 通信的丢包率上升。
为了构建基于 Wi-Fi 的 Thread 边界路由器或 Zigbee 网关产品,我们推荐采用双 SoC 方案(例如 ESP32-S3 + ESP32-H2),使用独立的 RF。这种配置能够同时接收 Wi-Fi 和 802.15.4 信号,确保最佳性能。
共存机制与策略
共存机制
基于优先级抢占的 RF 资源分配机制,如下图所示,Bluetooth,Wi-Fi 和 802.15.4 模块向共存模块申请 RF 资源,共存模块根据三者的优先级高低裁决 RF 归谁使用。
共存机制
共存策略
IEEE 802.15.4 模块根据预先分配的优先级请求 RF 资源。普通的接收操作被分配为最低优先级,这意味着 Wi-Fi 和 BLE 在需要时会优先占用 RF,而 802.15.4 只能在剩余时间内进行接收。其他 802.15.4 操作,例如发送和接收 ACK 以及在指定时间内的发送和接收,被分配了更高的优先级。然而,它们能否实际获得 RF 资源最终取决于当时 Wi-Fi 和 BLE 操作的优先级。
如何使用共存功能
共存 API 的使用
在大多数共存情况下,ESP32-H2 会自动进行共存状态切换,无需调用 API 对其进行干预。但是对于 BLE MESH 和 Wi-Fi 的共存,ESP32-H2 对其提供了两个 API。当 BLE MESH 的状态发生变化时,应先调用 esp_coex_status_bit_clear
对上一个状态进行清除,然后调用 esp_coex_status_bit_set
设置当前状态。
BLE MESH 共存状态描述
由于 Wi-Fi 和 Bluetooth 固件无法获知当前的上层应用的场景,一些共存模板需要应用代码调用共存的 API 才能生效。BLE MESH 的工作状态就需要由应用层通知给共存模块,用于选择共存模板。
ESP_COEX_BLE_ST_MESH_CONFIG:正在组网。
ESP_COEX_BLE_ST_MESH_TRAFFIC:正在传输数据。
ESP_COEX_BLE_ST_MESH_STANDBY:处于空闲状态,无大量数据交互。
共存 API 错误代码
所有共存 API 都有自定义的返回值,即错误代码。这些代码可分类为:
无错误,例如:返回值为 ESP_OK 代表 API 成功返回。
可恢复错误,例如: 返回值为 ESP_ERR_INVALID_ARG 代表 API 参数错误。
设置共存编译时选项
在完成共存程序编写的时候,您必须通过 menuconfig 选择 CONFIG_ESP_COEX_SW_COEXIST_ENABLE 打开软件共存配置选项,否则就无法使用上文中提到的共存功能。
您可以通过修改以下 menuconfig 选项,以减小内存开销:
CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY 选择打开蓝牙协议栈动态内存配置选项。
备注
由于共存配置选项依赖于任何两个已启用的射频收发模块的存在,请在配置任何共存功能之前,确保至少使能了两个射频收发模块。