sx1261/2 driver

Dependents:   alarm_slave iq_sx126x sx126x_simple_TX_shield_2020a sx126x_simple_RX_shield_2020a ... more

Driver for SX1261 or SX1262

Revision:
1:497af0bd9e53
Parent:
0:c79a1f70c110
Child:
2:e6e159c8ab4d
--- a/sx126x.cpp	Wed May 16 11:20:24 2018 -0700
+++ b/sx126x.cpp	Tue May 22 14:26:32 2018 -0700
@@ -1,4 +1,4 @@
-#include "sx126x.h"
+#include "sx12xx.h"
 
 Callback<void()> SX126x::dio1_topHalf;    // low latency ISR context
 
@@ -14,6 +14,11 @@
     uint8_t buf[8];
     IrqFlags_t irqEnable;
 
+    nss = 1;
+
+    dio1.rise(dio1isr);
+
+
     irqEnable.word = 0;
     irqEnable.bits.TxDone = 1;
     irqEnable.bits.RxDone = 1;
@@ -29,7 +34,6 @@
     buf[7] = 0; // dio3
     xfer(OPCODE_SET_DIO_IRQ_PARAMS, 8, buf);
 
-    dio1.rise(dio1isr);
 }
 
 void SX126x::PrintChipStatus(status_t status)
@@ -59,6 +63,7 @@
 
 void SX126x::service()
 {
+    //unsigned n = 0;
     IrqFlags_t irqFlags, clearIrqFlags;
     uint8_t buf[4];
 
@@ -74,7 +79,7 @@
             if (txDone)
                 txDone.call();
             clearIrqFlags.bits.TxDone = 1;
-            txing = false;
+            chipMode = CHIPMODE_NONE;
         }
         if (irqFlags.bits.RxDone) {
             if (rxDone) {
@@ -93,9 +98,11 @@
             clearIrqFlags.bits.RxDone = 1;
         }
         if (irqFlags.bits.Timeout) {
-            if (timeout)
-                timeout(txing);
-            txing = false;
+            if (chipMode != CHIPMODE_NONE) {
+                if (timeout)
+                    timeout(chipMode == CHIPMODE_TX);
+            }
+            chipMode = CHIPMODE_NONE;
             clearIrqFlags.bits.Timeout = 1;
         }
 
@@ -117,8 +124,13 @@
             ;
         sleeping = false;
     } else {
-        while (busy)
-            ;
+        //unsigned n = 0;
+        while (busy) {
+            /*wait_us(0.002);
+            if (++n > 200) {
+                return -1;
+            }*/
+        }
         nss = 0;
     }
 
@@ -159,7 +171,8 @@
     buf[1] = 0x00;
     buf[2] = 0x00;
     xfer(OPCODE_SET_TX, 3, buf);
-    txing = true;
+
+    chipMode = CHIPMODE_TX;
 }
 
 void SX126x::start_rx(unsigned timeout)
@@ -170,6 +183,8 @@
     buf[1] = timeout >> 8;
     buf[2] = timeout;
     xfer(OPCODE_SET_RX, 3, buf);
+
+    chipMode = CHIPMODE_RX;
 }
 
 #define MHZ_TO_FRF      1048576 // = (1<<25) / Fxtal_MHz
@@ -220,10 +235,8 @@
     uint8_t buf[4];
     // use OCP default
 
-    printf("set_tx_dbm(%d) ", dbm);
     buf[3] = 1;
     if (is1262) {
-        printf("sx1262 ");
         buf[0] = 4;
         buf[1] = 7;
         buf[2] = 0;
@@ -233,7 +246,6 @@
         else if (dbm < -3)
             dbm = -3;
     } else {
-        printf("sx1261 ");
         if (dbm == 15)
             buf[0] = 6;
         else
@@ -267,19 +279,18 @@
     buf[0] = addr >> 8;
     buf[1] = (uint8_t)addr;
     for (n = len; n > 0; n--) {
-        //printf("data:%02x to buf[%u]\r\n", (uint8_t)data, n+1);
         buf[n+1] = (uint8_t)data;
         data >>= 8;
     }
-    //printf("write reg %04x: %02x %02x %02x %02x\r\n", addr, buf[0], buf[1], buf[2], buf[3]);
     xfer(OPCODE_WRITE_REGISTER, 2+len, buf);
-    //printf("write status %02x %02x %02x %02x\r\n", buf[0], buf[1], buf[2], buf[3]);
 }
 
 void SX126x::setStandby(stby_t stby)
 {
     uint8_t octet = stby;
     xfer(OPCODE_SET_STANDBY, 1, &octet);
+
+    chipMode = CHIPMODE_NONE;
 }
 
 void SX126x::setSleep(bool warmStart, bool rtcWakeup)
@@ -290,6 +301,8 @@
     sc.bits.rtcWakeup = rtcWakeup;
     sc.bits.warmStart = warmStart;
     xfer(OPCODE_SET_SLEEP, 1, &sc.octet);
+
+    chipMode = CHIPMODE_NONE;
 }
 
 void SX126x::hw_reset(PinName pin)