1

Revision:
0:9c052ff8dd6a
Child:
5:ab124d3842a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/radio_ff_arduino_sx127x.cpp	Thu Jul 05 17:31:54 2018 -0700
@@ -0,0 +1,105 @@
+/* Only for NUCLEO boards: prevent compiling for MOTE_L152RC and typeABZ discovery */
+#if defined(TARGET_FF_ARDUINO) && defined(TARGET_FF_MORPHO) && !defined(TARGET_DISCO_L072CZ_LRWAN1)
+#include "radio.h"
+#ifdef SX127x_H 
+#include "SPIu.h"
+
+SPIu spi(D11, D12, D13); // mosi, miso, sclk
+//                  dio0, dio1, nss, spi, rst
+SX127x Radio::radio(  D2,   D3, D10, spi, A0); // sx127[62] arduino shield
+SX127x_lora Radio::lora(radio);
+SX127x_fsk Radio::fsk(radio);
+
+InterruptIn Radio::dio0(D2);
+InterruptIn Radio::dio1(D3);
+
+typedef enum {
+    SHIELD_TYPE_NONE = 0,
+    SHIELD_TYPE_LAS,
+    SHIELD_TYPE_MAS,
+} shield_type_e;
+shield_type_e shield_type;
+
+#ifdef TARGET_FF_MORPHO
+DigitalOut pc3(PC_3);   // debug RX indication, for nucleo boards
+#endif /* TARGET_FF_MORPHO */
+DigitalInOut rfsw(A4);
+void Radio::rfsw_callback()
+{
+    if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER)
+        rfsw = 1;
+    else
+        rfsw = 0;
+
+    if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE)
+        pc3 = 1;
+    else
+        pc3 = 0;
+}
+
+void
+Radio::set_tx_dbm(int8_t dbm)
+{
+    RegPdsTrim1_t pds_trim;
+    uint8_t adr;
+
+    if (radio.type == SX1276)
+        adr = REG_PDSTRIM1_SX1276;
+    else
+        adr = REG_PDSTRIM1_SX1272;
+       
+    pds_trim.octet = radio.read_reg(adr);   
+
+    if (shield_type == SHIELD_TYPE_LAS)
+        radio.RegPaConfig.bits.PaSelect = 1;
+    else
+        radio.RegPaConfig.bits.PaSelect = 0;
+                
+    if (radio.RegPaConfig.bits.PaSelect) {
+        /* PABOOST used: +2dbm to +17, or +20 */
+        if (dbm > 17) {
+            if (dbm > 20)
+                dbm = 20;
+            dbm -= 3;
+            pds_trim.bits.prog_txdac = 7;
+            radio.write_reg(adr, pds_trim.octet);
+            ocp(150);
+        } else
+            ocp(120);
+
+        if (dbm > 1)
+                radio.RegPaConfig.bits.OutputPower = dbm - 2;
+    } else {
+        /* RFO used: -1 to +14dbm */
+        ocp(80);
+        if (dbm < 15)
+            radio.RegPaConfig.bits.OutputPower = dbm + 1;
+    }
+    radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
+
+    radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
+    if (radio.RegPaConfig.bits.PaSelect) {
+        dbm = radio.RegPaConfig.bits.OutputPower + pds_trim.bits.prog_txdac - 2;
+    } else {
+        dbm = radio.RegPaConfig.bits.OutputPower - 1;
+    }
+}
+
+void Radio::boardInit()
+{
+    printf("boardInit sx127x-ff-arduino ");
+    rfsw.input();
+    if (rfsw.read()) {
+        shield_type = SHIELD_TYPE_LAS;
+        printf("LAS\r\n");
+    } else {
+        shield_type = SHIELD_TYPE_MAS;
+        printf("MAS\r\n");
+    }
+    
+    rfsw.output();
+}
+
+#endif /* ..SX127x_H */
+#endif /* ...sx127x shield */
+