From 1eb8701965f8f82f62ced9de13669bce660cabe0 Mon Sep 17 00:00:00 2001 From: Gunar Schorcht Date: Tue, 10 Mar 2020 10:00:27 +0100 Subject: [PATCH 1/4] drivers/sx127x: ensure that DIO2 is defined If frequency hopping is used (LORA_FREQUENCY_HOPPING_DEFAULT = true), DIO2 pin is needed for the FhssChangeChannel interrupt to get it working. --- drivers/sx127x/sx127x.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/sx127x/sx127x.c b/drivers/sx127x/sx127x.c index 69a44c8ec9..962c3a16bc 100644 --- a/drivers/sx127x/sx127x.c +++ b/drivers/sx127x/sx127x.c @@ -289,6 +289,10 @@ static int _init_gpios(sx127x_t *dev) return res; } } + else { + /* if frequency hopping is enabled, DIO2 pin must be defined */ + assert(LORA_FREQUENCY_HOPPING_DEFAULT == false); + } /* check if DIO3 pin is defined */ if (dev->params.dio3_pin != GPIO_UNDEF) { From e3a82cd6fc3bed60ebdf3393ec87844aed8cf7d8 Mon Sep 17 00:00:00 2001 From: Gunar Schorcht Date: Tue, 10 Mar 2020 10:02:03 +0100 Subject: [PATCH 2/4] driver/sx127x: set DIO1 mapping Since the RxTimeout interrupt is enabled, DIO1 mapping should be set also to RxTimeout in case the driver is extended in future and DIO1 mapping is changed for any reason. --- drivers/sx127x/sx127x_getset.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/sx127x/sx127x_getset.c b/drivers/sx127x/sx127x_getset.c index 8f9e23dbde..fec8ea1103 100644 --- a/drivers/sx127x/sx127x_getset.c +++ b/drivers/sx127x/sx127x_getset.c @@ -282,13 +282,14 @@ void sx127x_set_rx(sx127x_t *dev) /* SX127X_RF_LORA_IRQFLAGS_FHSSCHANGEDCHANNEL | */ SX127X_RF_LORA_IRQFLAGS_CADDETECTED); - /* DIO0=RxDone, DIO2=FhssChangeChannel, DIO3=ValidHeader */ + /* DIO0=RxDone, DIO1=RxTimeout, DIO2=FhssChangeChannel, DIO3=ValidHeader */ sx127x_reg_write(dev, SX127X_REG_DIOMAPPING1, (sx127x_reg_read(dev, SX127X_REG_DIOMAPPING1) & SX127X_RF_LORA_DIOMAPPING1_DIO0_MASK & SX127X_RF_LORA_DIOMAPPING1_DIO2_MASK & SX127X_RF_LORA_DIOMAPPING1_DIO3_MASK) | SX127X_RF_LORA_DIOMAPPING1_DIO0_00 | + SX127X_RF_LORA_DIOMAPPING1_DIO1_00 | SX127X_RF_LORA_DIOMAPPING1_DIO2_00 | SX127X_RF_LORA_DIOMAPPING1_DIO3_01); } @@ -303,12 +304,13 @@ void sx127x_set_rx(sx127x_t *dev) SX127X_RF_LORA_IRQFLAGS_FHSSCHANGEDCHANNEL | SX127X_RF_LORA_IRQFLAGS_CADDETECTED); - /* DIO0=RxDone, DIO3=ValidHeader */ + /* DIO0=RxDone, DIO1=RxTimeout, DIO3=ValidHeader */ sx127x_reg_write(dev, SX127X_REG_DIOMAPPING1, (sx127x_reg_read(dev, SX127X_REG_DIOMAPPING1) & SX127X_RF_LORA_DIOMAPPING1_DIO0_MASK & SX127X_RF_LORA_DIOMAPPING1_DIO3_MASK) | SX127X_RF_LORA_DIOMAPPING1_DIO0_00 | + SX127X_RF_LORA_DIOMAPPING1_DIO1_00 | SX127X_RF_LORA_DIOMAPPING1_DIO3_01); } @@ -353,9 +355,9 @@ void sx127x_set_tx(sx127x_t *dev) SX127X_RF_LORA_IRQFLAGS_RXDONE | SX127X_RF_LORA_IRQFLAGS_PAYLOADCRCERROR | SX127X_RF_LORA_IRQFLAGS_VALIDHEADER | - /* RFLR_IRQFLAGS_TXDONE | */ + /* SX127X_RF_LORA_IRQFLAGS_TXDONE | */ SX127X_RF_LORA_IRQFLAGS_CADDONE | - /* RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL | */ + /* SX127X_RF_LORA_IRQFLAGS_FHSSCHANGEDCHANNEL | */ SX127X_RF_LORA_IRQFLAGS_CADDETECTED); /* DIO0=TxDone, DIO2=FhssChangeChannel */ From 56040e3369c2f8b0c8f8955dfe7967f409f667a3 Mon Sep 17 00:00:00 2001 From: Gunar Schorcht Date: Tue, 10 Mar 2020 10:04:09 +0100 Subject: [PATCH 3/4] driver/sx127x: allow the use of DIO0 for CAD_DONE --- drivers/sx127x/sx127x_internal.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/sx127x/sx127x_internal.c b/drivers/sx127x/sx127x_internal.c index d51d32420d..2a3cc9512e 100644 --- a/drivers/sx127x/sx127x_internal.c +++ b/drivers/sx127x/sx127x_internal.c @@ -201,11 +201,20 @@ void sx127x_start_cad(sx127x_t *dev) /* | SX127X_RF_LORA_IRQFLAGS_CADDETECTED*/ ); - /* DIO3 = CADDone */ - sx127x_reg_write(dev, SX127X_REG_DIOMAPPING1, - (sx127x_reg_read(dev, SX127X_REG_DIOMAPPING1) & - SX127X_RF_LORA_DIOMAPPING1_DIO3_MASK) | - SX127X_RF_LORA_DIOMAPPING1_DIO3_00); + if (dev->params.dio3_pin != GPIO_UNDEF) { + /* DIO3 = CADDone */ + sx127x_reg_write(dev, SX127X_REG_DIOMAPPING1, + (sx127x_reg_read(dev, SX127X_REG_DIOMAPPING1) & + SX127X_RF_LORA_DIOMAPPING1_DIO3_MASK) | + SX127X_RF_LORA_DIOMAPPING1_DIO3_00); + } + else { + /* DIO0 = CADDone */ + sx127x_reg_write(dev, SX127X_REG_DIOMAPPING1, + (sx127x_reg_read(dev, SX127X_REG_DIOMAPPING1) & + SX127X_RF_LORA_DIOMAPPING1_DIO0_MASK) | + SX127X_RF_LORA_DIOMAPPING1_DIO0_10); + } sx127x_set_state(dev, SX127X_RF_CAD); sx127x_set_op_mode(dev, SX127X_RF_LORA_OPMODE_CAD); From 87021a0b186a36ae02f0513ca701f2847f21905c Mon Sep 17 00:00:00 2001 From: Gunar Schorcht Date: Tue, 10 Mar 2020 10:47:36 +0100 Subject: [PATCH 4/4] drivers/sy127x: clear interrupts for DIO3 If ValidHeader interrupt is set, it triggers DIO3 interrupt. However, if DIO3 line is not connected, ValidHeader interrupt is still set in RegIrqFlags register when RxDone interrupt is triggered on DIO0. It sets the mode back to idle. Therefore, the _on_dio3_irq does not clear the ValidHeader interrupt flag. --- drivers/sx127x/sx127x_netdev.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/sx127x/sx127x_netdev.c b/drivers/sx127x/sx127x_netdev.c index cd7ad452f3..c6a9f2b040 100644 --- a/drivers/sx127x/sx127x_netdev.c +++ b/drivers/sx127x/sx127x_netdev.c @@ -721,6 +721,11 @@ void _on_dio3_irq(void *arg) break; default: DEBUG("[sx127x] netdev: sx127x_on_dio3: unknown state"); + /* at least the related interrupts should be cleared in this case */ + sx127x_reg_write(dev, SX127X_REG_LR_IRQFLAGS, + SX127X_RF_LORA_IRQFLAGS_VALIDHEADER | + SX127X_RF_LORA_IRQFLAGS_CADDETECTED | + SX127X_RF_LORA_IRQFLAGS_CADDONE); break; } }