Hi All,
I am trying to develop a application using radio communication, so i choosed to develop a application so it can able to tx and rx. So i integrated both rx and tx part of radio code in single application. But problem is it is unable to do any rx and tx, it get hang in sending data. can any one please tell me how to do this so i can able to communicate with other nodes.
Here is my code:
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.
}
}
/**@brief Function for sending packet.
*/
void send_packet()
{
// send the packet:
NRF_RADIO->EVENTS_READY = 0U;
NRF_RADIO->TASKS_TXEN = 1;
while (NRF_RADIO->EVENTS_READY == 0U)
{
// wait
}
NRF_RADIO->EVENTS_END = 0U;
NRF_RADIO->TASKS_START = 1U;
while (NRF_RADIO->EVENTS_END == 0U)
{
// wait
}
uint32_t err_code = bsp_indication_text_set(BSP_INDICATE_SENT_OK, "The packet was sent\n\r");
APP_ERROR_CHECK(err_code);
NRF_RADIO->EVENTS_DISABLED = 0U;
// Disable radio
NRF_RADIO->TASKS_DISABLE = 1U;
while (NRF_RADIO->EVENTS_DISABLED == 0U)
{
// wait
}
}
/**@brief Function for handling bsp events.
*/
void bsp_evt_handler(bsp_event_t evt)
{
uint32_t err_code = NRF_SUCCESS;
switch (evt)
{
case BSP_EVENT_KEY_0:
/* fall through */
case BSP_EVENT_KEY_1:
/* fall through */
case BSP_EVENT_KEY_2:
/* fall through */
case BSP_EVENT_KEY_3:
/* fall through */
case BSP_EVENT_KEY_4:
/* fall through */
case BSP_EVENT_KEY_5:
/* fall through */
case BSP_EVENT_KEY_6:
/* fall through */
case BSP_EVENT_KEY_7:
// get actual button state
err_code = bsp_buttons_state_get(&packet);
APP_ERROR_CHECK(err_code);
send_packet();
printf("The contents of the package was %u\n\r", (unsigned int)packet);
break;
default:
// no implementation needed
break;
}
}
/**@brief Function for reading packet.
*/
uint32_t read_packet()
{
uint32_t result = 0;
NRF_RADIO->EVENTS_READY = 0U;
// Enable radio and wait for ready
NRF_RADIO->TASKS_RXEN = 1U;
while (NRF_RADIO->EVENTS_READY == 0U)
{
// wait
}
NRF_RADIO->EVENTS_END = 0U;
// Start listening and wait for address received event
NRF_RADIO->TASKS_START = 1U;
// Wait for end of packet or buttons state changed
while (NRF_RADIO->EVENTS_END == 0U)
{
// wait
}
if (NRF_RADIO->CRCSTATUS == 1U)
{
result = packet;
}
NRF_RADIO->EVENTS_DISABLED = 0U;
// Disable radio
NRF_RADIO->TASKS_DISABLE = 1U;
while (NRF_RADIO->EVENTS_DISABLED == 0U)
{
// wait
}
return result;
}
/** @brief Function for configuring the RTC with TICK to 100Hz and COMPARE0 to 10 sec.
*/
static void rtc_config(void)
{
NVIC_EnableIRQ(RTC0_IRQn); // Enable Interrupt for the RTC in the core.
NRF_RTC0->PRESCALER = COUNTER_PRESCALER; // Set prescaler to a TICK of RTC_FREQUENCY.
NRF_RTC0->CC[0] = COMPARE_COUNTERTIME * RTC_FREQUENCY; // Compare0 after approx COMPARE_COUNTERTIME seconds.
// Enable COMPARE0 event and COMPARE0 interrupt:
NRF_RTC0->EVTENSET = RTC_EVTENSET_COMPARE0_Msk;
NRF_RTC0->INTENSET = RTC_INTENSET_COMPARE0_Msk;
}
/** @brief: Function for handling the RTC0 interrupts.
* Triggered on TICK and COMPARE0 match.
*/
void RTC0_IRQHandler()
{
if ((NRF_RTC0->EVENTS_COMPARE[0] != 0) &&
((NRF_RTC0->INTENSET & RTC_INTENSET_COMPARE0_Msk) != 0))
{
NRF_RTC0->EVENTS_COMPARE[0] = 0;
NRF_RTC0->CC[0] = NRF_RTC0->CC[0]+(COMPARE_COUNTERTIME * RTC_FREQUENCY);
printf("n timer interrupt \n\r");
packet = 1;
// send_packet();
read_packet();
}
}
void start_timer(void)
{
NRF_TIMER2->MODE = TIMER_MODE_MODE_Timer; // Set the timer in Counter Mode
NRF_TIMER2->TASKS_CLEAR = 1; // clear the task first to be usable for later
NRF_TIMER2->PRESCALER = 6; //Set prescaler. Higher number gives slower timer. Prescaler = 0 gives 16MHz timer
NRF_TIMER2->BITMODE = TIMER_BITMODE_BITMODE_16Bit; //Set counter to 16 bit resolution
NRF_TIMER2->CC[0] = 65000; //Set value for TIMER2 compare register 0
NRF_TIMER2->CC[1] = 5; //Set value for TIMER2 compare register 1
// Enable interrupt on Timer 2, both for CC[0] and CC[1] compare match events
NRF_TIMER2->INTENSET = (TIMER_INTENSET_COMPARE0_Enabled << TIMER_INTENSET_COMPARE0_Pos) | (TIMER_INTENSET_COMPARE1_Enabled << TIMER_INTENSET_COMPARE1_Pos);
NVIC_EnableIRQ(TIMER2_IRQn);
NRF_TIMER2->TASKS_START = 1; // Start TIMER2
}
/** TIMTER2 peripheral interrupt handler. This interrupt handler is called whenever there it a TIMER2 interrupt
*/
void TIMER2_IRQHandler(void)
{
if ((NRF_TIMER2->EVENTS_COMPARE[0] != 0) && ((NRF_TIMER2->INTENSET & TIMER_INTENSET_COMPARE0_Msk) != 0))
{
NRF_TIMER2->EVENTS_COMPARE[0] = 0; //Clear compare register 0 event
printf("n timer interrupt \n\r");
packet = 1;
send_packet();
}
if ((NRF_TIMER2->EVENTS_COMPARE[1] != 0) && ((NRF_TIMER2->INTENSET & TIMER_INTENSET_COMPARE1_Msk) != 0))
{
NRF_TIMER2->EVENTS_COMPARE[1] = 0; //Clear compare register 1 event
//nrf_gpio_pin_clear(GPIO_TOGGLE_PIN); //Clear LED
}
}
/**
* @brief Function for application main entry.
* @return 0. int return type required by ANSI/ISO standard.
*/
int main(void)
{
uint32_t err_code = NRF_SUCCESS;
clock_initialization();
APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_MAX_TIMERS, APP_TIMER_OP_QUEUE_SIZE, NULL);
const app_uart_comm_params_t comm_params =
{
RX_PIN_NUMBER,
TX_PIN_NUMBER,
RTS_PIN_NUMBER,
CTS_PIN_NUMBER,
APP_UART_FLOW_CONTROL_ENABLED,
false,
UART_BAUDRATE_BAUDRATE_Baud38400
};
APP_UART_FIFO_INIT(&comm_params,
UART_RX_BUF_SIZE,
UART_TX_BUF_SIZE,
uart_error_handle,
APP_IRQ_PRIORITY_LOW,
err_code);
APP_ERROR_CHECK(err_code);
err_code = bsp_init(BSP_INIT_LED, APP_TIMER_TICKS(100, APP_TIMER_PRESCALER), NULL);
APP_ERROR_CHECK(err_code);
//RTC config
// rtc_config();
// NRF_RTC0->TASKS_START = 1;
// Set radio configuration parameters
radio_configure();
NRF_RADIO->PACKETPTR = (uint32_t)&packet;
err_code = bsp_indication_text_set(BSP_INDICATE_USER_STATE_OFF, "Wait for first packet\n\r");
APP_ERROR_CHECK(err_code);
start_timer();
while (true)
{
packet = 0;
uint32_t received = read_packet();
err_code = bsp_indication_text_set(BSP_INDICATE_RCV_OK, "Packet was received\n\r");
APP_ERROR_CHECK(err_code);
printf("The contents of the package is %u\n\r", (unsigned int)received);
}
}
please help me on this.
Regards Manjunath N N