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

Sleep Immediately after Beacon Advertisement

I'm using the following code to make the beacon sleep:

static void on_ble_evt(ble_evt_t * p_ble_evt)
{
    uint32_t        err_code;
    switch (p_ble_evt->header.evt_id)
    {
        case BLE_GAP_EVT_CONNECTED:
        {
            break;
        }
        case BLE_GAP_EVT_TIMEOUT:
        {
            if (p_ble_evt->evt.gap_evt.params.timeout.src == BLE_GAP_TIMEOUT_SRC_ADVERTISING)
            {
                sd_ble_gap_adv_stop();
                ble_fsm_set_state(Ble_Fsm_State_Idle);
            }
            break;
        }
        default:
        {
            break;
        }
    }
}

Once the state is set to idle, the nrf51 chip goes to sleep and the current draw drops to the order of uA. My only problem here is that the minimum timeout value is 1s and this means that the chip is burning power for 1s. Ideally, I would like the beacon to just advertise once and then go to sleep immediately. What is the best way to do this? Adding a synchronous delay of 5 ms? Any callback that I can use instead?

Parents
  • What do you mean by "sleep"? I assume that nRF5x chip is going to POWER ON SLEEP (wait for event/interrupt) always when nothing is running on MCU so even between adv. events. If you mean POWER OFF state then sure you can do it but no BLE activity can be running during that time, you need to manage wake-up by some external GPIO interrupt line (button or some RTC capable chip if you expect to wake-up periodically).

  • (3/3)

    Also note that you cannot run sd_ble_gap_adv_stop directly in radio_notification handler, you can only make a flag and schedule it for later. Or to be precise you can stop the adv. there but it might have consequences with wrong triggers of radio_notification handler afterwards...

    (and last note: I really believe that your hope in saving power by turning adv, off is too high: yes, it will make a difference but not more than dozens of %, you won't suddenly drop to microAmp region, that's possible only in true POWER OFF...)

Reply
  • (3/3)

    Also note that you cannot run sd_ble_gap_adv_stop directly in radio_notification handler, you can only make a flag and schedule it for later. Or to be precise you can stop the adv. there but it might have consequences with wrong triggers of radio_notification handler afterwards...

    (and last note: I really believe that your hope in saving power by turning adv, off is too high: yes, it will make a difference but not more than dozens of %, you won't suddenly drop to microAmp region, that's possible only in true POWER OFF...)

Children
No Data
Related