Put BLE Mesh node in deep sleep

Hi,

We are working on BLE MESH using nRF52840. We are trying to put nRF52840 into deep sleep mode. The deep sleep current is about 210 micro Amp. Further, the current is continuously increasing approx. by 1 micro Amp after every 60 sec.

My setup:
nRF SDK ver : nRF5_SDK_17.0.2_d674dde
BLE MESH ver : nrf5_SDK_for_Mesh_v5.0.0
Hardware : BT840 based custom board

The functions used for putting the nRF52840 into deep sleep -
nrf_mesh_disable()
nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_STAY_IN_SYSOFF);

We also tried sd_power_system_off() but result are no better.

We are able to achieve deep sleep current of 500 nano Amp on same hardware, using Thread protocol. We are not sure how to achieve it using BLE Mesh.

It would be a great help if you could suggest a solution or give us a direction.

Kind Regards,
Rajendra

  • Hi Rajendra, 

    So with the same firmware do you still see the high current consumption (225uA) on the custom board ? 
    If you still see that you may want to isolate the current measurement so that it only measure the current draw on the nRF52840 chip, not anything else. I am suspecting there could be something else on the custom board drawing the current ? 

    Also did you write anything to UICR ? Have you tried to do a nrfjprog --recovery ?  There could be a chance that the UICR configuration of GPIO pins can be the issue here (reset pins and NFC pins). 

    Regarding the issue with 18.5 uA. We need to double check here to see why that happens. 

  • Hi Hung,

    Thanks for that reference, for those who continue to check this topics, this solution still works.

    I facing the same issue with ncs 2.3.0 ; when going in deep sleep, if the device was not provisioned I was able to decrease to 7uA (we have a TOF who consume around 5uA in off reset).

    But when the device was previously provisioned the current remain at 500uA  

    Adding you code line remove the issue. Here is my code for those who wondering:

    void go_system_off(){
    	int rc;
    	struct pm_state_info deep_sleep_param={PM_STATE_SOFT_OFF,0,0};
    
    
    	printk("\n%s system off\n",CONFIG_BOARD);
    
    	TOF_PowerDown();
    	dk_button_handler_remove(button_changed); //Remove handler to avoid conflict
    	
    
    	/* Configure to generate PORT event (wakeup) on button 1 press. */
    	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);
    
    	bt_mesh_prov_disable(BT_MESH_PROV_GATT | BT_MESH_PROV_ADV);
        bt_mesh_suspend();
    
    	printk("Entering system off; press BUTTON1 to restart\n");
    
    	pm_state_force(0u,&deep_sleep_param);
    
    	k_msleep(2000);
    
    	while(true){
    		/* spin to avoid fall-off behavior */
    	}
    }

Related