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

RADIO_IRQHandler not called after power cycle

I am having a strange issue with my custom radio protocol. I have ported the code  to the 52840 and SDK15  from the nrf51822 where it is running with no issues.

The issue is that everything runs correctly when using the J-Link debugger. as soon as I disconnect the J-Link and perform a battery pull, the system will enter a boot loop. So far I have tracked it down (with LED blink signals, since it works again once I connect the debugger) to a point where the RADIO_IRQHandler is not being called after the battery pull.

The sequencs is like this (with SEGGER SES):

Debug->Run    ---> works!

pull battery and re-insert ----> bootloop

Target->Reconnect J-Link  ----> works fine after next boot!

Here is my Handler:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void RADIO_IRQHandler(void) {
LED_ON(LED_1); // LED never goes on that is how I know the IRQHandler is not called
uint8_t event = 0;
if (NRF_RADIO->EVENTS_READY) { // put each event separately in the scheduler, even if they occured simulatenously due to shorts
NRF_RADIO->EVENTS_READY = 0;
event = RADIO_EV_READY;
radio_handler(&event, sizeof(event));
}
#ifdef NRF52840_XXAA
if (NRF_RADIO->EVENTS_PHYEND) {
NRF_RADIO->EVENTS_PHYEND = 0;
event = RADIO_EV_PHYEND;
radio_handler(&event, sizeof(event));
}
#endif
if (NRF_RADIO->EVENTS_END) {
NRF_RADIO->EVENTS_END = 0;
event = RADIO_EV_END;
radio_handler(&event, sizeof(event));
}
if (NRF_RADIO->EVENTS_DISABLED) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 and this is how I enable the interrupts:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
radio_enable_irq() {
NRF_RADIO->INTENSET = RADIO_INTENSET_READY_Enabled << RADIO_INTENSET_READY_Pos |
RADIO_INTENSET_END_Enabled << RADIO_INTENSET_END_Pos |
RADIO_INTENSET_DISABLED_Enabled << RADIO_INTENSET_DISABLED_Pos |
#ifdef NRF52840_XXAA
RADIO_INTENSET_PHYEND_Enabled << RADIO_INTENSET_PHYEND_Pos |
#endif
0;
#ifdef NRF52840_XXAA
NRF_RADIO->EVENTS_PHYEND = 0;
#endif
NRF_RADIO->EVENTS_END = 0;
NRF_RADIO->EVENTS_DISABLED = 0;
NRF_RADIO->EVENTS_READY = 0;
NVIC_SetPriority(RADIO_IRQn, 1);
NVIC_ClearPendingIRQ(RADIO_IRQn);
NVIC_EnableIRQ(RADIO_IRQn);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Is there any known mechanism how the interrupts would become disabled after a battery pull? And what does the J-Link change that it works again?