From 3c5a5728b228de81fda161efefdf4377ba99b57a Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Sun, 23 Jan 2022 17:46:23 +0100 Subject: [PATCH] ExpressLRS - Fix an edge-case when a receiver can have both of it's ISR flags set. This has not been observed on the bench but is more of a safeguard so that the task doesn't stall and can decide what to do. --- src/main/drivers/rx/rx_sx127x.c | 4 +++- src/main/drivers/rx/rx_sx1280.c | 5 ++++- src/main/rx/expresslrs.c | 4 +++- src/main/rx/expresslrs_impl.h | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/drivers/rx/rx_sx127x.c b/src/main/drivers/rx/rx_sx127x.c index aa85fd13a..3bc605e38 100644 --- a/src/main/drivers/rx/rx_sx127x.c +++ b/src/main/drivers/rx/rx_sx127x.c @@ -445,7 +445,9 @@ uint8_t sx127xGetIrqReason(void) { uint8_t irqFlags = sx127xGetIrqFlags(); sx127xClearIrqFlags(); - if ((irqFlags & SX127X_CLEAR_IRQ_FLAG_TX_DONE)) { + if ((irqFlags & SX127X_CLEAR_IRQ_FLAG_TX_DONE) && (irqFlags & SX127X_CLEAR_IRQ_FLAG_RX_DONE)) { + return 3; + } else if ((irqFlags & SX127X_CLEAR_IRQ_FLAG_TX_DONE)) { return 2; } else if ((irqFlags & SX127X_CLEAR_IRQ_FLAG_RX_DONE)) { return 1; diff --git a/src/main/drivers/rx/rx_sx1280.c b/src/main/drivers/rx/rx_sx1280.c index 7d35d88f2..7d4c14186 100644 --- a/src/main/drivers/rx/rx_sx1280.c +++ b/src/main/drivers/rx/rx_sx1280.c @@ -418,8 +418,11 @@ void sx1280ClearIrqStatus(const uint16_t irqMask) uint8_t sx1280GetIrqReason(void) { uint16_t irqStatus = sx1280GetIrqStatus(); + sx1280ClearIrqStatus(SX1280_IRQ_RADIO_ALL); - if ((irqStatus & SX1280_IRQ_TX_DONE)) { + if ((irqStatus & SX1280_IRQ_TX_DONE) && (irqStatus & SX1280_IRQ_RX_DONE)) { + return 3; + } else if ((irqStatus & SX1280_IRQ_TX_DONE)) { return 2; } else if ((irqStatus & SX1280_IRQ_RX_DONE)) { return 1; diff --git a/src/main/rx/expresslrs.c b/src/main/rx/expresslrs.c index 4991b06e5..d5d5ddbcc 100644 --- a/src/main/rx/expresslrs.c +++ b/src/main/rx/expresslrs.c @@ -1073,7 +1073,9 @@ rx_spi_received_e expressLrsDataReceived(uint8_t *payload) } uint8_t irqReason = receiver.rxISR(&isrTimeStampUs); - if (irqReason == ELRS_DIO_TX_DONE) { + if (irqReason == ELRS_DIO_RX_AND_TX_DONE) { + startReceiving(); + } else if (irqReason == ELRS_DIO_TX_DONE) { startReceiving(); } else if (irqReason == ELRS_DIO_RX_DONE) { result = processRFPacket(payload, isrTimeStampUs); diff --git a/src/main/rx/expresslrs_impl.h b/src/main/rx/expresslrs_impl.h index 2655cf2c9..fdc6d8548 100644 --- a/src/main/rx/expresslrs_impl.h +++ b/src/main/rx/expresslrs_impl.h @@ -33,7 +33,8 @@ typedef enum { typedef enum { ELRS_DIO_UNKNOWN = 0, ELRS_DIO_RX_DONE = 1, - ELRS_DIO_TX_DONE = 2 + ELRS_DIO_TX_DONE = 2, + ELRS_DIO_RX_AND_TX_DONE = 3, } dioReason_e; typedef enum {