In System On IDLE mode , Module itself takes 4mA . suspect core still running.

We are not using system off mode. since we not using external rtc. We are using internal Real Time counter in system on idle sleep (using ksleep). 

In Basic led code , We are able to achieve 150uA in the sleep.

We including the application feature ble , wifi , adc, uart, i2c and other peripherals. After going to the sleep , we are getting 4 mA in the module itself.

We suspect one of the core engine is running in the system on idle sleep.

How to disable network core when going to the sleep and enable when we awake back.

Parents
  • Hi,

     

    Is the current consumption static, ie. always at 4 mA?

    Can you share a dynamic current plot of the issue?

     

    application feature ble , wifi , adc, uart, i2c and other peripherals.

    Are all these components placed in a sleep state when entering sleep?

     

    Kind regards,

    Håkon

  • Yes all these components are placed in the sleep state. To confirm , can you share the sample of peripheral sleep.

    we disabled net core using below function.

    nrf_reset_network_force_off(NRF_RESET_S, true);

    After that we are getting 1.4 mA in the sleep mode. We need to reduce further .  

  • Hi,

     

    1.4 mA indicates that there are peripherals requiring high speed peripheral clocks running. Are you powering down all your used interfaces, such as the UART / I2C/ QSPI etc?

     

    This can be done using CONFIG_PM_DEVICE, and here's a small snippet of such:

    /* Using the console here, you can use your chosen device like this:
     * DEVICE_DT_GET(DT_NODELABEL(uart0))
     */
    static const struct device *uart_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_console));
    
    int my_sleep_function(...) {
    	int ret = pm_device_action_run(uart_dev, PM_DEVICE_ACTION_SUSPEND);
    	if (ret < 0) {
    		printk("Failure to suspend device!\n");
    	} else {
    	    /* OK */
    	}
    	/* Add the rest of peripherals to suspend here */
    }
    
    int my_wakeup_function(...) {
        ret = pm_device_action_run(uart_dev, PM_DEVICE_ACTION_RESUME);
        /* Add error handling and additional peripherals to resume here */
    }

     

    Kind regards,

    Håkon

Reply
  • Hi,

     

    1.4 mA indicates that there are peripherals requiring high speed peripheral clocks running. Are you powering down all your used interfaces, such as the UART / I2C/ QSPI etc?

     

    This can be done using CONFIG_PM_DEVICE, and here's a small snippet of such:

    /* Using the console here, you can use your chosen device like this:
     * DEVICE_DT_GET(DT_NODELABEL(uart0))
     */
    static const struct device *uart_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_console));
    
    int my_sleep_function(...) {
    	int ret = pm_device_action_run(uart_dev, PM_DEVICE_ACTION_SUSPEND);
    	if (ret < 0) {
    		printk("Failure to suspend device!\n");
    	} else {
    	    /* OK */
    	}
    	/* Add the rest of peripherals to suspend here */
    }
    
    int my_wakeup_function(...) {
        ret = pm_device_action_run(uart_dev, PM_DEVICE_ACTION_RESUME);
        /* Add error handling and additional peripherals to resume here */
    }

     

    Kind regards,

    Håkon

Children
No Data
Related