乐鑫技术交流
直播中

哥儿

8年用户 907经验值
擅长:嵌入式技术
私信 关注
[问答]

esp32c3 eddystone url用coded phy可以吗?

有那位可以帮帮忙? 谢谢。

1) 构建后的输出 build and flash giving output :  
         E (356) EDDYSTONE_DEMO: app_main set prefered default phy failed: ESP_ERR_INVALID_STATE问题在哪里?

2) 把 esp_ble_gap_set_prefered_default_phy( ESP_BLE_GAP_PHY_CODED_PREF_MASK, ESP_BLE_GAP_PHY_1M_PREF_MASK) 这样用法对吗? 有案例我可以参考吗?

#include
#include
#include
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_bt.h"
#include "esp_gap_ble_api.h"
#include "esp_gatts_api.h"
#include "esp_bt_defs.h"               
#include "esp_bt_main.h"
#include "esp_gatt_common_api.h"

#include "sdkconfig.h"

#define LOG_TAG "EDDYSTONE_DEMO"
#define NAME    "test4"

#define ESP_BLE_GAP_PHY_CODED_PREF_MASK        (1 << 2)
#define ESP_BLE_GAP_PHY_1M_PREF_MASK           (1 << 0)

uint8_t addr_coded_eddystone[6] = {0xc0, 0xde, 0x52, 0x00, 0x00, 0x01};

static esp_ble_adv_params_t adv_params_coded_eddystone = {
        .adv_int_min       = 0x30,
        .adv_int_max       = 0x40,
        .adv_type          = ADV_TYPE_NONCONN_IND,        
        .own_addr_type     = BLE_ADDR_TYPE_RANDOM,
        .channel_map       = ADV_CHNL_ALL,
        .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
};


static uint8_t eddystone_data[] = {
/* flags */
0x02, 0x01, 0x06,
/* service type*/
0x03, 0x03, 0xAA, 0xFE,
/* service data */
0x13, 0x16, 0xAA, 0xFE, 0x10, 0xF8, 0x03,'g','o','o','.','g','l','/','a','0','m','n','s','S'
};


static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
{
    switch (event) {
    case ESP_GAP_BLE_SET_STATIC_RAND_ADDR_EVT:
        ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_SET_STATIC_RAND_ADDR_EVT, status %d", param->set_rand_addr_cmpl.status);
        break;


    case ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT:
        ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT, status %d", param->adv_data_raw_cmpl.status);
        esp_ble_gap_start_advertising(&adv_params_coded_eddystone);
        break;

    case ESP_GAP_BLE_ADV_START_COMPLETE_EVT:
        ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_ADV_START_COMPLETE_EVT, status %d", param->adv_start_cmpl.status);
        break;

    case ESP_GAP_BLE_ADV_STOP_COMPLETE_EVT:
        ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_ADV_STOP_COMPLETE_EVT, status %d", param->adv_stop_cmpl.status);
        break;
    default:
        break;
    }
}




void app_main(void)
{
    esp_err_t ret;

    ret = esp_ble_gap_set_prefered_default_phy( ESP_BLE_GAP_PHY_CODED_PREF_MASK, ESP_BLE_GAP_PHY_1M_PREF_MASK);
    if (ret) {
        ESP_LOGE(LOG_TAG, "%s set prefered default phy failed: %sn", __func__, esp_err_to_name(ret));
        return;
    }


    // Initialize NVS.
    ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK( ret );

/*

*/

    ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT));

    esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
    ret = esp_bt_controller_init(&bt_cfg);
    if (ret) {
        ESP_LOGE(LOG_TAG, "%s initialize controller failed: %sn", __func__, esp_err_to_name(ret));
        return;
    }

    ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);
    if (ret) {
        ESP_LOGE(LOG_TAG, "%s enable controller failed: %sn", __func__, esp_err_to_name(ret));
        return;
    }



    ret = esp_bluedroid_init();
    if (ret) {
        ESP_LOGE(LOG_TAG, "%s init bluetooth failed: %sn", __func__, esp_err_to_name(ret));
        return;
    }
    ret = esp_bluedroid_enable();
    if (ret) {
        ESP_LOGE(LOG_TAG, "%s enable bluetooth failed: %sn", __func__, esp_err_to_name(ret));
        return;
    }
    ret = esp_ble_gap_set_device_name(NAME);
    if (ret) {
        ESP_LOGE(LOG_TAG, "%s name device failed: %sn", __func__, esp_err_to_name(ret));
        return;
    }

    ret = esp_ble_gap_register_callback(gap_event_handler);
    if (ret){
        ESP_LOGE(LOG_TAG, "gap register error, error code = %x", ret);
        return;
    }

    vTaskDelay(200 / portTICK_PERIOD_MS);

    ret = esp_ble_gap_set_rand_addr(addr_coded_eddystone);
    if (ret) {
        ESP_LOGE(LOG_TAG, "%s set random address failed: %sn", __func__, esp_err_to_name(ret));
        return;
    }            
    ret = esp_ble_gap_config_adv_data_raw(eddystone_data, sizeof(eddystone_data));
    if (ret) {
        ESP_LOGE(LOG_TAG, "%s config raw adv data failed: %sn", __func__, esp_err_to_name(ret));
        return;
    }               

    return;
}   

构建后的输出 after build & flash,  (see below) :

E (356) EDDYSTONE_DEMO: app_main set prefered default phy failed: ESP_ERR_INVALID_STATE
                                                                                                                                                                 

回帖(1)

fanB

2024-6-13 16:16:38
首先,让我们了解一下问题和背景。您正在尝试在ESP32-C3上使用Eddystone URL广播,并遇到了一些关于设置首选物理层(PHY)的问题。

1) 构建和烧录输出问题:
错误信息 "E (356) EDDYSTONE_DEMO: app_main set prefered default phy failed: ESP_ERR_INVALID_STATE" 表示在尝试设置首选默认PHY时失败了。这可能是因为ESP32-C3不支持所需的PHY配置。

2) 关于ESP_BLE_GAP_SET_PREFERED_DEFAULT_PHY的使用:
您提供的代码行:
`esp_ble_gap_set_prefered_default_phy(ESP_BLE_GAP_PHY_CODED_PREF_MASK, ESP_BLE_GAP_PHY_1M_PREF_MASK);`
这个用法是正确的,但是ESP32-C3可能不支持这种配置。ESP32-C3主要支持1M和2M PHY,而ESP_BLE_GAP_PHY_CODED_PREF_MASK是用于编码的PHY,通常用于BLE 5.0及以上版本。

解决方案:
1. 确保您的ESP32-C3固件版本支持所需的PHY配置。您可以查看ESP-IDF的文档以获取更多信息。
2. 如果您的设备不支持编码PHY,您可以尝试使用其他PHY配置,例如:
```
esp_ble_gap_set_prefered_default_phy(ESP_BLE_GAP_PHY_1M_PREF_MASK, ESP_BLE_GAP_PHY_1M_PREF_MASK);
```
这将设置1M PHY作为首选和次选PHY。

3. 您可以查看ESP-IDF的示例项目,例如:
```
https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/ble_throughput
```
这个示例项目演示了如何使用不同的PHY配置。

最后,关于您的代码片段,您需要确保包含了所有必要的头文件,例如:
```
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_log.h"
```
希望这些信息能帮助您解决问题。如果您还有其他问题,请随时提问。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分