From 5aeeabf4a9eaab3f25e67aeca6e4645d7ac84da6 Mon Sep 17 00:00:00 2001 From: daniel-k Date: Tue, 29 Sep 2015 17:05:13 +0200 Subject: [PATCH] at86rf2xx: cancel receiving when preparing for TX --- drivers/at86rf2xx/at86rf2xx.c | 10 +++++++--- drivers/at86rf2xx/at86rf2xx_getset.c | 10 ++-------- drivers/at86rf2xx/at86rf2xx_internal.c | 8 ++++++++ drivers/at86rf2xx/include/at86rf2xx_internal.h | 7 +++++++ 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/drivers/at86rf2xx/at86rf2xx.c b/drivers/at86rf2xx/at86rf2xx.c index 9a0af02b61..ccabc35679 100644 --- a/drivers/at86rf2xx/at86rf2xx.c +++ b/drivers/at86rf2xx/at86rf2xx.c @@ -215,9 +215,13 @@ void at86rf2xx_tx_prepare(at86rf2xx_t *dev) do { state = at86rf2xx_get_status(dev); } - while (state == AT86RF2XX_STATE_BUSY_RX_AACK || - state == AT86RF2XX_STATE_BUSY_TX_ARET); - if (state != AT86RF2XX_STATE_TX_ARET_ON) { + while (state == AT86RF2XX_STATE_BUSY_TX_ARET); + + /* if receiving cancel */ + if(state == AT86RF2XX_STATE_BUSY_RX_AACK) { + at86rf2xx_force_trx_off(dev); + dev->idle_state = AT86RF2XX_STATE_RX_AACK_ON; + } else if (state != AT86RF2XX_STATE_TX_ARET_ON) { dev->idle_state = state; } at86rf2xx_set_state(dev, AT86RF2XX_STATE_TX_ARET_ON); diff --git a/drivers/at86rf2xx/at86rf2xx_getset.c b/drivers/at86rf2xx/at86rf2xx_getset.c index 5955295bb8..26e5d3d2eb 100644 --- a/drivers/at86rf2xx/at86rf2xx_getset.c +++ b/drivers/at86rf2xx/at86rf2xx_getset.c @@ -401,12 +401,6 @@ static inline void _set_state(at86rf2xx_t *dev, uint8_t state) while (at86rf2xx_get_status(dev) != state); } -static inline void _force_trx_off(at86rf2xx_t *dev) -{ - at86rf2xx_reg_write(dev, AT86RF2XX_REG__TRX_STATE, AT86RF2XX_TRX_STATE__FORCE_TRX_OFF); - while (at86rf2xx_get_status(dev) != AT86RF2XX_STATE_TRX_OFF); -} - void at86rf2xx_set_state(at86rf2xx_t *dev, uint8_t state) { uint8_t old_state = at86rf2xx_get_status(dev); @@ -438,7 +432,7 @@ void at86rf2xx_set_state(at86rf2xx_t *dev, uint8_t state) if (state == AT86RF2XX_STATE_SLEEP) { /* First go to TRX_OFF */ - _force_trx_off(dev); + at86rf2xx_force_trx_off(dev); /* Go to SLEEP mode from TRX_OFF */ gpio_set(dev->sleep_pin); } else { @@ -458,5 +452,5 @@ void at86rf2xx_reset_state_machine(at86rf2xx_t *dev) old_state = at86rf2xx_get_status(dev); } while (old_state == AT86RF2XX_STATE_IN_PROGRESS); - _force_trx_off(dev); + at86rf2xx_force_trx_off(dev); } diff --git a/drivers/at86rf2xx/at86rf2xx_internal.c b/drivers/at86rf2xx/at86rf2xx_internal.c index 99f7b23cf3..44a9eb05b0 100644 --- a/drivers/at86rf2xx/at86rf2xx_internal.c +++ b/drivers/at86rf2xx/at86rf2xx_internal.c @@ -104,3 +104,11 @@ uint8_t at86rf2xx_get_status(const at86rf2xx_t *dev) return (at86rf2xx_reg_read(dev, AT86RF2XX_REG__TRX_STATUS) & AT86RF2XX_TRX_STATUS_MASK__TRX_STATUS); } + +void at86rf2xx_force_trx_off(const at86rf2xx_t *dev) +{ + at86rf2xx_reg_write(dev, + AT86RF2XX_REG__TRX_STATE, + AT86RF2XX_TRX_STATE__FORCE_TRX_OFF); + while (at86rf2xx_get_status(dev) != AT86RF2XX_STATE_TRX_OFF); +} diff --git a/drivers/at86rf2xx/include/at86rf2xx_internal.h b/drivers/at86rf2xx/include/at86rf2xx_internal.h index b32b2a4066..90381cbe36 100644 --- a/drivers/at86rf2xx/include/at86rf2xx_internal.h +++ b/drivers/at86rf2xx/include/at86rf2xx_internal.h @@ -90,6 +90,13 @@ void at86rf2xx_sram_write(const at86rf2xx_t *dev, void at86rf2xx_fb_read(const at86rf2xx_t *dev, uint8_t *data, const size_t len); +/** + * @brief Cancel ongoing transactions and switch to TRX_OFF state + * + * @param[in] dev device to manipulate + */ +void at86rf2xx_force_trx_off(const at86rf2xx_t *dev); + /** * @brief Convenience function for reading the status of the given device *