wayne roberts / lorawan1v1

Dependencies:   sx12xx_hal

Dependents:   LoRaWAN-SanJose_Bootcamp LoRaWAN-grove-cayenne LoRaWAN-classC-demo LoRaWAN-grove-cayenne ... more

Revision:
0:6b3ac9c5a042
Child:
4:e4bfe9183f94
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/radio/radio_ff_arduino.cpp	Wed Feb 28 10:48:11 2018 -0800
@@ -0,0 +1,103 @@
+/* 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 "board.h"
+#include "radio.h"
+
+SPI 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;
+
+DigitalOut pc3(PC_3);
+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) {
+            MAC_PRINTF("+20dBm PADAC bias\r\n");
+            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) {
+        MAC_PRINTF("PA_BOOST ");
+        dbm = radio.RegPaConfig.bits.OutputPower + pds_trim.bits.prog_txdac - 2;
+    } else {
+        MAC_PRINTF("RFO ");
+        dbm = radio.RegPaConfig.bits.OutputPower - 1;
+    }
+    MAC_PRINTF("OutputPower:%ddBm{%02x}\r\n", dbm, radio.RegPaConfig.octet);
+}
+
+void Radio::boardInit()
+{
+    rfsw.input();
+    if (rfsw.read()) {
+        shield_type = SHIELD_TYPE_LAS;
+        MAC_PRINTF("LAS\r\n");
+    } else {
+        shield_type = SHIELD_TYPE_MAS;
+        MAC_PRINTF("MAS\r\n");
+    }
+    
+    rfsw.output();
+}
+
+#endif /* ...sx127x shield */
+