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:
Fri Feb 05 16:35:05 2021 -0800
Revision:
21:96db08266089
Parent:
17:5f34cbe2ac53
lr1110: handle tcxo when hf-xosc fails to start

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 17:5f34cbe2ac53 2 #if defined(TARGET_FF_ARDUINO) && !defined(TARGET_DISCO_L072CZ_LRWAN1) && !defined(TARGET_MOTE_L152RC)
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 17:5f34cbe2ac53 34 #ifdef TARGET_FF_MORPHO
Wayne Roberts 0:9c052ff8dd6a 35 if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE)
Wayne Roberts 0:9c052ff8dd6a 36 pc3 = 1;
Wayne Roberts 0:9c052ff8dd6a 37 else
Wayne Roberts 0:9c052ff8dd6a 38 pc3 = 0;
Wayne Roberts 17:5f34cbe2ac53 39 #endif /* TARGET_FF_MORPHO */
Wayne Roberts 0:9c052ff8dd6a 40 }
Wayne Roberts 0:9c052ff8dd6a 41
Wayne Roberts 0:9c052ff8dd6a 42 void
Wayne Roberts 0:9c052ff8dd6a 43 Radio::set_tx_dbm(int8_t dbm)
Wayne Roberts 0:9c052ff8dd6a 44 {
Wayne Roberts 0:9c052ff8dd6a 45 RegPdsTrim1_t pds_trim;
Wayne Roberts 6:b7bbf31e06e4 46 uint8_t v, adr, pa_test_adr;
Wayne Roberts 0:9c052ff8dd6a 47
Wayne Roberts 5:ab124d3842a8 48 if (radio.type == SX1276) {
Wayne Roberts 0:9c052ff8dd6a 49 adr = REG_PDSTRIM1_SX1276;
Wayne Roberts 5:ab124d3842a8 50 pa_test_adr = REG_PATEST_SX1276;
Wayne Roberts 5:ab124d3842a8 51 } else {
Wayne Roberts 0:9c052ff8dd6a 52 adr = REG_PDSTRIM1_SX1272;
Wayne Roberts 5:ab124d3842a8 53 pa_test_adr = REG_PATEST_SX1272;
Wayne Roberts 5:ab124d3842a8 54 }
Wayne Roberts 0:9c052ff8dd6a 55
Wayne Roberts 5:ab124d3842a8 56 v = radio.read_reg(pa_test_adr);
Wayne Roberts 5:ab124d3842a8 57 if (dbm == PA_OFF_DBM) {
Wayne Roberts 5:ab124d3842a8 58 /* for bench testing: prevent overloading receiving station (very low TX power) */
Wayne Roberts 5:ab124d3842a8 59 v &= ~0x20; // turn off pu_regpa_n: disable PA
Wayne Roberts 5:ab124d3842a8 60 radio.write_reg(pa_test_adr, v);
Wayne Roberts 5:ab124d3842a8 61 return;
Wayne Roberts 5:ab124d3842a8 62 } else if ((v & 0x20) == 0) {
Wayne Roberts 5:ab124d3842a8 63 v |= 0x20; // turn on pu_regpa_n: enable PA
Wayne Roberts 5:ab124d3842a8 64 radio.write_reg(pa_test_adr, v);
Wayne Roberts 5:ab124d3842a8 65 }
Wayne Roberts 5:ab124d3842a8 66
Wayne Roberts 0:9c052ff8dd6a 67 pds_trim.octet = radio.read_reg(adr);
Wayne Roberts 0:9c052ff8dd6a 68
Wayne Roberts 0:9c052ff8dd6a 69 if (shield_type == SHIELD_TYPE_LAS)
Wayne Roberts 0:9c052ff8dd6a 70 radio.RegPaConfig.bits.PaSelect = 1;
Wayne Roberts 0:9c052ff8dd6a 71 else
Wayne Roberts 0:9c052ff8dd6a 72 radio.RegPaConfig.bits.PaSelect = 0;
Wayne Roberts 0:9c052ff8dd6a 73
Wayne Roberts 0:9c052ff8dd6a 74 if (radio.RegPaConfig.bits.PaSelect) {
Wayne Roberts 0:9c052ff8dd6a 75 /* PABOOST used: +2dbm to +17, or +20 */
Wayne Roberts 0:9c052ff8dd6a 76 if (dbm > 17) {
Wayne Roberts 0:9c052ff8dd6a 77 if (dbm > 20)
Wayne Roberts 0:9c052ff8dd6a 78 dbm = 20;
Wayne Roberts 0:9c052ff8dd6a 79 dbm -= 3;
Wayne Roberts 0:9c052ff8dd6a 80 pds_trim.bits.prog_txdac = 7;
Wayne Roberts 0:9c052ff8dd6a 81 radio.write_reg(adr, pds_trim.octet);
Wayne Roberts 0:9c052ff8dd6a 82 ocp(150);
Wayne Roberts 0:9c052ff8dd6a 83 } else
Wayne Roberts 0:9c052ff8dd6a 84 ocp(120);
Wayne Roberts 0:9c052ff8dd6a 85
Wayne Roberts 0:9c052ff8dd6a 86 if (dbm > 1)
Wayne Roberts 0:9c052ff8dd6a 87 radio.RegPaConfig.bits.OutputPower = dbm - 2;
Wayne Roberts 0:9c052ff8dd6a 88 } else {
Wayne Roberts 0:9c052ff8dd6a 89 /* RFO used: -1 to +14dbm */
Wayne Roberts 0:9c052ff8dd6a 90 ocp(80);
Wayne Roberts 0:9c052ff8dd6a 91 if (dbm < 15)
Wayne Roberts 0:9c052ff8dd6a 92 radio.RegPaConfig.bits.OutputPower = dbm + 1;
Wayne Roberts 0:9c052ff8dd6a 93 }
Wayne Roberts 0:9c052ff8dd6a 94 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
Wayne Roberts 0:9c052ff8dd6a 95
Wayne Roberts 0:9c052ff8dd6a 96 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
Wayne Roberts 0:9c052ff8dd6a 97 if (radio.RegPaConfig.bits.PaSelect) {
Wayne Roberts 0:9c052ff8dd6a 98 dbm = radio.RegPaConfig.bits.OutputPower + pds_trim.bits.prog_txdac - 2;
Wayne Roberts 0:9c052ff8dd6a 99 } else {
Wayne Roberts 0:9c052ff8dd6a 100 dbm = radio.RegPaConfig.bits.OutputPower - 1;
Wayne Roberts 0:9c052ff8dd6a 101 }
Wayne Roberts 0:9c052ff8dd6a 102 }
Wayne Roberts 0:9c052ff8dd6a 103
Wayne Roberts 0:9c052ff8dd6a 104 void Radio::boardInit()
Wayne Roberts 0:9c052ff8dd6a 105 {
Wayne Roberts 0:9c052ff8dd6a 106 printf("boardInit sx127x-ff-arduino ");
Wayne Roberts 0:9c052ff8dd6a 107 rfsw.input();
Wayne Roberts 0:9c052ff8dd6a 108 if (rfsw.read()) {
Wayne Roberts 0:9c052ff8dd6a 109 shield_type = SHIELD_TYPE_LAS;
Wayne Roberts 0:9c052ff8dd6a 110 printf("LAS\r\n");
Wayne Roberts 0:9c052ff8dd6a 111 } else {
Wayne Roberts 0:9c052ff8dd6a 112 shield_type = SHIELD_TYPE_MAS;
Wayne Roberts 0:9c052ff8dd6a 113 printf("MAS\r\n");
Wayne Roberts 0:9c052ff8dd6a 114 }
Wayne Roberts 0:9c052ff8dd6a 115
Wayne Roberts 0:9c052ff8dd6a 116 rfsw.output();
Wayne Roberts 0:9c052ff8dd6a 117 }
Wayne Roberts 0:9c052ff8dd6a 118
Wayne Roberts 0:9c052ff8dd6a 119 #endif /* ..SX127x_H */
Wayne Roberts 0:9c052ff8dd6a 120 #endif /* ...sx127x shield */
Wayne Roberts 0:9c052ff8dd6a 121