Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ble taking too much power (IDFGH-769) #947

Open
joicetm opened this issue Aug 31, 2017 · 108 comments
Open

ble taking too much power (IDFGH-769) #947

joicetm opened this issue Aug 31, 2017 · 108 comments
Assignees

Comments

@joicetm
Copy link

joicetm commented Aug 31, 2017

Hi,
I wish to know when can i expect the low power modes in ble? would this feature be added in the next release v3.0?
currently i observe that with single core and 80 Mhz, the device consumes around 80-90 mA.[minimum i was able to achieve]
is it the best we can achieve ? or is there any way to improve the power consumption with current idf version?

@MS-elug
Copy link

MS-elug commented Aug 31, 2017

I have the same issue. Even running the demo heats the chips a lot.
Would be good to have a fix or a demo showing how to create a very low powered BT server.

@FayeY FayeY changed the title ble taking too much power [TW#15167] ble taking too much power Sep 5, 2017
@igrr
Copy link
Member

igrr commented Sep 7, 2017

@joicetm BLE power consumption improvements (i.e. modem sleep mode) are not planned for 3.0. 80-90mA is the best that can be achieved in the current version.

@MS-elug
Copy link

MS-elug commented Sep 8, 2017

Do you know what is the release target for the modem sleep mode ? Where can we find the project roadmap and estimate dates?

@mobilinkd
Copy link

This is an important issue for me. I would be using the ESP32 in my project right now if I could run the ble_spp_server demo using less than 10mA.

@Yulong-espressif
Copy link
Contributor

@MS-elug @mobilinkd The BLE modem sleep will be release at the next version(v3.1), thank you for your concern about ESP32.

@mobilinkd
Copy link

That's great news, @Yulong-espressif ! Are you able to characterize the current consumption with this enhancement?

@PromTZ
Copy link

PromTZ commented Dec 7, 2017

Hi, I am using ESP-WROOM-32 with Arduino IDE. I want to know is there any way to reduce power consumption of BLE peripheral? I made a test on power consumption during BLE advertising which was consuming 112mA current when CPU set at 80Mhz. I want to reduce the current consumption to at least 1mA but BLE should keep on advertise. Please help me in this regards.

@devKlausS
Copy link

@Yulong-espressif can you tell us a release date for BLE modem sleep (version 3.1)? Moreover I would be interested in the current consumption in BLE modem sleep mode. We are planning to develop a low power product, therefore the current consumption is the most critical part of the project.

@sargun
Copy link

sargun commented Jan 20, 2018

@Yulong-espressif Is BLE wakeup going to be in the next version?

@Yulong-espressif
Copy link
Contributor

@sargun Yes, will be release in the version 3.1

@TianHao-Yoursmake
Copy link

Actually, both BR/EDR and BLE power save will be released in release/v3.1.

@joicetm
Copy link
Author

joicetm commented Apr 3, 2018

Thanks for the update, TianHao-Espressif .

@frax84
Copy link

frax84 commented May 22, 2018

Features has been implemented few days ago. I tried it and it works. With the exactly same features (time interval=50ms, 15B per packet, notify enabled) power consumption passed from 102mA to 35-40mA. Data exchange is not fluid ad before, but don't know the cause.

@TianHao-Yoursmake
Copy link

TianHao-Yoursmake commented May 24, 2018

@frax84 , the BLE/BR/EDR sleep current and related performance is in test.
But, due to the Bluetooth RF is shared with WIFI, so the average current will not be very low as single BLE IC.

And what "not fluid" present. Could you provide your test case?

@frax84
Copy link

frax84 commented May 24, 2018

@TianHao-Espressif Hi Tiao! Actually was not a complain but was just informing the others in this post. By the way, your explanation is very interesting. This is my use case:

  • GATT server (no security)
  • connection interval = 50ms (min 40 - max 60ms)
  • no latency
  • Payload = 15Bytes
  • Data are all notified
  • Antenna power set default
  • The consumption i wrote about is not only esp32. I'm using esp32thing from Sparkfun with no mod (i.e. leds still on the board)
  • in SDK i configured optimization for BLE (default was "balanced")

With the term "no fluid" i mean that while before (was using BLE with BTDM mode) data were coming evenly time-spaced ("1-2-3-4-5-6-7-8-9-10") now they tend to come less evenly spaced (i.e. "1-2---34--5-6-7--8---9-10"). I have not test data to show but what i'm saying is clearly visible with eye (while with previous settings it was ok)

I have two questions.

  1. Is it possibile to completely disable WiFi in SDKconfig.h?
  2. If yes, would this " disabling" would give any consumption improvements?

Thank you

EDIT: edited some typos and added more infos about my use case

@lucashutchinson
Copy link
Contributor

Hi All,

I have been optimising our ESP32 application for low power at the moment.
I have eliminated a few power hogs in our code and incorrect configurations however i am running into a wall with bluetooth enabled.

The lowest consumption with BLE enabled (BT-classic disabled) is around 28-32mA when advertising with a 200ms interval
In the same application if BLE is not initialised, the power consumption drops to around 3.2mA.

Im just wondering if i am at the limit of what the ESP32 can currently do.
And if this is the case, is there any planned work to improve this during BLE-only modes?

I understand that as this chip supports BLE and WiFi the power consumption during transmit and Reception will be higher than a BLE only chip. However since BLE operates on the connection interval paradigm, if there is a 40ms connection interval or a 200ms advertising interval, surely the radio could be disabled between connection intervals saving power during these periods? This would likely result in a much lower average current.

Thanks in advance for your response.
@TianHao-Espressif @projectgus

@chegewara
Copy link
Contributor

chegewara commented Nov 6, 2018

@lucashutchinson Did you try to change TX power? By default it is setup pretty high (+3dBm).

Remember that you can decrease TX power for advertising only if you want.

@Weijian-Espressif
Copy link
Collaborator

hi all:
Please confirm if bluetooth mode sleep is enabled in menuconfig.
Location: Component config -> Bluetooth -> Bluetooth controller -> MODEM SLEEP Options

@lucashutchinson
Copy link
Contributor

lucashutchinson commented Nov 7, 2018

Hi @chegewara @Weijian-Espressif

Yes I have tried changing the TX power between N12 and P9, no real difference was noticed. however i am going to do a few more tests.

I have enable bluetooth modem sleep options, and have tried both ORIG and EVED modes.
I have also enabled power saving in Component config -> Power Management
and also enable tickless idle in Component config -> FreeRTOS -> Tickless Idle

I have also called the functions:
esp_pm_configure and esp_bt_sleep_enable.
I have also tried a few different configurations for the esp_pm_configure, i do see a difference when changing the max processor speed from 240mhz to 80mhz.
the current values i mentioned above were @ 80mhz. when running at 240mhz I see around 50mA of current draw.

Do you have any internal test results of low power bluetooth that can be shared?

Thanks for your responses!

@mywang-espressif
Copy link

@lucashutchinson . 30mA is in accord with our internal test result for BLE advertising in current stage. In order to further optimize the bluetooth power consumption, we are trying to resolve the issue in the combination use of bluetooth modem sleep and Dynamic Frequency Scaling(DFS) as well as Automatic light sleep. which can hopefully be completed in a month.
The reason that you get a 3.2mA current compared to 30mA when BLE is inititalized is, currently bluetooth module will acquire a pm_lock during initialization and won't release it until deinit, and therefore the CPU frequency cannot be decreased to lower than 80MHz. After the we have resolve the issue for BT modem sleep with DFS and light sleep, you can expect an even lower power consumption.

@Alvin1Zhang
Copy link
Collaborator

@lucashutchinson Could you help share if any updates for this issue? Thanks.

1 similar comment
@Alvin1Zhang
Copy link
Collaborator

@lucashutchinson Could you help share if any updates for this issue? Thanks.

@github-actions github-actions bot changed the title [TW#15167] ble taking too much power [TW#15167] ble taking too much power (IDFGH-769) Mar 15, 2019
@lucashutch
Copy link

There are no updates that I have had from espressif.

@projectgus projectgus changed the title [TW#15167] ble taking too much power (IDFGH-769) ble taking too much power (IDFGH-769) Mar 18, 2019
@mywang-espressif
Copy link

Hi, a commit on optimization of Bluetooth power consumption was merged into ESP-IDF recently. The merge commit is(git describe --tag): v4.0-dev-684-gb859584. An external 32.768kHz crystal is required to take advantage of this feature.

Here is the description for this commit and a brief manual.

Feature: Bluetooth modem sleep with external 32.768kHz xtal under light sleep

Overview

Bluetooth modem sleep could work under DFS but could not work under light sleep in previous implementation, which is largely due to the sleep clock source. Sleep clock must provide enough accuracy for BLE to maintain time during sleep.

Main crystal is supposed to be powered down during light sleep. It can support DFS but not light sleep for Bluetooth modem sleep.
External 32kHz crystal as RTC clock, has good accuracy and can support both DFS and light sleep for Bluetooth modem sleep. Currently there is another hardware issue of External 32kHz crystal but it is supposed to be resolved in later chip version.
Other RTC clock sources, such as internal 150kHz oscillator or internal 8.5MHz oscillator, divided by 256 (8MD256 for short), do not provide enough accuracy as required by Bluetooth specification(worst-case BLE SCA is +/-500ppm, worst-case accuracy for Classic Bluetooth Low Power Oscillator(LPO) is +/-250ppm).

This patch resolves the issue that Bluetooth modem sleep is not allowed to work with light sleep with external 32kHz crystal. In this case a menuconfig option is provided to set the BLE SCA used to estimate RX window widening during connection events.

User guide

To use bluetooth modem sleep with light sleep, please follow the below instructions.

ESP-IDF menuconfig options:

  1. Enable Power Management:
    menuconfig ---> Component config ---> Power management --->
    [*] Support for power management

  2. Enable Tickless Idle:
    menuconfig ---> Component config ---> FreeRTOS --->
    [*] Tickless idle support
    (3) Minimum number of ticks to enter sleep mode for (NEW)

Note: Tickless idle needs to be enabled to allow automatic light sleep. FreeRTOS will enter light sleep if no tasks need to run
for 3(by default) ticks, that is 30ms if tick rate is 100Hz. Configure the FreeRTOS tick rate to be higher if you want to allow
shorter duration light sleep, for example:
menuconfig ---> Component config ---> FreeRTOS ->
(1000) Tick rate (Hz)

  1. Configure external 32.768Hz crystal as RTC clock source:
    menuconfig ---> Component config ---> ESP32-specific --->
    RTC clock source (External 32kHz crystal)
    [*] Additional current for external 32kHz crystal

Note that the "additional current" option is a workaround for a hardware issue on ESP32 that the crystal can fail in oscillating.
Please enable this option when you use external 32kHz crystal. This hardware issue will be resolved in the next ECO chip.

  1. Enable Bluetooth modem sleep with external 32.768kHz crystal as low power clock:
    menuconfig ---> Component config ---> Bluetooth ---> Bluetooth controller ---> MODEM SLEEP Options --->
    [*] Bluetooth modem sleep
    Bluetooth Modem sleep mode (ORIG mode(sleep with low power clock))
    Bluetooth low power clock (External 32kHz crystal)

Enable light sleep by calling power management API in application:

  1. In your application source code, to enable automatic light sleep, use power management API esp_pm_configure like this:
#include "esp_err.h"
#include "esp_pm.h"

    esp_pm_config_esp32_t pm_config = {
        .max_freq_mhz = EXAMPLE_MAX_CPU_FREQ_MHZ, // e.g. 80, 160, 240
        .min_freq_mhz = EXAMPLE_MIN_CPU_FREQ_MHZ, // e.g. 40
        .light_sleep_enable = true, // enable light sleep
    };
    ESP_ERROR_CHECK( esp_pm_configure(&pm_config) );

Test result

Below are some power consumption statistics on typical BLE use scenario:

  • MAX cpu frequency = 240MHz
    ADV(adv_interval = 1000.0ms) average current 3.05mA, max 149.34mA, min 0.71mA
    SCAN(scan_wiONndow = 500.0ms, scan_interval = 1000.0ms) average current 59.57mA, max 170.26mA, min 0.93mA
    CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.07mA, max 152.28mA, min 0.81mA

  • MAX cpu frequency = 160MHz
    ADV(adv_interval = 1000.0ms) average current 2.51mA, max 139.34mA, min 0.78mA
    SCAN(scan_window = 500.0ms, scan_interval = 1000.0ms) average current 50.37mA, max 134.85mA, min 1.08mA
    CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.05mA, max 121.69mA, min 1.11mA

  • MAX cpu frequency = 80MHz
    ADV(adv_interval = 1000.0ms) average current 2.55mA, max 114.81mA, min 0.79mA
    SCAN(scan_window = 500.0ms, scan_interval = 1000.0ms) average current 49.05mA, max 123.80mA, min 0.85mA
    CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.11mA, max 106.01mA, min 0.94mA

@chegewara
Copy link
Contributor

chegewara commented Jun 10, 2019

Hi @mywang-espressif
thanks for sharing this test results, good to know ble can finally works with light sleep.

Could you confirm some values? From what i see in some cases with MAX cpu frequency = 80MHz there is higher current draw than with MAX cpu frequency = 160MHz.
Also strange to me is this:

CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.05mA, max 121.69mA, min 1.11mA

VS

CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.11mA, max 106.01mA, min 0.94mA

Min and max values are lower, but average current draw is higher with 80MHz.

Anyway thanks for new feature and comprehensive update about it.

PS only what is missing is comparison with current draw without light sleep enabled.

@clleeIngenio
Copy link

After applying the modem sleep mode for BLE under light sleep, some of the chips keep reset and not working.
I m using ESP32s3 with some BLE & HID applications. What will be the possible problem (e.g. watch dog)?
Thanks for giving me a hand!

@xiongweichao
Copy link
Collaborator

Hi @clleeIngenio ,

Could you please provide the following information?

  1. log
  2. sdkconfig
  3. idf commit id

Thanks

@Paramesh19
Copy link

hi i am using esp32-c3 devkitC for BLE mesh application, initially it is consuming 90milli amps current ,even after adding external 32khz crystal for RTC Clock and modem sleep the current consumption is same ,is there anything i am doing wrong, kindly help me with this Thank you.

@xiongweichao
Copy link
Collaborator

xiongweichao commented Mar 27, 2023

Hi, a commit on optimization of Bluetooth power consumption was merged into ESP-IDF recently. The merge commit is(git describe --tag): v4.0-dev-684-gb859584. An external 32.768kHz crystal is required to take advantage of this feature.

Here is the description for this commit and a brief manual.

Feature: Bluetooth modem sleep with external 32.768kHz xtal under light sleep

Overview

Bluetooth modem sleep could work under DFS but could not work under light sleep in previous implementation, which is largely due to the sleep clock source. Sleep clock must provide enough accuracy for BLE to maintain time during sleep.

Main crystal is supposed to be powered down during light sleep. It can support DFS but not light sleep for Bluetooth modem sleep.
External 32kHz crystal as RTC clock, has good accuracy and can support both DFS and light sleep for Bluetooth modem sleep. Currently there is another hardware issue of External 32kHz crystal but it is supposed to be resolved in later chip version.
Other RTC clock sources, such as internal 150kHz oscillator or internal 8.5MHz oscillator, divided by 256 (8MD256 for short), do not provide enough accuracy as required by Bluetooth specification(worst-case BLE SCA is +/-500ppm, worst-case accuracy for Classic Bluetooth Low Power Oscillator(LPO) is +/-250ppm).

This patch resolves the issue that Bluetooth modem sleep is not allowed to work with light sleep with external 32kHz crystal. In this case a menuconfig option is provided to set the BLE SCA used to estimate RX window widening during connection events.

User guide

To use bluetooth modem sleep with light sleep, please follow the below instructions.

ESP-IDF menuconfig options:

1. Enable Power Management:
   menuconfig ---> Component config ---> Power management --->
   [*] Support for power management

2. Enable Tickless Idle:
   menuconfig ---> Component config ---> FreeRTOS --->
   [*] Tickless idle support
   (3)     Minimum number of ticks to enter sleep mode for (NEW)

Note: Tickless idle needs to be enabled to allow automatic light sleep. FreeRTOS will enter light sleep if no tasks need to run for 3(by default) ticks, that is 30ms if tick rate is 100Hz. Configure the FreeRTOS tick rate to be higher if you want to allow shorter duration light sleep, for example: menuconfig ---> Component config ---> FreeRTOS -> (1000) Tick rate (Hz)

3. Configure external 32.768Hz crystal as RTC clock source:
   menuconfig ---> Component config ---> ESP32-specific --->
   RTC clock source (External 32kHz crystal)
   [*] Additional current for external 32kHz crystal

Note that the "additional current" option is a workaround for a hardware issue on ESP32 that the crystal can fail in oscillating. Please enable this option when you use external 32kHz crystal. This hardware issue will be resolved in the next ECO chip.

4. Enable Bluetooth modem sleep with external 32.768kHz crystal as low power clock:
   menuconfig ---> Component config ---> Bluetooth ---> Bluetooth controller ---> MODEM SLEEP Options --->
   [*] Bluetooth modem sleep
   Bluetooth Modem sleep mode (ORIG mode(sleep with low power clock))
   Bluetooth low power clock (External 32kHz crystal)

Enable light sleep by calling power management API in application:

1. In your application source code, to enable automatic light sleep, use power management API `esp_pm_configure` like this:
#include "esp_err.h"
#include "esp_pm.h"

    esp_pm_config_esp32_t pm_config = {
        .max_freq_mhz = EXAMPLE_MAX_CPU_FREQ_MHZ, // e.g. 80, 160, 240
        .min_freq_mhz = EXAMPLE_MIN_CPU_FREQ_MHZ, // e.g. 40
        .light_sleep_enable = true, // enable light sleep
    };
    ESP_ERROR_CHECK( esp_pm_configure(&pm_config) );

Test result

Below are some power consumption statistics on typical BLE use scenario:

* MAX cpu frequency = 240MHz
  ADV(adv_interval = 1000.0ms) average current 3.05mA, max 149.34mA, min 0.71mA
  SCAN(scan_wiONndow = 500.0ms, scan_interval = 1000.0ms) average current 59.57mA, max 170.26mA, min 0.93mA
  CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.07mA, max 152.28mA, min 0.81mA

* MAX cpu frequency = 160MHz
  ADV(adv_interval = 1000.0ms) average current 2.51mA, max 139.34mA, min 0.78mA
  SCAN(scan_window = 500.0ms, scan_interval = 1000.0ms) average current 50.37mA, max 134.85mA, min 1.08mA
  CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.05mA, max 121.69mA, min 1.11mA

* MAX cpu frequency = 80MHz
  ADV(adv_interval = 1000.0ms) average current 2.55mA, max 114.81mA, min 0.79mA
  SCAN(scan_window = 500.0ms, scan_interval = 1000.0ms) average current 49.05mA, max 123.80mA, min 0.85mA
  CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.11mA, max 106.01mA, min 0.94mA

Hi @Paramesh19 ,

Please take a look at this user guide.

If the problem still exists, please provide the log and sdkconfig.

Thanks

@Paramesh19
Copy link

Paramesh19 commented Mar 27, 2023

@xiongweichao I have done the same configurations which you mentioned above for BLE Mesh on-off server example the consumption was same,(Without external crystal-83mAmps,With external crystal 83m Amps ) No change in the current consumption, I am attaching the SDK Config file and log file Kindly help me with this, Thank you....

sdkconfig.txt
New Text Document (3).txt
And I am also facing issue with Friend and low power node functionality

@xiongweichao
Copy link
Collaborator

xiongweichao commented Mar 27, 2023

Hi @Paramesh19

You may need to add this code to your project.

#include "esp_pm.h"

#if CONFIG_PM_ENABLE
    // Configure dynamic frequency scaling:
    // maximum and minimum frequencies are set in sdkconfig,
    // automatic light sleep is enabled if tickless idle support is enabled.
    // esp_pm_config_esp32c3_t pm_config = { // old version
    esp_pm_config_t pm_config = {
            .max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ, //  e.g. 80, 160,
            .min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ, // 40
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
            .light_sleep_enable = true
#endif
    };
    ESP_ERROR_CHECK( esp_pm_configure(&pm_config) );
#endif // CONFIG_PM_ENABLE

Thanks

@Paramesh19
Copy link

Hai,
I have included the above pm_eable configuration code in my ble mesh generic on-off server code. and made the configurations as mentioned, but still i didn't see any reduction in power, I am using esp32-c3 dev kit with esp-idf v-5.0.1 toolchain and i directly connected the external 32.768khz crystal at GPIO 0 and GPIO 1(didn't added any capacitors ),here i am attaching the sdk and log and C file ,kindly help me with this...
on-off server with external crystal log.txt
sdk.txt

@xiongweichao
Copy link
Collaborator

Hi @Paramesh19 ,

Since the SCAN_INTERVAL is too small, it cannot enter sleep mode.

Thanks

@Paramesh19
Copy link

Paramesh19 commented Mar 28, 2023

@xiongweichao Hi, i think i am not using scanning parameter in my main code ,even though i have increased it to (0x70)(initially 0x20)but no improvement, how much should i put to enter into sleep mode....
help me with this ,
thank you

@xiongweichao
Copy link
Collaborator

Hi @Paramesh19 ,

This is the result of my test (scan interval = 0x70).
scan_interval_0x70

Please try using this sdkconfig. sdkconfig.txt

By the way, this is just for testing, I don't recommend you modify the scan interval in your project. For BLE MESH issues, you can create a new issue.

Thanks

@Paramesh19
Copy link

@xiongweichao Sorry for disturbing you ,but i am really stressed with this, I need to know which tool or hardware you are using to measure current ,(In which tool you are getting these logs)....
Thank you in advance..

@javierfileiv
Copy link

Seems like a Saleae

@someburner
Copy link
Contributor

OTII arc is the best

@dashkova
Copy link

dashkova commented Jul 13, 2023

Hi!
I use nimble with these settings:

CONFIG_IDF_TARGET="esp32c3"
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
CONFIG_ESPTOOLPY_FLASHSIZE="4MB"
CONFIG_BT_ENABLED=y
CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y
CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n
CONFIG_BTDM_CTRL_MODE_BTDM=n
CONFIG_BT_BLUEDROID_ENABLED=n
CONFIG_BT_NIMBLE_ENABLED=y
CONFIG_BT_CTRL_MODEM_SLEEP=y
CONFIG_BT_CTRL_MODEM_SLEEP_MODE_1=y
CONFIG_BT_CTRL_LPCLK_SEL_MAIN_XTAL=y
CONFIG_BT_CTRL_MAIN_XTAL_PU_DURING_LIGHT_SLEEP=y
CONFIG_ESP_PHY_MAC_BB_PD=y
CONFIG_PM_ENABLE=y
CONFIG_FREERTOS_USE_TICKLESS_IDLE=y
CONFIG_FREERTOS_HZ=1000
CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP=3

Clock - main 40MHz. Role - peripheral device.

Problem: advertising stops after 20 - 60 minutes. All other tasks work and high current consumption.

The following checks do not indicate a cause:

if (ble_gap_adv_active() == 0)
        {
            ESP_LOGE("ADVENTURE", "adventure complete");
        }
if (ble_hs_synced() == 0)
        {
            ESP_LOGE("SYNCHRONIZATION", "the host and controller are out of sync");
        }
if (ble_hs_is_enabled() == 0)
        {
            ESP_LOGE("HOST", "the host is disabled");
        }

If you make a function call with another task:

rc = ble_gap_adv_stop();   // <--- code execution stops here 
 ESP_LOGI("RESTART", "return ble gap adv stop = %d", rc);

monitor does not display result of ESP_LOGI()

If connect (smartphones or pc) or disable light sleep:

esp_pm_config_t pm_config = {
.max_freq_mhz = 160,
.min_freq_mhz = 40,
.light_sleep_enable = false
};

it works.

How to find the reason for stopping advertising?

@xiongweichao
Copy link
Collaborator

Hi @dashkova ,

  1. May I ask if you only use bluetooth?
  2. Could you please provide the idf commit id?

Thanks

@dashkova
Copy link

dashkova commented Jul 13, 2023

Hi!

May I ask if you only use bluetooth?

BLE only.

Could you please provide the idf commit id?

 git log --name-status HEAD^..HEAD
commit 17d6768e65b6e8d8ef040e20d888bd6d573bc3cb (HEAD -> master, origin/master, origin/HEAD)
Merge: 0de9dab5bb 101e6a18eb
Author: Armando (Dou Yiwen) <douyiwen@espressif.com>
Date:   Wed Jun 14 10:16:44 2023 +0800

    Merge branch 'feature/add_target_esp32p4' into 'master'

    esp32p4: introduce the target

    See merge request espressif/esp-idf!24155

commit 101e6a18ebf62d0a6e76f38e41c899dc67c3e194
Author: Armando <douyiwen@espressif.com>
Date:   Fri Jun 9 20:31:22 2023 +0800

    esp32p4: introduce the target

    Add esp32p4 target to tools and Kconfig
    Create directories and files that are essential for `idf.py --preview set-target esp32p4`

In debug mode:

I (600672) NimBLE: GAP procedure initiated: stop advertising.

D (600676) NimBLE: ble_hs_hci_cmd_send: ogf=0x08 ocf=0x000a len=1

D (600682) NimBLE: 0x0a 
D (600684) NimBLE: 0x20 
D (600687) NimBLE: 0x01 
D (600690) NimBLE: 0x00 
D (600692) NimBLE: 

@xiongweichao
Copy link
Collaborator

Hi @dashkova ,

Sorry, I didn't reproduce this issue. May I ask you are using power_save example?

I think you can add some debug information here.

Thanks

@dashkova
Copy link

Hi!

If you add:

void SPI_Init(void)
{
    spi_device_interface_config_t devcfg = {
        .clock_speed_hz = 6600000,
        .mode = 0,
        .queue_size = 7,
    };

    spi_bus_config_t buscfg = {
        .mosi_io_num = MOSI_IO_NUM,
        .sclk_io_num = SCLK_IO_NUM,
        .max_transfer_sz = 40,
    };

    spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_DISABLED);
    spi_bus_add_device(SPI2_HOST, &devcfg, &spi_handle);
}


void app_main(void)
{
/* ......   */;
SPI_Init();
}

SPI is not used, but the advertising is interrupted.

@dashkova
Copy link

May I ask you are using power_save example?

Yes, this is the basis of my code.

@xiongweichao
Copy link
Collaborator

Hi @dashkova ,

I used the following code to test and did not reproduce the problem. May I ask if you have other modifications?

#define MOSI_IO_NUM          11
#define SCLK_IO_NUM          12
spi_device_handle_t spi_handle;

void SPI_Init(void)
{
    spi_device_interface_config_t devcfg = {
        .clock_speed_hz = 6600000,
        .mode = 0,
        .queue_size = 7,
    };

    spi_bus_config_t buscfg = {
        .mosi_io_num = MOSI_IO_NUM,
        .sclk_io_num = SCLK_IO_NUM,
        .max_transfer_sz = 40,
    };

    spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_DISABLED);
    spi_bus_add_device(SPI2_HOST, &devcfg, &spi_handle);
}

void app_main(void)
{
/* ......   */;
SPI_Init();
}

Thanks

@dashkova
Copy link

dashkova commented Aug 9, 2023

Hi!

May I ask if you have other modifications?

I added:

#define ADVENTURE_INTERVAL_MIN 3000
#define ADVENTURE_INTERVAL_MAX 3100

    struct ble_gap_adv_params adv_params;
/*
 Other code
*/
    adv_params.itvl_min = ADVENTURE_INTERVAL_MIN;
    adv_params.itvl_max = ADVENTURE_INTERVAL_MAX;

If the intervals are lower (ex. 2500, 2600), then it works.

@xiongweichao
Copy link
Collaborator

@dashkova If you disable modem sleep, will this problem still exist?

@dashkova
Copy link

dashkova commented Aug 29, 2023

if disable light sleep, it works.

esp_pm_config_t pm_config = {
.max_freq_mhz = 160,
.min_freq_mhz = 40,
.light_sleep_enable = false
};

24 hours and more - no problem.

@xiongweichao
Copy link
Collaborator

@dashkova You can try increasing this value.

@S5NC
Copy link

S5NC commented Nov 4, 2023

Hello, is it possible to have the ESP32-S3 powered on (in this state it draws ~40 mA), with Wi-Fi off, but BLE on advertising or waiting for a connection in this low power state? I do not mind using the internal XTAL, as the ESP32-S3 is already on. Currently an average power consumption of 100 mA is recorded when sending advertisement packets every 65 ms.

How much more power (above the 40 mA base) would be consumed if the ESP32-S3 would listen out for a BLE advertisement in this lower power BLE state?

@xiongweichao
Copy link
Collaborator

@S5NC May I ask if you enable this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests