Beware that this post is related to an SDK in maintenance mode
More Info: Consider nRF Connect SDK for new designs
This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Changing advertising modes from IDLE to FAST SDK V15.0

I am migrating from SDK v14.2.0 to v15.0.0 and from S132 to S112 (v6) using the NRF52810. I have mostly everything migrated, but a functionality that worked before does not seem to behave correctly now and have not been able to find the root cause.

I am using a whitelist, but if there are no peers, the device is started with:

ble_advertising_start(&m_advertising, BLE_ADV_MODE_IDLE);

and then after a user button press, the device will then switch to advertising without a whitelist:

    ret_code_t err_code;
    
    m_advertising.adv_mode_current = BLE_ADV_MODE_FAST;
    m_advertising.adv_modes_config.ble_adv_fast_timeout = APP_ADV_NOWHITELEST_TIMEOUT_IN_SECONDS;
    
    err_code = ble_advertising_restart_without_whitelist(&m_advertising);
    if (err_code != NRF_ERROR_INVALID_STATE)
    {
        APP_ERROR_CHECK(err_code);
    }

but that results in an error code 7 (NRF_ERROR_INVALID_PARAM).

If the device starts out in BLE_ADV_MODE_FAST, instead of BLE_ADV_MODE_IDLE, calling ble_advertising_restart_without_whitelist(), returns correctly.

Any suggestions?

Thank you.

  • FormerMember
    0 FormerMember in reply to amorgan

    It  should not be necessary to comment out flags_set.

    When the advertising mode is BLE_ADV_MODE_FAST, could you upload a snippet of the current advertising parameters, like then one I have added below?

    (I have tested a simple example going from BLE_ADV_MODE_IDLE to BLE_ADV_MODE_FAST and that works. I think it's hard to see just from the code what is wrong, when the problem is invalid parameters, it is better to see what the parameters are.)

  • The file main.c I linked duplicates the issue, which occurs when it is in idle then ble_advertising_restart_without_whitelist is called to switch to fast mode. Would you be able to evaluate this?

    I will send the results of your request when i get back in the office.

  • FormerMember
    0 FormerMember in reply to amorgan

    I cannot see directly from the main.c what is causing the issue. When you have the failing and working parameters avaiable, please upload them here.

  • Sorry for the delay, Attached are the before and after. Note I get the error when ble_advertising_restart_without_whitelist calls flags_set.

    Before update m_advertising coming from IDLE:

    Before updating

    Before ble_advertising_restart_without_whitelist calls flags_set:

    Before flags_set

    After flags_set returns Error (0x07):

    After flags_set

    LLet me know if this helps.

    TThank you.

  • static void sleep_mode_enter(void)
    {
        ret_code_t err_code;
        
        m_advertising.adv_mode_current = BLE_ADV_MODE_FAST;
        m_advertising.adv_params.duration = 10000;
        m_advertising.adv_params.interval = APP_ADV_INTERVAL;
    
        err_code = ble_advertising_restart_without_whitelist(&m_advertising);
        if (err_code != NRF_ERROR_INVALID_STATE)
        {
            APP_ERROR_CHECK(err_code);
        }
    }

    Hi amorgan, try the code above instead. You were setting configs that are only being read during ble_advertising_init().

    On a related note, if you are not using whitelist, you should never have to call ble_advertising_restart...

    instead you can just call ble_advertising_start(&m_advertising,APP_ADV_MODE_FAST) when you get the idle event.

    Good luck!

Related