wayne roberts / sx12xx_hal

Dependents:   alarm_slave alarm_master lora_p2p lorawan1v1 ... more

Files at this revision

API Documentation at this revision

Comitter:
Wayne Roberts
Date:
Fri Feb 05 16:35:05 2021 -0800
Parent:
20:75635d50262e
Commit message:
lr1110: handle tcxo when hf-xosc fails to start

Changed in this revision

radio.h Show annotated file Show diff for this revision Revisions of this file
radio_lr1110.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/radio.h	Fri Jul 10 10:52:39 2020 -0700
+++ b/radio.h	Fri Feb 05 16:35:05 2021 -0800
@@ -164,6 +164,10 @@
         static void txDoneBottom(void);
         static void timeout_callback(bool);
 #endif /* SX128x_H */
+#if defined(SX1265_H)
+        static void my_irq_handler(void);
+        static bool init_irq;
+#endif /* SX1265_H */
         static void chipModeChange(void);
         static void rfsw_callback(void);
         static void ocp(uint8_t ma);
--- a/radio_lr1110.cpp	Fri Jul 10 10:52:39 2020 -0700
+++ b/radio_lr1110.cpp	Fri Feb 05 16:35:05 2021 -0800
@@ -188,6 +188,13 @@
     }
 }
 
+bool Radio::init_irq;
+void Radio::my_irq_handler()
+{
+    /* radio irq immediately after hardware reset: hf_xosc start due to TCXO */
+    init_irq = true;
+}
+
 void Radio::dio9_top_half()
 {
     irqAt = lpt.read_us();
@@ -228,6 +235,7 @@
 
 void Radio::Init(const RadioEvents_t* e, unsigned spi_hz)
 {
+    uint64_t a, b;
     /* initialize payload length to zero in packet params */
     lora_pp_buf[3] = 0;
     gfsk_pp_buf[6] = 0;
@@ -236,14 +244,26 @@
     radio.rxDone = rx_done;
     radio.timeout = timeout_callback;
     //radio.chipModeChange = chipModeChange;
-    radio.dio9_topHalf = dio9_top_half;
 
     RadioEvents = e;
     lpt.start();
 
     spi.frequency(spi_hz);
 
+    radio.dio9_topHalf = my_irq_handler;
+    init_irq = false;
     radio.hw_reset();
+    a = Kernel::get_ms_count();
+    do {
+        b = Kernel::get_ms_count();
+        /* wait for radio interrupt at hardware reset, failure to start hf_xosc */
+        if (init_irq) {
+            radio.service();
+            break;
+        }
+    } while ((b - a) < 30);
+
+    radio.dio9_topHalf = dio9_top_half;
 
     initRfSwDIO();
 }