at86rf231: introduce variable to keep internal driver state

The at86rf231 radio transceiver provides one IRQ (TRX_END) signaling
end of transmission or reception but no way to distinguish between
these.
This commit is contained in:
Thomas Eichinger 2014-07-17 15:42:30 +02:00
parent aaa2c2e8ba
commit d50f43e9f5
3 changed files with 38 additions and 1 deletions

View File

@ -18,6 +18,7 @@
* @brief Driver implementation for at86rf231 chip
*
* @author Alaeddine Weslati <alaeddine.weslati@inria.fr>
* @author Thomas Eichinger <thomas.eichinger@fu-berlin.de>
*
* @}
*/
@ -34,6 +35,8 @@ static uint8_t radio_channel;
static uint16_t radio_address;
static uint64_t radio_address_long;
uint8_t driver_state;
void at86rf231_init(kernel_pid_t tpid)
{
transceiver_pid = tpid;
@ -103,7 +106,18 @@ void at86rf231_switch_to_rx(void)
void at86rf231_rx_irq(void)
{
at86rf231_rx_handler();
/* check if we are in sending state */
if (driver_state == AT_DRIVER_STATE_SENDING) {
/* Read IRQ to clear it */
at86rf231_reg_read(AT86RF231_REG__IRQ_STATUS);
/* clear internal state */
driver_state = AT_DRIVER_STATE_DEFAULT;
return;
}
else {
/* handle receive */
at86rf231_rx_handler();
}
}
radio_address_t at86rf231_set_address(radio_address_t address)

View File

@ -10,7 +10,11 @@
#include "at86rf231_arch.h"
#include "at86rf231_spi.h"
#define ENABLE_DEBUG (0)
#include "debug.h"
static void at86rf231_xmit(uint8_t *data, radio_packet_length_t length);
static void at86rf231_gen_pkt(uint8_t *buf, at86rf231_packet_t *packet);
static uint8_t sequenz_nr;
@ -87,11 +91,17 @@ static void at86rf231_xmit(uint8_t *data, radio_packet_length_t length)
}
while ((status & AT86RF231_TRX_STATUS_MASK__TRX_STATUS) != AT86RF231_TRX_STATUS__PLL_ON);
/* radio driver state: sending */
/* will be freed in at86rf231_rx_irq when TRX_END interrupt occurs */
driver_state = AT_DRIVER_STATE_SENDING;
// copy the packet to the radio FIFO
at86rf231_write_fifo(data, length);
DEBUG("Wrote to FIFO\n");
// Start TX
at86rf231_reg_write(AT86RF231_REG__TRX_STATE, AT86RF231_TRX_STATE__TX_START);
DEBUG("Started TX\n");
}
/**

View File

@ -31,6 +31,19 @@ typedef struct __attribute__((packed))
}
at86rf231_packet_t;
extern int transceiver_pid;
#define AT_DRIVER_STATE_DEFAULT (0)
#define AT_DRIVER_STATE_SENDING (1)
/**
* @brief To keep state inside of at86rf231 driver
* @details This variable is used to determine if a TRX_END IRQ from
* the radio transceiver has to be interpreted as end of
* sending or reception.
*/
extern uint8_t driver_state;
void at86rf231_init(kernel_pid_t tpid);
//void at86rf231_reset(void);
void at86rf231_rx(void);