I am using nRF5 SDK v15.0.0 and an nRF52840 with the S140 SoftDevice (6.0.0). I have an application that works using a custom protocol with the nRF radio. Recently I added BLE functionality and switching to it works flawlessly, but when I attempt to disable the SoftDevice and switch back to the original wireless protocol, the radio doesn't work anymore. Specifically, the RADIO_IRQHandler is never called. Below I included most of the functions I use. Basically I start by enabling the radio, confirming it receives data, then I enable and disable BLE mode (which should re-enable the radio without the BLE stack).
void nrf_mode_init(void)
{
NRF_RADIO->FREQUENCY = 0;
NRF_RADIO->TXPOWER = (RADIO_TXPOWER_TXPOWER_Pos8dBm << RADIO_TXPOWER_TXPOWER_Pos);
// I have a custom function here, setting PCNF0, PCNF1, CRCCNF, CRCINIT, CRCPOLY, MODE, INTENSET, and SHORTS
}
void nrf_mode_reset(void)
{
NVIC_DisableIRQ(RADIO_IRQn);
NRF_RADIO->EVENTS_DISABLED = 0U;
NRF_RADIO->TASKS_DISABLE = 1;
NRF_RADIO->EVENTS_END = 0U;
NRF_RADIO->TXPOWER = (RADIO_TXPOWER_TXPOWER_Pos8dBm << RADIO_TXPOWER_TXPOWER_Pos);
}
void nrf_mode_enable_rx(void)
{
NRF_RADIO->PACKETPTR = (uint32_t) &rx_packet;
NVIC_ClearPendingIRQ(RADIO_IRQn);
NVIC_EnableIRQ(RADIO_IRQn);
NRF_RADIO->TASKS_RXEN = 1;
}
void ble_mode_init(void)
{
nrf_mode_reset();
ble_stack_init();
gap_params_init();
gatt_init();
services_init();
advertising_init();
conn_params_init();
advertising_start();
}
void ble_mode_disable(void)
{
uint32_t err_code = nrf_sdh_disable_request();
while(nrf_sdh_is_enabled()); // placeholder, confirmed SD is disabled in primary code before enabling nrf mode
nrf_mode_init();
nrf_mode_reset();
nrf_mode_enable_rx();
}
Is there anything else I should be doing to fully disable the SoftDevice and to allow the RF mode to work properly?