Hi guys.
Please consider the following piece of software:
/* * Copyright (c) 2018 Nordic Semiconductor ASA * * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause */ #include <zephyr/device.h> #include <zephyr/devicetree.h> #include <zephyr/drivers/clock_control.h> #include <zephyr/drivers/clock_control/nrf_clock_control.h> #include <zephyr/drivers/gpio.h> #include <zephyr/irq.h> #include <zephyr/logging/log.h> #include <nrf.h> #include <esb.h> #include <zephyr/kernel.h> #include <zephyr/types.h> #include <stdio.h> #include <zephyr/kernel.h> #include <zephyr/device.h> #include <zephyr/init.h> #include <zephyr/pm/pm.h> #include <zephyr/pm/device.h> #include <zephyr/pm/policy.h> #include <hal/nrf_gpio.h> #include <hal/nrf_gpiote.h> #include <nrfx_gpiote.h> #include <helpers/nrfx_gppi.h> LOG_MODULE_REGISTER(esb_prx, CONFIG_ESB_PRX_APP_LOG_LEVEL); static const struct gpio_dt_spec leds[] = { GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios), GPIO_DT_SPEC_GET(DT_ALIAS(led1), gpios), GPIO_DT_SPEC_GET(DT_ALIAS(led2), gpios), GPIO_DT_SPEC_GET(DT_ALIAS(led3), gpios), }; BUILD_ASSERT(DT_SAME_NODE(DT_GPIO_CTLR(DT_ALIAS(led0), gpios), DT_GPIO_CTLR(DT_ALIAS(led1), gpios)) && DT_SAME_NODE(DT_GPIO_CTLR(DT_ALIAS(led0), gpios), DT_GPIO_CTLR(DT_ALIAS(led2), gpios)) && DT_SAME_NODE(DT_GPIO_CTLR(DT_ALIAS(led0), gpios), DT_GPIO_CTLR(DT_ALIAS(led3), gpios)), "All LEDs must be on the same port"); static struct esb_payload rx_payload; static struct esb_payload tx_payload = ESB_CREATE_PAYLOAD(0, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17); void event_handler(struct esb_evt const *event) { switch (event->evt_id) { case ESB_EVENT_TX_SUCCESS: LOG_DBG("TX SUCCESS EVENT"); break; case ESB_EVENT_TX_FAILED: LOG_DBG("TX FAILED EVENT"); break; case ESB_EVENT_RX_RECEIVED: if (esb_read_rx_payload(&rx_payload) == 0) { LOG_DBG("Packet received, len %d : " "0x%02x, 0x%02x, 0x%02x, 0x%02x, " "0x%02x, 0x%02x, 0x%02x, 0x%02x", rx_payload.length, rx_payload.data[0], rx_payload.data[1], rx_payload.data[2], rx_payload.data[3], rx_payload.data[4], rx_payload.data[5], rx_payload.data[6], rx_payload.data[7]); } else { LOG_ERR("Error while reading rx packet"); } break; } } int clocks_start(void) { int err; int res; struct onoff_manager *clk_mgr; struct onoff_client clk_cli; clk_mgr = z_nrf_clock_control_get_onoff(CLOCK_CONTROL_NRF_SUBSYS_HF); if (!clk_mgr) { LOG_ERR("Unable to get the Clock manager"); return -ENXIO; } sys_notify_init_spinwait(&clk_cli.notify); err = onoff_request(clk_mgr, &clk_cli); if (err < 0) { LOG_ERR("Clock request failed: %d", err); return err; } do { err = sys_notify_fetch_result(&clk_cli.notify, &res); if (!err && res) { LOG_ERR("Clock could not be started: %d", res); return res; } } while (err); LOG_DBG("HF clock started"); return 0; } int esb_initialize(void) { int err; /* These are arbitrary default addresses. In end user products * different addresses should be used for each set of devices. */ uint8_t base_addr_0[4] = {0xE7, 0xE7, 0xE7, 0xE7}; uint8_t base_addr_1[4] = {0xC2, 0xC2, 0xC2, 0xC2}; uint8_t addr_prefix[8] = {0xE7, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8}; struct esb_config config = ESB_DEFAULT_CONFIG; config.protocol = ESB_PROTOCOL_ESB_DPL; config.bitrate = ESB_BITRATE_1MBPS; config.mode = ESB_MODE_PRX; config.event_handler = event_handler; config.selective_auto_ack = true; err = esb_init(&config); if (err) { return err; } err = esb_set_base_address_0(base_addr_0); if (err) { return err; } err = esb_set_base_address_1(base_addr_1); if (err) { return err; } err = esb_set_prefixes(addr_prefix, ARRAY_SIZE(addr_prefix)); if (err) { return err; } return 0; } static int disable_ds_1(const struct device *dev) { ARG_UNUSED(dev); pm_policy_state_lock_get(PM_STATE_SOFT_OFF, PM_ALL_SUBSTATES); return 0; } SYS_INIT(disable_ds_1, PRE_KERNEL_2, 0); void main(void) { int err; const struct device *const cons = DEVICE_DT_GET(DT_CHOSEN(zephyr_console)); LOG_INF("Enhanced ShockBurst prx sample"); pm_state_force(0u, &(struct pm_state_info){PM_STATE_SUSPEND_TO_RAM, 0, 0}); esb_initialize(); nrf_gpio_cfg_input(NRF_DT_GPIOS_TO_PSEL(DT_ALIAS(sw0), gpios), NRF_GPIO_PIN_PULLUP); nrf_gpio_cfg_sense_set(NRF_DT_GPIOS_TO_PSEL(DT_ALIAS(sw0), gpios), NRF_GPIO_PIN_SENSE_LOW); while(1) { clocks_start(); pm_device_action_run(cons, PM_DEVICE_ACTION_RESUME); esb_start_rx(); k_sleep(K_MSEC(5)); esb_stop_rx(); pm_device_action_run(cons, PM_DEVICE_ACTION_SUSPEND); NRF_CLOCK->TASKS_HFCLKSTOP = 1; k_sleep(K_MSEC(1500)); } return; }
Compiled and run on a NRF52832 DK the power consumption is ~ 30 uA. On a NRF52840 DK, power switch set to NRF_ONLY, it burns through ~ 500 uA.
Is this a DK issue or is the measurement correct?
Attached, the project files. Thank you.