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
  • (2/3)

    • If there is no other SoftDevice radio activity happening then use radio_notification handler, it will wake you up exactly before and after every adv. event (typically burst of 3 Tx packets and optionally some Rx and more Tx windows if the advertisement is connectable/scannable).
    • If there is more radio activity or if you don't like radio_notification method then you can only run your separate RTC timer in APP code and act accordingly (note that advertising has mandatory jitter from BT SIG specification so each adv. interval isn't the same, only in average it should be at adv. interval period, so you need to run timer with some delay to be sure that particular event happened and be able to accept still some small chance that few intervals will be too short or too long and they will run out of your timer window...)
Reply
  • (2/3)

    • If there is no other SoftDevice radio activity happening then use radio_notification handler, it will wake you up exactly before and after every adv. event (typically burst of 3 Tx packets and optionally some Rx and more Tx windows if the advertisement is connectable/scannable).
    • If there is more radio activity or if you don't like radio_notification method then you can only run your separate RTC timer in APP code and act accordingly (note that advertising has mandatory jitter from BT SIG specification so each adv. interval isn't the same, only in average it should be at adv. interval period, so you need to run timer with some delay to be sure that particular event happened and be able to accept still some small chance that few intervals will be too short or too long and they will run out of your timer window...)
Children
No Data
Related