This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Can't put Adafruit NRF52 Feather board into Low Power

I've been working with an Adafruit NRF52 Feather board for the last week, and have been struggling to get the board to go into a low power mode. At the moment, I am working within the Arduino IDE. Typically the board draws about 14mA just sitting in an idle loop. I have been able to reduce this usage to about 7mA, but this is not nearly enough for our needs, nor does it align with the expected power draw according to the nordic documentation.

I am using the BSP provided by Adafruit for the NRF52 Feather.

Based on the post here: forums.adafruit.com/viewtopic.php I should be able to put the device into a low power mode using the low level API.

Based on this issue for the BSP, it seems that low power isn't implemented.. github.com/.../51

I've tried the following:

void loop() {
    sd_power_mode_set(NRF_POWER_MODE_LOWPWR);
    waitForEvent();
}

Leads to a constant power draw of 14mA.

void loop() {
   __WFE();
   sd_power_mode_set(NRF_POWER_MODE_LOWPWR);
   sd_app_evt_wait();
}

Also has a constant power draw of 14mA.

void loop() {
    sd_power_mode_set(NRF_POWER_MODE_LOWPWR);
    __WFE();
}

Will draw about 15mA.

void loop() {
    sd_power_mode_set(NRF_POWER_MODE_LOWPWR);
    __WFI();
}

Draws about 6-7mA.

void loop() {
    __WFI();
}

Just the wait for interrupt call has virtually identical power draw, 6-7mA.

void loop() {
    NRF_POWER->SYSTEMOFF = 1;
}

Draws about 6-7mA, despite being the lowest power saving mode.

I've also tried explicitly turning off hardware in setup, and the main loop with the following. It has no influence on the power drawn.

    NRF_UARTE0->ENABLE = 0;  //disable UART
    NRF_SAADC ->ENABLE = 0; //disable ADC
    NRF_PWM0  ->ENABLE = 0; //disable all pwm instance
    NRF_PWM1  ->ENABLE = 0;
    NRF_PWM2  ->ENABLE = 0;
    NRF_TWIM1 ->ENABLE = 0; //disable TWI Master
    NRF_TWIS1 ->ENABLE = 0; //disable TWI Slave

    NRF_SPI0 -> ENABLE = 0; //disable SPI
    NRF_SPI1 -> ENABLE = 0; //disable SPI
    NRF_SPI2 -> ENABLE = 0; //disable SPI

    NRF_NFCT->TASKS_DISABLE = 1; //disable NFC, confirm this is the right way

I was thinking perhaps this could be due to the board sitting in a debug mode, but triggering a reset via the hardware switch, and by shorting the reset pin, has no effect on current drawn.

I attempted porting the ArduinoLowPower library (which supports the arduino Primo but not the feather) without success (missing dependencies, maybe from the sdk, I'm a bit lost there).

I'm feeling lost and confused. Can anybody give me some guidance? There is a USB/TTL bridge on the board that draws 17mA at peak according to its datasheet, and 100uA when suspended. LEDs are off. The only other hardware on the board is some simple reset and charging circuitry.

EDIT: Here is a hex file of a 6mA instance: 6mA.hex

Here is a hex file of a 14mA instance: 14mA.hex

Related