获取 esp32 天线的信号量(蓝牙/wifi 双模)

Posted

技术标签:

【中文标题】获取 esp32 天线的信号量(蓝牙/wifi 双模)【英文标题】:acquire a semaphore for the esp32 antenna (bluetooth/wifi dualmode) 【发布时间】:2019-09-15 20:49:04 【问题描述】:

我正在尝试构建一个 esp32 应用程序,我同时启用了蓝牙和 wifi。

蓝牙与 a2dp 配置文件一起使用,其中 esp 是接收器。收到数据后,应该通过 UDP 套接字将其作为广播发布到网络。

问题是天线。 bt 和 wifi 都在共享它。 a2dp 流似乎永久获取天线并很少释放它(~2 包/分钟,我有 ~3000 包/分钟)。

所以我的问题是:是否有某种信号量,可以获取它来完全控制天线?那么我的套接字就可以将数据发送到网络了吗?

我将我的 esp32 与 freeRTOS 一起使用。 freeRTOS 库是用 C 编写的,但我试图用 C++ 包装所有内容。我仍然认为这个问题与 C 库有关,所以我用 C 标记它。

我愿意接受任何关于如何构建它的建议。提前致谢。

更新

我正在使用来自官方esp-idf repo 的release/v3.3

我有:CONFIG_SW_COEXIST_ENABLE=yCONFIG_SW_COEXIST_PREFERENCE_WIFI=y

我在我的配置中找不到CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE

上述配置不起作用。

我尝试阅读该帖子,但在我的库中找不到任何“scan_window”或“scan_interval”。写着在gap_api某处但找不到。

这是我的代码 + 配置:https://github.com/Dimfred/esp32_bt_streamer

应该广播a2dp_msg的套接字客户端任务从这里开始: https://github.com/Dimfred/esp32_bt_streamer/blob/master/main/app/event_handler.cpp#L22

所有从站/接入点/蓝牙/a2dp弹出的事件都被event_handler.hpp/cpp捕获

【问题讨论】:

你在使用 esp-idf 吗? 是的,我正在使用 esp-idf。 仅仅因为您可能使用 C 作为编程接口,这与 C 作为语言无关。否则,您也可以将您的问题标记为“英语”或“键盘” 【参考方案1】:

如您所见,蓝牙在 WIFI 上具有更高的优先级。

查看CONFIG_SW_COEXIST_ENABLE 并确保它已启用。您还需要将CONFIG_SW_COEXIST_PREFERENCE 配置为WIFI。请参阅页面了解您可以根据您的应用程序更新的其他标志。

如果你想让硬件负责处理共存设备(BL和WIFI),你可以禁用CONFIG_SW_COEXIST_ENABLE并减少扫描窗口,增加BL的扫描间隔,给WIFI获取时间访问天线。有关详细信息,请参阅此post。

回答您关于可能的信号量/互斥量的原始问题。我怀疑是否有一个可供您使用,我会留下 API(软件)来处理访问天线的共存模块。但是,一旦设置了CONFIG_SW_COEXIST_ENABLE(标志重命名为CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE),您就可以随时查看代码在做什么。见https://github.com/espressif/esp-idf/blob/81ca1c01395f604972fbf141cfbe49764a746023/components/esp_wifi/src/phy_init.c

【讨论】:

我已经尝试将优先级更改为 WiFi,但没有任何效果。共存已启用。感谢您发布有关禁用共存的帖子,我将对此进行深入研究。我目前的时间不多,但会尽快尝试。 如果没有任何效果,请更新问题或使用您尝试过的内容添加 cmets。

以上是关于获取 esp32 天线的信号量(蓝牙/wifi 双模)的主要内容,如果未能解决你的问题,请参考以下文章

esp32的wifi模块叫什么

ESP32-DOWDQ6蓝牙&Wifi 两个可单独控制的 CPU 内核

ESP32那些事儿:功能开发之蓝牙及WiFi功能

ESP32学习笔记(48)——WiFi蓝牙网关

ESP32学习笔记(48)——WiFi蓝牙网关

ESP32-IDF开发实例-传感器模块编程-DHT11温度湿度传感器