/** * @brief Main function of the Wireless UART application */ int main(void) { /* Initialize the TAL layer */ if (tal_init() != MAC_SUCCESS) { // something went wrong during initialization pal_alert(); } /* Calibrate MCU's RC oscillator */ pal_calibrate_rc_osc(); /* Initialize LEDs */ pal_led_init(); pal_led(LED_START, LED_ON); // indicating application is started pal_led(LED_DATA_RX, LED_OFF); // indicating data reception pal_led(LED_DATA_TX, LED_OFF); // indicating successfull data transmission /* * The stack is initialized above, hence the global interrupts are enabled * here. */ pal_global_irq_enable(); /* Initialize the serial interface used for communication with terminal program */ if (pal_sio_init(SIO_CHANNEL) != MAC_SUCCESS) { // something went wrong during initialization pal_alert(); } /* Configure TX frame and transceiver */ configure_frame_sending(); /* Switch receiver on */ tal_rx_enable(PHY_RX_ON); #if(SEND_BLOCKWISE==true) start_timer(); #endif /* Endless while loop */ while (1) { pal_task(); /* Handle platform specific tasks, like serial interface */ tal_task(); /* Handle transceiver specific tasks */ #if(!(SEND_BLOCKWISE==true)) app_task(); /* Application task */ #endif } }
/** * @brief Initializes the transceiver * * This function is called to initialize the transceiver. * * @return MAC_SUCCESS if the transceiver state is changed to TRX_OFF and the * current device part number and version number are correct; * FAILURE otherwise */ static retval_t trx_init(void) { tal_trx_status_t trx_status; uint8_t poll_counter = 0; PAL_RST_HIGH(); PAL_SLP_TR_LOW(); /* Wait typical time of timer TR1. */ pal_timer_delay(P_ON_TO_CLKM_AVAILABLE_TYP_US); /* Apply reset pulse */ PAL_RST_LOW(); pal_timer_delay(RST_PULSE_WIDTH_US); PAL_RST_HIGH(); #if !(defined FPGA_EMULATION) do { /* Wait not more than max. value of TR1. */ if (poll_counter == P_ON_TO_CLKM_ATTEMPTS) { return FAILURE; } /* Wait a short time interval. */ pal_timer_delay(TRX_POLL_WAIT_TIME_US); poll_counter++; /* Check if AT86RF233 is connected; omit manufacturer id check */ } while (pal_trx_reg_read(RG_PART_NUM) != PART_NUM_AT86RF233); #endif /* !defined FPGA_EMULATION */ /* Verify that TRX_OFF can be written */ pal_trx_reg_write(RG_TRX_STATE, CMD_TRX_OFF); /* Verify that the trx has reached TRX_OFF. */ poll_counter = 0; do { /* Wait a short time interval. */ pal_timer_delay(TRX_POLL_WAIT_TIME_US); trx_status = (tal_trx_status_t)pal_trx_bit_read(SR_TRX_STATUS); /* Wait not more than max. value of TR15. */ if (poll_counter == P_ON_TO_TRX_OFF_ATTEMPTS) { #if (DEBUG > 0) pal_alert(); #endif return FAILURE; } poll_counter++; } while (trx_status != TRX_OFF); tal_trx_status = TRX_OFF; return MAC_SUCCESS; }
/** * @brief Main function of the Sniffer application */ int main(void) { /* Initialize the TAL layer */ if (tal_init() != MAC_SUCCESS) { /* something went wrong during initialization*/ pal_alert(); } /* Calibrate MCU's RC oscillator */ pal_calibrate_rc_osc(); /* Initialize LEDs */ pal_led_init(); /* * The stack is initialized above, hence the global interrupts are enabled * here. */ pal_global_irq_enable(); /* Initialize the serial interface used for communication with sniffer GUI */ if (pal_sio_init(SIO_CHANNEL) != MAC_SUCCESS) { /* something went wrong during initialization */ pal_alert(); } //sio_getchar(); Wireshark_Settings = INIT_STATE ; /* Endless while loop */ while (1) { pal_task(); tal_task(); app_task(); } }
/** * @brief Reset transceiver * * @return MAC_SUCCESS if the transceiver state is changed to TRX_OFF * FAILURE otherwise */ static retval_t trx_reset(void) { tal_trx_status_t trx_status; uint8_t poll_counter = 0; #if (EXTERN_EEPROM_AVAILABLE == 1) uint8_t xtal_trim_value; #endif /* Get trim value for 16 MHz xtal; needs to be done before reset */ #if (EXTERN_EEPROM_AVAILABLE == 1) pal_ps_get(EXTERN_EEPROM, EE_XTAL_TRIM_ADDR, 1, &xtal_trim_value); #endif /* trx might sleep, so wake it up */ PAL_SLP_TR_LOW(); pal_timer_delay(SLEEP_TO_TRX_OFF_TYP_US); /* Apply reset pulse */ PAL_RST_LOW(); pal_timer_delay(RST_PULSE_WIDTH_US); PAL_RST_HIGH(); /* verify that trx has reached TRX_OFF */ do { /* Wait a short time interval. */ pal_timer_delay(TRX_POLL_WAIT_TIME_US); trx_status = (tal_trx_status_t)pal_trx_bit_read(SR_TRX_STATUS); /* Wait not more than max. value of TR2. */ if (poll_counter == SLEEP_TO_TRX_OFF_ATTEMPTS) { #if (DEBUG > 0) pal_alert(); #endif return FAILURE; } poll_counter++; } while (trx_status != TRX_OFF); tal_trx_status = TRX_OFF; // Write 16MHz xtal trim value to trx. // It's only necessary if it differs from the reset value. #if (EXTERN_EEPROM_AVAILABLE == 1) if (xtal_trim_value != 0x00) { pal_trx_bit_write(SR_XTAL_TRIM, xtal_trim_value); } #endif return MAC_SUCCESS; }
/** * @brief Main function of the Terminal Target application * @ingroup App_API */ int main(void) { /* Initialize all layers */ if (nwk_init() != NWK_SUCCESS) { /* something went wrong during initialization */ pal_alert(); } /* disable pull-ups */ MCUCR |= (1u << PUD); #ifdef FLASH_NVRAM pal_ps_set(EE_IEEE_ADDR,IEEE_ADDRESS_BYTES, &tal_pib_IeeeAddress); #endif /* Initialize LEDs. */ pal_led_init(); pal_led(LED_START, LED_ON); /* indicating application is started */ pal_led(LED_NWK_SETUP, LED_OFF); /* indicating network is started */ pal_led(LED_DATA, LED_OFF); /* indicating data reception */ /* * The stack is initialized above, hence the global interrupts are enabled * here. */ pal_global_irq_enable(); /** * @brief TWI and QT600 interface initialization */ int i; twi_master_init(); RESET_QT600_PIN_INIT(); RESET_QT600_ON(); for (i = 0; i < 100 ; i++) asm("nop"); /* Endless while loop */ while (1) { app_task(); /* Application task */ if(rf4ce_new_msg == 1) { twi_send_message(); TX_index = 0; rf4ce_new_msg = 0; } nwk_task(); /* RF4CE network layer task */ } }
/** * @brief starts a timer */ static void start_timer() { uint8_t status = pal_timer_start( TIMER_DATA_FWD, (uint32_t)1000*TIMER_INTERVAL, TIMEOUT_RELATIVE, (void*)data_fwd_cb, NULL); #if(ALERT_ON_ERROR==true) if(status != MAC_SUCCESS) { pal_alert(); } #endif }
/** * @brief Initializes the transceiver * * This function is called to initialize the transceiver. * * @return MAC_SUCCESS if the transceiver state is changed to TRX_OFF and the * current device part number and version number are correct; * FAILURE otherwise */ static retval_t trx_init(void) { tal_trx_status_t trx_status; uint8_t poll_counter = 0; /* Ensure control lines have correct levels. */ PAL_RST_HIGH(); PAL_SLP_TR_LOW(); pal_timer_delay(P_ON_TO_CLKM_AVAILABLE_TYP_US); /* Apply reset pulse */ PAL_RST_LOW(); pal_timer_delay(RST_PULSE_WIDTH_US); PAL_RST_HIGH(); /* Verify that the trx has reached TRX_OFF. */ poll_counter = 0; do { /* Wait a short time interval. */ pal_timer_delay(TRX_POLL_WAIT_TIME_US); trx_status = (tal_trx_status_t)pal_trx_bit_read(SR_TRX_STATUS); /* Wait not more than max. value of TR2. */ if (poll_counter == RESET_TO_TRX_OFF_ATTEMPTS) { #if (DEBUG > 0) pal_alert(); #endif return FAILURE; } poll_counter++; } while (trx_status != TRX_OFF); tal_trx_status = TRX_OFF; #if !defined(FPGA_EMULATION) /* Check if actually running on an ATmegaRFR2 device. */ if (ATMEGARFR2_PART_NUM != pal_trx_reg_read(RG_PART_NUM)) { return FAILURE; } #endif return MAC_SUCCESS; }
/** * \brief Reset transceiver * * \return MAC_SUCCESS if the transceiver state is changed to TRX_OFF * FAILURE otherwise */ static retval_t trx_reset(void) { tal_trx_status_t trx_status; uint8_t poll_counter = 0; /* trx might sleep, so wake it up */ TRX_SLP_TR_LOW(); pal_timer_delay(SLEEP_TO_TRX_OFF_TYP_US); /* Apply reset pulse */ TRX_RST_LOW(); pal_timer_delay(RST_PULSE_WIDTH_US); TRX_RST_HIGH(); /* verify that trx has reached TRX_OFF */ do { /* Wait a short time interval. */ pal_timer_delay(TRX_POLL_WAIT_TIME_US); trx_status = (tal_trx_status_t)trx_bit_read(SR_TRX_STATUS); /* Wait not more than max. value of TR2. */ if (poll_counter == SLEEP_TO_TRX_OFF_ATTEMPTS) { #if (_DEBUG_ > 0) pal_alert(); #endif return FAILURE; } poll_counter++; } while (trx_status != TRX_OFF); tal_trx_status = TRX_OFF; #ifdef STB_ON_SAL #if (SAL_TYPE == AT86RF2xx) stb_restart(); #endif #endif return MAC_SUCCESS; }
/** * @brief Switches the PLL on */ static void switch_pll_on(void) { trx_irq_reason_t irq_status; uint32_t start_time, now; /* Check if trx is in TRX_OFF; only from PLL_ON the following procedure is applicable */ if (pal_trx_bit_read(SR_TRX_STATUS) != TRX_OFF) { ASSERT("Switch PLL_ON failed, because trx is not in TRX_OFF" == 0); return; } IRQ_STATUS = _BV(PLL_LOCK); /* clear PLL lock bit */ /* Switch PLL on */ pal_trx_reg_write(RG_TRX_STATE, CMD_PLL_ON); /* Check if PLL has been locked. */ pal_get_current_time(&start_time); while (1) { irq_status = (trx_irq_reason_t)pal_trx_reg_read(RG_IRQ_STATUS); if (irq_status & TRX_IRQ_PLL_LOCK) { break; // PLL is locked now } /* Check if polling needs too much time. */ pal_get_current_time(&now); if (pal_sub_time_us(now, start_time) > (2 * PLL_LOCK_TIME_US)) { /* leave poll loop and throw assertion */ #if (DEBUG > 0) ASSERT("PLL switch failed" == 0); pal_alert(); #endif break; } } }
/** * @brief Callback that is called once tx is done. * * @param status Status of the transmission procedure */ void tal_tx_frame_done_cb(retval_t status) { if (status == MAC_SUCCESS) { uint8_t tx_payload_len = tx_buffer[0] - FRAME_OVERHEAD; uint8_t *tx_payload_ptr = tx_buffer + FRAME_OVERHEAD + LENGTH_FIELD_LEN - FCS_LEN; uint8_t sio_len_tx; /* Print transmitted bytes to terminal program. */ bool sio_ongoing = true; do { sio_len_tx = pal_sio_tx(SIO_CHANNEL, tx_payload_ptr, tx_payload_len); if (sio_len_tx < tx_payload_len) { tx_payload_len -= sio_len_tx; tx_payload_ptr += sio_len_tx; pal_task(); } else { sio_ongoing = false; } } while (sio_ongoing); pal_led(LED_DATA_TX, LED_TOGGLE); // indicating successfull data transmission /* After transmission is completed, allow next transmission. */ tx_state = TX_IDLE; } else if (status == MAC_CHANNEL_ACCESS_FAILURE) /* * Channel access failure is the only transmission failure that makes sense * to be handled within this application. For handling other status codes, * such as MAC_NO_ACK, this is probably the wrong application on the wrong layer. * For absolutely reliable transmission, please use a MAC or TAL based * application. The Tiny-TAL is not designed for such a purpose. * * In case of channel access failure the frame is retried. */ { /* Transmission was not successful, initiate retry. */ tx_state = TX_RETRY; //TODO: retry counter? } else /* * Other transmission status codes, such as MAC_NO_ACK are not handled * within this application. * The transmission is considered as beeing completed for this frame. */ { tx_state = TX_IDLE; #if(ALERT_ON_ERROR==true) pal_alert(); #endif } }
__interrupt void __unhandled_interrupt(void) { pal_alert(); }