# RF 共存

[English]

## 概览

ESP系列芯片最多支持三种射频收发模块: Bluetooth（BT 和 BLE）, IEEE 802.15.4 (Thread / Zigbee) 和 Wi-Fi, 而每款芯片只支持一路被多个射频收发模块共享的 RF，不同模块无法同时使用 RF 收发数据，因此采用时分复用的方法调节不同模块的数据包收发。

## ESP32-H4 支持的共存场景

IEEE 802.15.4 (Thread / Zigbee) 和 BLE 共存支持功能
| 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-H4 会自动进行共存状态切换，无需调用 API 对其进行干预。但是对于 BLE MESH 和 Wi-Fi 的共存，ESP32-H4 对其提供了两个 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 选择打开蓝牙协议栈动态内存配置选项。

备注

由于共存配置选项依赖于任何两个已启用的射频收发模块的存在，请在配置任何共存功能之前，确保至少使能了两个射频收发模块。

此文档对您有帮助吗？

- 反馈已收到，谢谢！
- 如果您有其他意见，欢迎填写乐鑫文档反馈表。

- 我们重视您的反馈。
- 您可以填写乐鑫文档反馈表告诉我们如何改进该文档。