Hi,
I am developing a project that includes transmission and reception in particular timeslots. I checked the radio example in nrf5 sdk and copied the trasmission part to my timeslot file. Now first transmission is happening but afer that transmission is not working. I think its getting stuck in this while loop. while (NRF_RADIO->EVENTS_DISABLED == 0U)
Please have look at the below code
nrf_radio_signal_callback_return_param_t *radio_callback(uint8_t signal_type) {
//printf("\n signal = %d",signal_type);
switch (signal_type) {
case NRF_RADIO_CALLBACK_SIGNAL_TYPE_START:
//Start of the timeslot - set up timer interrupt
signal_callback_return_param.params.request.p_next = NULL;
signal_callback_return_param.callback_action = NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE;
NRF_TIMER0->INTENSET = TIMER_INTENSET_COMPARE0_Msk;
NRF_TIMER0->CC[0] = m_slot_length - 1000;
NVIC_EnableIRQ(TIMER0_IRQn);
nrf_gpio_pin_toggle(20); //Toggle LED4
adv_flag = 1;
break;
case NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO:
signal_callback_return_param.params.request.p_next = NULL;
signal_callback_return_param.callback_action = NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE;
break;
//case NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0:
// //Timer interrupt - attempt to increase timeslot length
// signal_callback_return_param.params.extend.length_us = m_slot_length;
// signal_callback_return_param.callback_action = NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND;
// break;
//case NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_SUCCEEDED:
// //Extension succeeded, reset timer(configurations still valid since slot length is the same)
// NRF_TIMER0->TASKS_CLEAR = 1;
// break;
case NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0:
//Timer interrupt - do graceful shutdown - schedule next timeslot
configure_next_event_normal();
signal_callback_return_param.params.request.p_next = &m_timeslot_request;
signal_callback_return_param.callback_action = NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END;
adv_flag = 0;
break;
case NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_SUCCEEDED:
//No implementation needed
break;
case NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_FAILED:
//Try scheduling a new timeslot
configure_next_event_earliest();
signal_callback_return_param.params.request.p_next = &m_timeslot_request;
signal_callback_return_param.callback_action = NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END;
break;
default:
//No implementation needed
break;
}
return (&signal_callback_return_param);
}void send_packet() {
// send the packet:
NRF_RADIO->PACKETPTR = (uint32_t)&packet;
NRF_RADIO->EVENTS_READY = 0U;
NRF_RADIO->TASKS_TXEN = 1;
while (NRF_RADIO->EVENTS_READY == 0U) {
printf("hai");
// wait
}
NRF_RADIO->EVENTS_END = 0U;
NRF_RADIO->TASKS_START = 1U;
while (NRF_RADIO->EVENTS_END == 0U) {
// wait
}
uint32_t err_code = bsp_indication_set(BSP_INDICATE_SENT_OK);
NRF_LOG_INFO("The packet was sent");
APP_ERROR_CHECK(err_code);
NRF_RADIO->EVENTS_DISABLED = 0U;
// Disable radio
NRF_RADIO->TASKS_DISABLE = 1U;
while (NRF_RADIO->EVENTS_DISABLED == 0U) {
// wait
}
}void clock_initialization() {
/* Start 16 MHz crystal oscillator */
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
NRF_CLOCK->TASKS_HFCLKSTART = 1;
/* Wait for the external oscillator to start up */
while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) {
// Do nothing.
}
/* Start low frequency crystal oscillator for app_timer(used by bsp)*/
NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos);
NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
NRF_CLOCK->TASKS_LFCLKSTART = 1;
while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) {
// Do nothing.
}
}
int main(void) {
clock_initialization();
ble_stack_init();
timeslot_sd_init();
for (;;) {
// idle_state_handle();
if (adv_flag == 1) {
radio_configure();
adv_flag = 0;
packet = 4;
send_packet();
printf("\nw");
packet = 0;
NRF_LOG_FLUSH();
} else {
}
__WFE();
}