Light Sleep issues with BTLE & High deep sleep power
Posted: Thu Nov 22, 2018 3:50 am
Hi,
Two part issue that may be linked together.
I'm running into assert fails when waking from light sleep, and very high current draw when in deep sleep.
These are most likely related, and so figured i'll mention them together.
When I put the ESP32 into light sleep (using timer for wakeup after approx 10 mins), everything wakes up and runs fine until I try and enable the bluetooth again.
I'm using a helper function for BT control (at end) and this works fine without sleep modes being used in the code. However whenever i have the sleep I run into whenever i try and re-enable the BT after waking up.
The second issue is that entering deep sleep mode appears to work, but it has a very high power consumption (18mA), where as light sleep uses only 2.5mA.
I believe I have the correct sequence for shutting down into deep sleep, but apparently this is not the cause. Would love any help
For the BT, is this a known issue of some kind or am I doing a step in the wrong order ?
ESP Module is the WROVER with the 4MB PSRAM
Code for BTLE on/off :
Entering deep sleep code :
Two part issue that may be linked together.
I'm running into assert fails when waking from light sleep, and very high current draw when in deep sleep.
These are most likely related, and so figured i'll mention them together.
When I put the ESP32 into light sleep (using timer for wakeup after approx 10 mins), everything wakes up and runs fine until I try and enable the bluetooth again.
I'm using a helper function for BT control (at end) and this works fine without sleep modes being used in the code. However whenever i have the sleep I run into
Code: Select all
ASSERT_PARAM(512 0), in rwble.c at line 222
The second issue is that entering deep sleep mode appears to work, but it has a very high power consumption (18mA), where as light sleep uses only 2.5mA.
I believe I have the correct sequence for shutting down into deep sleep, but apparently this is not the cause. Would love any help
For the BT, is this a known issue of some kind or am I doing a step in the wrong order ?
ESP Module is the WROVER with the 4MB PSRAM
Code for BTLE on/off :
Code: Select all
printf("TurnBTOnOff State %s \n", on ? "On" : "Off");
if (on) {
vTaskDelay(50);
// Turning on
ESP_LOGI("BTLE", "Turning On BTLE");
ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);
if (ret) {
ESP_LOGE(GATTS_TABLE_TAG, "%s [0] enable controller failed: %s", __func__, esp_err_to_name(ret));
return;
}
ret = esp_bluedroid_init();
if (ret) {
ESP_LOGE(GATTS_TABLE_TAG, "%s [1] init bluetooth failed: %s", __func__, esp_err_to_name(ret));
abort();
return;
}
ret = esp_bluedroid_enable();
if (ret) {
ESP_LOGE(GATTS_TABLE_TAG, "%s [2] enable bluetooth failed: %s", __func__, esp_err_to_name(ret));
return;
}
ret = esp_ble_gatts_register_callback(gatts_event_handler);
if (ret) {
ESP_LOGE(GATTS_TABLE_TAG, "[3] gatts register error, error code = %x", ret);
return;
}
ret = esp_ble_gap_register_callback(gap_event_handler);
if (ret) {
ESP_LOGE(GATTS_TABLE_TAG, "[4] gap register error, error code = %x", ret);
return;
}
ret = esp_ble_gatts_app_register(ESP_APP_ID);
if (ret) {
ESP_LOGE(GATTS_TABLE_TAG, "[5] gatts app register error, error code = %x", ret);
return;
}
esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(250);
if (local_mtu_ret) {
ESP_LOGE(GATTS_TABLE_TAG, "[6] set local MTU failed, error code = %x", local_mtu_ret);
}
printf("BT On\n");
} else {
// Turning off
ESP_LOGI("BTLE", "Turning Off BTLE");
ESP_ERROR_CHECK(esp_ble_gatts_app_unregister(ESP_APP_ID));
ESP_ERROR_CHECK(esp_bluedroid_disable());
ESP_ERROR_CHECK(esp_bluedroid_deinit());
ESP_ERROR_CHECK(esp_bt_controller_disable());
printf("BT Off\n");
vTaskDelay(100);
}
Entering deep sleep code :
Code: Select all
printf("PowerState: Critical Shutdown : %d / %dmV\n", getSOC(), batteryVoltage);
// Go into deep sleep
if (lastPowerState == PowerStates::Undefined) {
// First loop has tripped critical, sleep for 60 mins
esp_sleep_enable_timer_wakeup((uint64_t)60 * (uint64_t)60 * (uint64_t)1000 * (uint64_t)1000); // 60 min nap
} else {
esp_sleep_enable_timer_wakeup(30 * 60 * 1000 * 1000); // 30 min nap
}
// Setup io wakeup
const uint64_t ext_wakeup_pin_1_mask = 1ULL << PIN_BUTT_WAKE;
gpio_pad_select_gpio(PIN_BUTT_WAKE);
gpio_set_direction(PIN_BUTT_WAKE, GPIO_MODE_INPUT);
ESP_ERROR_CHECK(esp_sleep_enable_ext1_wakeup(ext_wakeup_pin_1_mask, ESP_EXT1_WAKEUP_ANY_HIGH));
turnPeriphOnOff(false);
setBTLE(false); // BTLE control from above ^
esp_wifi_stop();
esp_bluedroid_disable();
esp_bt_controller_disable();
esp_bt_controller_deinit();
esp_wifi_deinit();
esp_deep_sleep_start();