Hardware Abstraction Layer, permitting any LoRa application to use any LoRa radio chip

Dependents:   alarm_slave alarm_master lora_p2p lorawan1v1 ... more

radio chip selection

Radio chip driver is not included, allowing choice of radio device.
If you're using SX1272 or SX1276, then import sx127x driver into your program.
if you're using SX1261 or SX1262, then import sx126x driver into your program.
if you're using SX1280, then import sx1280 driver into your program.
if you're using LR1110, then import LR1110 driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.
If you're using Type1SJ select target DISCO_L072CZ_LRWAN1 and import sx126x driver into your program.

Pin assigned to arduino LoRa radio shield form-factor

Committer:
Wayne Roberts
Date:
Sun Nov 25 17:12:03 2018 -0800
Revision:
5:ab124d3842a8
Parent:
0:9c052ff8dd6a
Child:
6:b7bbf31e06e4
add PA disable option

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 0:9c052ff8dd6a 1 /* Only for NUCLEO boards: prevent compiling for MOTE_L152RC and typeABZ discovery */
Wayne Roberts 0:9c052ff8dd6a 2 #if defined(TARGET_FF_ARDUINO) && defined(TARGET_FF_MORPHO) && !defined(TARGET_DISCO_L072CZ_LRWAN1)
Wayne Roberts 0:9c052ff8dd6a 3 #include "radio.h"
Wayne Roberts 0:9c052ff8dd6a 4 #ifdef SX127x_H
Wayne Roberts 0:9c052ff8dd6a 5 #include "SPIu.h"
Wayne Roberts 0:9c052ff8dd6a 6
Wayne Roberts 0:9c052ff8dd6a 7 SPIu spi(D11, D12, D13); // mosi, miso, sclk
Wayne Roberts 0:9c052ff8dd6a 8 // dio0, dio1, nss, spi, rst
Wayne Roberts 0:9c052ff8dd6a 9 SX127x Radio::radio( D2, D3, D10, spi, A0); // sx127[62] arduino shield
Wayne Roberts 0:9c052ff8dd6a 10 SX127x_lora Radio::lora(radio);
Wayne Roberts 0:9c052ff8dd6a 11 SX127x_fsk Radio::fsk(radio);
Wayne Roberts 0:9c052ff8dd6a 12
Wayne Roberts 0:9c052ff8dd6a 13 InterruptIn Radio::dio0(D2);
Wayne Roberts 0:9c052ff8dd6a 14 InterruptIn Radio::dio1(D3);
Wayne Roberts 0:9c052ff8dd6a 15
Wayne Roberts 0:9c052ff8dd6a 16 typedef enum {
Wayne Roberts 0:9c052ff8dd6a 17 SHIELD_TYPE_NONE = 0,
Wayne Roberts 0:9c052ff8dd6a 18 SHIELD_TYPE_LAS,
Wayne Roberts 0:9c052ff8dd6a 19 SHIELD_TYPE_MAS,
Wayne Roberts 0:9c052ff8dd6a 20 } shield_type_e;
Wayne Roberts 0:9c052ff8dd6a 21 shield_type_e shield_type;
Wayne Roberts 0:9c052ff8dd6a 22
Wayne Roberts 0:9c052ff8dd6a 23 #ifdef TARGET_FF_MORPHO
Wayne Roberts 0:9c052ff8dd6a 24 DigitalOut pc3(PC_3); // debug RX indication, for nucleo boards
Wayne Roberts 0:9c052ff8dd6a 25 #endif /* TARGET_FF_MORPHO */
Wayne Roberts 0:9c052ff8dd6a 26 DigitalInOut rfsw(A4);
Wayne Roberts 0:9c052ff8dd6a 27 void Radio::rfsw_callback()
Wayne Roberts 0:9c052ff8dd6a 28 {
Wayne Roberts 0:9c052ff8dd6a 29 if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER)
Wayne Roberts 0:9c052ff8dd6a 30 rfsw = 1;
Wayne Roberts 0:9c052ff8dd6a 31 else
Wayne Roberts 0:9c052ff8dd6a 32 rfsw = 0;
Wayne Roberts 0:9c052ff8dd6a 33
Wayne Roberts 0:9c052ff8dd6a 34 if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE)
Wayne Roberts 0:9c052ff8dd6a 35 pc3 = 1;
Wayne Roberts 0:9c052ff8dd6a 36 else
Wayne Roberts 0:9c052ff8dd6a 37 pc3 = 0;
Wayne Roberts 0:9c052ff8dd6a 38 }
Wayne Roberts 0:9c052ff8dd6a 39
Wayne Roberts 0:9c052ff8dd6a 40 void
Wayne Roberts 0:9c052ff8dd6a 41 Radio::set_tx_dbm(int8_t dbm)
Wayne Roberts 0:9c052ff8dd6a 42 {
Wayne Roberts 0:9c052ff8dd6a 43 RegPdsTrim1_t pds_trim;
Wayne Roberts 0:9c052ff8dd6a 44 uint8_t adr;
Wayne Roberts 0:9c052ff8dd6a 45
Wayne Roberts 5:ab124d3842a8 46 if (radio.type == SX1276) {
Wayne Roberts 0:9c052ff8dd6a 47 adr = REG_PDSTRIM1_SX1276;
Wayne Roberts 5:ab124d3842a8 48 pa_test_adr = REG_PATEST_SX1276;
Wayne Roberts 5:ab124d3842a8 49 } else {
Wayne Roberts 0:9c052ff8dd6a 50 adr = REG_PDSTRIM1_SX1272;
Wayne Roberts 5:ab124d3842a8 51 pa_test_adr = REG_PATEST_SX1272;
Wayne Roberts 5:ab124d3842a8 52 }
Wayne Roberts 0:9c052ff8dd6a 53
Wayne Roberts 5:ab124d3842a8 54 v = radio.read_reg(pa_test_adr);
Wayne Roberts 5:ab124d3842a8 55 if (dbm == PA_OFF_DBM) {
Wayne Roberts 5:ab124d3842a8 56 /* for bench testing: prevent overloading receiving station (very low TX power) */
Wayne Roberts 5:ab124d3842a8 57 v &= ~0x20; // turn off pu_regpa_n: disable PA
Wayne Roberts 5:ab124d3842a8 58 radio.write_reg(pa_test_adr, v);
Wayne Roberts 5:ab124d3842a8 59 return;
Wayne Roberts 5:ab124d3842a8 60 } else if ((v & 0x20) == 0) {
Wayne Roberts 5:ab124d3842a8 61 v |= 0x20; // turn on pu_regpa_n: enable PA
Wayne Roberts 5:ab124d3842a8 62 radio.write_reg(pa_test_adr, v);
Wayne Roberts 5:ab124d3842a8 63 }
Wayne Roberts 5:ab124d3842a8 64
Wayne Roberts 0:9c052ff8dd6a 65 pds_trim.octet = radio.read_reg(adr);
Wayne Roberts 0:9c052ff8dd6a 66
Wayne Roberts 0:9c052ff8dd6a 67 if (shield_type == SHIELD_TYPE_LAS)
Wayne Roberts 0:9c052ff8dd6a 68 radio.RegPaConfig.bits.PaSelect = 1;
Wayne Roberts 0:9c052ff8dd6a 69 else
Wayne Roberts 0:9c052ff8dd6a 70 radio.RegPaConfig.bits.PaSelect = 0;
Wayne Roberts 0:9c052ff8dd6a 71
Wayne Roberts 0:9c052ff8dd6a 72 if (radio.RegPaConfig.bits.PaSelect) {
Wayne Roberts 0:9c052ff8dd6a 73 /* PABOOST used: +2dbm to +17, or +20 */
Wayne Roberts 0:9c052ff8dd6a 74 if (dbm > 17) {
Wayne Roberts 0:9c052ff8dd6a 75 if (dbm > 20)
Wayne Roberts 0:9c052ff8dd6a 76 dbm = 20;
Wayne Roberts 0:9c052ff8dd6a 77 dbm -= 3;
Wayne Roberts 0:9c052ff8dd6a 78 pds_trim.bits.prog_txdac = 7;
Wayne Roberts 0:9c052ff8dd6a 79 radio.write_reg(adr, pds_trim.octet);
Wayne Roberts 0:9c052ff8dd6a 80 ocp(150);
Wayne Roberts 0:9c052ff8dd6a 81 } else
Wayne Roberts 0:9c052ff8dd6a 82 ocp(120);
Wayne Roberts 0:9c052ff8dd6a 83
Wayne Roberts 0:9c052ff8dd6a 84 if (dbm > 1)
Wayne Roberts 0:9c052ff8dd6a 85 radio.RegPaConfig.bits.OutputPower = dbm - 2;
Wayne Roberts 0:9c052ff8dd6a 86 } else {
Wayne Roberts 0:9c052ff8dd6a 87 /* RFO used: -1 to +14dbm */
Wayne Roberts 0:9c052ff8dd6a 88 ocp(80);
Wayne Roberts 0:9c052ff8dd6a 89 if (dbm < 15)
Wayne Roberts 0:9c052ff8dd6a 90 radio.RegPaConfig.bits.OutputPower = dbm + 1;
Wayne Roberts 0:9c052ff8dd6a 91 }
Wayne Roberts 0:9c052ff8dd6a 92 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
Wayne Roberts 0:9c052ff8dd6a 93
Wayne Roberts 0:9c052ff8dd6a 94 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
Wayne Roberts 0:9c052ff8dd6a 95 if (radio.RegPaConfig.bits.PaSelect) {
Wayne Roberts 0:9c052ff8dd6a 96 dbm = radio.RegPaConfig.bits.OutputPower + pds_trim.bits.prog_txdac - 2;
Wayne Roberts 0:9c052ff8dd6a 97 } else {
Wayne Roberts 0:9c052ff8dd6a 98 dbm = radio.RegPaConfig.bits.OutputPower - 1;
Wayne Roberts 0:9c052ff8dd6a 99 }
Wayne Roberts 0:9c052ff8dd6a 100 }
Wayne Roberts 0:9c052ff8dd6a 101
Wayne Roberts 0:9c052ff8dd6a 102 void Radio::boardInit()
Wayne Roberts 0:9c052ff8dd6a 103 {
Wayne Roberts 0:9c052ff8dd6a 104 printf("boardInit sx127x-ff-arduino ");
Wayne Roberts 0:9c052ff8dd6a 105 rfsw.input();
Wayne Roberts 0:9c052ff8dd6a 106 if (rfsw.read()) {
Wayne Roberts 0:9c052ff8dd6a 107 shield_type = SHIELD_TYPE_LAS;
Wayne Roberts 0:9c052ff8dd6a 108 printf("LAS\r\n");
Wayne Roberts 0:9c052ff8dd6a 109 } else {
Wayne Roberts 0:9c052ff8dd6a 110 shield_type = SHIELD_TYPE_MAS;
Wayne Roberts 0:9c052ff8dd6a 111 printf("MAS\r\n");
Wayne Roberts 0:9c052ff8dd6a 112 }
Wayne Roberts 0:9c052ff8dd6a 113
Wayne Roberts 0:9c052ff8dd6a 114 rfsw.output();
Wayne Roberts 0:9c052ff8dd6a 115 }
Wayne Roberts 0:9c052ff8dd6a 116
Wayne Roberts 0:9c052ff8dd6a 117 #endif /* ..SX127x_H */
Wayne Roberts 0:9c052ff8dd6a 118 #endif /* ...sx127x shield */
Wayne Roberts 0:9c052ff8dd6a 119