xmpl_trx_tx.c - Transmitting Frames

The next example shows, how a frame is transmitted.

/* $Id: pgXmplTrxTx.html,v 1.1.1.4 2013/04/09 21:11:49 awachtler Exp $ */
/* Example for transmitting frames */

#include "board.h"
#include "transceiver.h"
#include "ioutil.h"
#include "xmpl.h"


static volatile bool tx_in_progress;
static volatile uint8_t tx_cnt;

int main(void)
{
trx_regval_t rval;
uint8_t txfrm[] = {1,0, /* faked ieee 802.15.4 data frame control field
                         * this is just needed, that a sniffer has to display something.*/
                   42,  /* sequence counter, updated by software */
                  'h','e','l','l','o',' ','┬Á','r','a','c','o','l','i','!', /* data */
                  'X','X' /* these bytes are overwritten from transceivers CRC generator just before sent. */
                  };
    /* This will stop the application before initializing the radio transceiver
     * (ISP issue with MISO pin, see FAQ)
     */
    trap_if_key_pressed();

    /* Step 0: init MCU peripherals */
    LED_INIT();
    trx_io_init(SPI_RATE_1_2);
    LED_SET_VALUE(LED_MAX_VALUE);
    LED_SET_VALUE(0);

    /* Step 1: initialize the transceiver */
    DELAY_US(TRX_INIT_TIME_US);
    TRX_RESET_LOW();
    TRX_SLPTR_LOW();
    DELAY_US(TRX_RESET_TIME_US);
    TRX_RESET_HIGH();
    trx_reg_write(RG_TRX_STATE,CMD_TRX_OFF);
    DELAY_US(TRX_INIT_TIME_US);
    rval = trx_bit_read(SR_TRX_STATUS);
    ERR_CHECK_DIAG(TRX_OFF!=rval,1);
    LED_SET_VALUE(1);

    /* Step 2: setup transmitter
     * - configure radio channel
     * - enable transmitters automatic crc16 generation
     * - go into TX state,
     * - enable "transmit end" IRQ
     */
    trx_bit_write(SR_CHANNEL,CHANNEL);
    trx_bit_write(SR_TX_AUTO_CRC_ON,1);
    trx_reg_write(RG_TRX_STATE,CMD_PLL_ON);
#if defined(TRX_IRQ_TRX_END)
    trx_reg_write(RG_IRQ_MASK,TRX_IRQ_TRX_END);
#elif defined(TRX_IRQ_TX_END)
    trx_reg_write(RG_IRQ_MASK,TRX_IRQ_TX_END);
#else
#  error "Unknown IRQ bits"
#endif
    sei();
    LED_SET_VALUE(2);

    /* Step 3: send a frame each 500ms */
    tx_cnt = 0;
    tx_in_progress = false;
    LED_SET_VALUE(0);

    while(1)
    {
        WAIT500MS();
        if (tx_in_progress == false)
        {
            txfrm[2] = tx_cnt;
            trx_frame_write (sizeof(txfrm), txfrm);
            tx_in_progress = true;
            TRX_SLPTR_HIGH();
            TRX_SLPTR_LOW();
            LED_SET(1);
            LED_TOGGLE(0);
        }
    }
}

#if defined(TRX_IF_RFA1)
ISR(TRX24_TX_END_vect)
{
    /* transmission completed */
    tx_in_progress = false;
    tx_cnt ++;
    LED_CLR(1);
}
#else  /* !RFA1 */
ISR(TRX_IRQ_vect)
{
static volatile trx_regval_t irq_cause;
    irq_cause = trx_reg_read(RG_IRQ_STATUS);
    if (irq_cause & TRX_IRQ_TRX_END)
    {
        /* transmission completed */
        tx_in_progress = false;
        tx_cnt ++;
        LED_CLR(1);
    }
}
#endif

/* EOF */


This documentation for µracoli was generated on Tue Apr 9 2013 by  doxygen 1.7.1