This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Excessive current in System ON, Idle mode

I am seeing excessive current in System ON, Idle mode. I am using WFI(). I have verified that operation is being held at that instruction by using GPIO pin. Idle mode is exited by either the RTC or GPIOTE PORT interrupt. LOWPWR mode is enabled.

nrf_gpio_pin_clear(PIN_TESTPOINT19);

__WFI(); // Enter sleep mode until an interrupt is received. RTC/GPIOTE interrupts are enabled

nrf_gpio_pin_set(PIN_TESTPOINT19);

Scenario 1: Wake up every second, do some housekeeping, go back to sleep

Idle current: <200 uA (too low for decent measurement) Run current: ~3.5 mA

Scenario 2: Wake up every second, go into ESB receive mode for 6 ms, then go back to sleep nrf_esb_disable() is explicitly called before sleep.

Idle current: ~12 mA

Run current: ~27 mA

Tried adding NRF_RADIO->POWER = 0 after nrf_esb_disable call completes. No effect. Also tried using __SEV()/__WFE()/__WFE() instead of __WFI()

Why is the Idle Current in Scenario 2 so high? It looks like something else needs to get shut off. I have tried to power down Timer2, but that seems to kill the ESB. This might account for a few hundred microamps, but there are still several unacounted for milliamps. I have power-cycled the system, so I know that I am not in DEBUG mode. Also, the current in Scenario 1 verifies that setting.

Any suggestions?

Parents
  • Hi Scott

    Ok, that is strange. I have tried this on the ptx_ack_payload example in nRF51 SDK 9.0.0. I measure 4.5uA on my nRF51-DK board with the following code:

    int main()
    {
    		// Setup port directions
    		ui_init();
    
    		// Initialize ESB
    		(void)nrf_esb_init(NRF_ESB_MODE_PTX);
    
    		(void)nrf_esb_enable();  
    
    		// Add packet into TX queue
    		my_tx_payload[0] = input_get();
    		(void)nrf_esb_add_packet_to_tx_fifo(PIPE_NUMBER, my_tx_payload, TX_PAYLOAD_LENGTH, NRF_ESB_PACKET_USE_ACK);
    	
    		nrf_esb_disable();
    
    		while(1)
    		{
    			__SEV();
    			__WFE();
    			__WFE();
    		}
    }
    

    So I suspect one of the following reasons for this behavior:

    • You have enabled something in your code that you have not disabled again. perhaps the best way to figure out what that is is to block out sections of your code until you see the expected current consumption.
    • You have custom hardware and there is leakage current somewhere, on GPIO pins, SWD pins or somewhere else.

    Try also to go through the hints in the current consumption guide, "Measure current consumption" section

Reply
  • Hi Scott

    Ok, that is strange. I have tried this on the ptx_ack_payload example in nRF51 SDK 9.0.0. I measure 4.5uA on my nRF51-DK board with the following code:

    int main()
    {
    		// Setup port directions
    		ui_init();
    
    		// Initialize ESB
    		(void)nrf_esb_init(NRF_ESB_MODE_PTX);
    
    		(void)nrf_esb_enable();  
    
    		// Add packet into TX queue
    		my_tx_payload[0] = input_get();
    		(void)nrf_esb_add_packet_to_tx_fifo(PIPE_NUMBER, my_tx_payload, TX_PAYLOAD_LENGTH, NRF_ESB_PACKET_USE_ACK);
    	
    		nrf_esb_disable();
    
    		while(1)
    		{
    			__SEV();
    			__WFE();
    			__WFE();
    		}
    }
    

    So I suspect one of the following reasons for this behavior:

    • You have enabled something in your code that you have not disabled again. perhaps the best way to figure out what that is is to block out sections of your code until you see the expected current consumption.
    • You have custom hardware and there is leakage current somewhere, on GPIO pins, SWD pins or somewhere else.

    Try also to go through the hints in the current consumption guide, "Measure current consumption" section

Children
No Data
Related