Switching between BLE advertising and DTM

Hi there,

I'm currently trying to switch from actively advertising to a carrier wave test. This is the code snippet I'm currently debugging on SDK 17.1.0:

if (trigger_test) {
    uint32_t dtm_ret = DTM_SUCCESS;
    uint16_t power_cmd = (LE_TRANSMITTER_TEST << 14) | ((req_power & 0x3F) << 8) | (SET_TX_POWER << 2) | DTM_PKT_VENDORSPECIFIC;
    uint16_t carrier_cmd = (LE_TRANSMITTER_TEST << 14) | (CARRIER_TEST << 2) | DTM_PKT_VENDORSPECIFIC;
    uint16_t frequency = (req_freq - 2402) / 2;
    uint8_t frequency_field = frequency & 0x3F;
    carrier_cmd |= (frequency_field << 8);

    if (ble_advertisement_active) {
        sd_ble_gap_adv_stop(m_advertising.adv_handle);
    }

    if (test_active)
    {
        stop_dtm();
    } else if (ble_active) {
        NRF_LOG_INFO("Disable softdevice");
        uint32_t sd_ret = nrf_sdh_disable_request();
        if (sd_ret != NRF_SUCCESS)
        {
            NRF_LOG_INFO("Softdevice failed to disable %d", sd_ret);
            NRF_LOG_FLUSH();
        }
        while (nrf_sdh_is_enabled()) {} // Wait for SD to finish disabling
        NRF_LOG_INFO("Initialising DTM Driver");
        NRF_LOG_FLUSH();
        dtm_ret = dtm_init();
        if (dtm_ret != DTM_SUCCESS)
        {
            NRF_LOG_INFO("DTM failed to initialise %d", dtm_ret);
        }
    }

    NRF_LOG_INFO("Sending Power DTM CMD");
    NRF_LOG_FLUSH();
    dtm_ret = dtm_cmd(power_cmd);
    
    if (dtm_ret != DTM_SUCCESS)
    {
        NRF_LOG_INFO("DTM power cmd failed %d", dtm_ret);
        return;
    }
    
    NRF_LOG_INFO("Sending Carrier DTM CMD");
    NRF_LOG_FLUSH();
    dtm_ret = dtm_cmd(carrier_cmd);
    
    if (dtm_ret != DTM_SUCCESS)
    {
        NRF_LOG_INFO("DTM carrier cmd failed %d", dtm_ret);
        return;
    }

    test_active = true;
}

The code seems to be freezing when I disable the soft device. Is there anything I'm missing which is needed to switch between BLE and DTM?

Kind Regards,

Trystan

Related