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:
Thu Jul 05 17:31:54 2018 -0700
Revision:
0:9c052ff8dd6a
Child:
5:ab124d3842a8
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 0:9c052ff8dd6a 1 #include "radio.h"
Wayne Roberts 0:9c052ff8dd6a 2
Wayne Roberts 0:9c052ff8dd6a 3 #define RADIO_RESET PC_2 //NorAm_Mote Reset_sx
Wayne Roberts 0:9c052ff8dd6a 4 #define RADIO_MOSI PB_15 //NorAm_Mote SPI2 Mosi
Wayne Roberts 0:9c052ff8dd6a 5 #define RADIO_MISO PB_14 //NorAm_Mote SPI2 Miso
Wayne Roberts 0:9c052ff8dd6a 6 #define RADIO_SCLK PB_13 //NorAm_Mote SPI2 Clk
Wayne Roberts 0:9c052ff8dd6a 7 #define RADIO_NSS PB_12 //NorAm_Mote SPI2 Nss
Wayne Roberts 0:9c052ff8dd6a 8
Wayne Roberts 0:9c052ff8dd6a 9 #define RADIO_DIO_0 PC_6 //NorAm_Mote DIO0
Wayne Roberts 0:9c052ff8dd6a 10 #define RADIO_DIO_1 PC_10 //NorAm_Mote DIO1
Wayne Roberts 0:9c052ff8dd6a 11 #define RADIO_DIO_2 PC_8 //NorAm_Mote DIO2
Wayne Roberts 0:9c052ff8dd6a 12 #define RADIO_DIO_3 PB_4 //NorAm_Mote DIO3
Wayne Roberts 0:9c052ff8dd6a 13 #define RADIO_DIO_4 PB_5 //NorAm_Mote DIO4
Wayne Roberts 0:9c052ff8dd6a 14 #define RADIO_DIO_5 PB_6 //NorAm_Mote DIO5
Wayne Roberts 0:9c052ff8dd6a 15
Wayne Roberts 0:9c052ff8dd6a 16 #define RFSW1 PC_4 //NorAm_Mote RFSwitch_CNTR_1
Wayne Roberts 0:9c052ff8dd6a 17 #define RFSW2 PC_13 //NorAm_Mote RFSwitch_CNTR_2
Wayne Roberts 0:9c052ff8dd6a 18
Wayne Roberts 0:9c052ff8dd6a 19 // txpow: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Wayne Roberts 0:9c052ff8dd6a 20 const uint8_t PaBTable[20] = { 0, 0, 0, 0, 0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15 };
Wayne Roberts 0:9c052ff8dd6a 21
Wayne Roberts 0:9c052ff8dd6a 22 // txpow: 20 21 22 23 24 25 26 27 28 29 30
Wayne Roberts 0:9c052ff8dd6a 23 const uint8_t RfoTable[11] = { 1, 1, 1, 2, 2, 3, 4, 5, 6, 8, 9 };
Wayne Roberts 0:9c052ff8dd6a 24
Wayne Roberts 0:9c052ff8dd6a 25 SPI spi(RADIO_MOSI, RADIO_MISO, RADIO_SCLK); // mosi, miso, sclk
Wayne Roberts 0:9c052ff8dd6a 26 // dio0, dio1, nss, spi, rst
Wayne Roberts 0:9c052ff8dd6a 27 SX127x Radio::radio(RADIO_DIO_0, RADIO_DIO_1, RADIO_NSS, spi, RADIO_RESET); // sx1276 arduino shield
Wayne Roberts 0:9c052ff8dd6a 28 SX127x_lora Radio::lora(radio);
Wayne Roberts 0:9c052ff8dd6a 29 SX127x_fsk Radio::fsk(radio);
Wayne Roberts 0:9c052ff8dd6a 30
Wayne Roberts 0:9c052ff8dd6a 31 DigitalOut rfsw1(RFSW1);
Wayne Roberts 0:9c052ff8dd6a 32 DigitalOut rfsw2(RFSW2);
Wayne Roberts 0:9c052ff8dd6a 33
Wayne Roberts 0:9c052ff8dd6a 34 InterruptIn Radio::dio0(RADIO_DIO_0);
Wayne Roberts 0:9c052ff8dd6a 35 InterruptIn Radio::dio1(RADIO_DIO_1);
Wayne Roberts 0:9c052ff8dd6a 36
Wayne Roberts 0:9c052ff8dd6a 37 DigitalOut red(LED1);
Wayne Roberts 0:9c052ff8dd6a 38 DigitalOut yellow(LED3);
Wayne Roberts 0:9c052ff8dd6a 39 #define LED_OFF 1
Wayne Roberts 0:9c052ff8dd6a 40 #define LED_ON 0
Wayne Roberts 0:9c052ff8dd6a 41
Wayne Roberts 0:9c052ff8dd6a 42 void Radio::rfsw_callback()
Wayne Roberts 0:9c052ff8dd6a 43 {
Wayne Roberts 0:9c052ff8dd6a 44 if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) { // start of transmission
Wayne Roberts 0:9c052ff8dd6a 45 red = LED_ON;
Wayne Roberts 0:9c052ff8dd6a 46 yellow = LED_OFF;
Wayne Roberts 0:9c052ff8dd6a 47 if (radio.HF) {
Wayne Roberts 0:9c052ff8dd6a 48 if (radio.RegPaConfig.bits.PaSelect) { // if PA_BOOST
Wayne Roberts 0:9c052ff8dd6a 49 rfsw2 = 0;
Wayne Roberts 0:9c052ff8dd6a 50 rfsw1 = 1;
Wayne Roberts 0:9c052ff8dd6a 51 } else { // RFO to power amp
Wayne Roberts 0:9c052ff8dd6a 52 rfsw2 = 1;
Wayne Roberts 0:9c052ff8dd6a 53 rfsw1 = 0;
Wayne Roberts 0:9c052ff8dd6a 54 }
Wayne Roberts 0:9c052ff8dd6a 55 } else {
Wayne Roberts 0:9c052ff8dd6a 56 // todo: sx1276
Wayne Roberts 0:9c052ff8dd6a 57 }
Wayne Roberts 0:9c052ff8dd6a 58 } else if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE || radio.RegOpMode.bits.Mode == RF_OPMODE_CAD) { // start of reception
Wayne Roberts 0:9c052ff8dd6a 59 red = LED_OFF;
Wayne Roberts 0:9c052ff8dd6a 60 yellow = LED_ON;
Wayne Roberts 0:9c052ff8dd6a 61 if (radio.HF) {
Wayne Roberts 0:9c052ff8dd6a 62 rfsw2 = 1;
Wayne Roberts 0:9c052ff8dd6a 63 rfsw1 = 1;
Wayne Roberts 0:9c052ff8dd6a 64 } else {
Wayne Roberts 0:9c052ff8dd6a 65 // todo: sx1276
Wayne Roberts 0:9c052ff8dd6a 66 }
Wayne Roberts 0:9c052ff8dd6a 67 } else { // RF switch shutdown
Wayne Roberts 0:9c052ff8dd6a 68 yellow = LED_OFF;
Wayne Roberts 0:9c052ff8dd6a 69 red = LED_OFF;
Wayne Roberts 0:9c052ff8dd6a 70 rfsw2 = 0;
Wayne Roberts 0:9c052ff8dd6a 71 rfsw1 = 0;
Wayne Roberts 0:9c052ff8dd6a 72 }
Wayne Roberts 0:9c052ff8dd6a 73 }
Wayne Roberts 0:9c052ff8dd6a 74
Wayne Roberts 0:9c052ff8dd6a 75 void
Wayne Roberts 0:9c052ff8dd6a 76 Radio::set_tx_dbm(int8_t dbm)
Wayne Roberts 0:9c052ff8dd6a 77 {
Wayne Roberts 0:9c052ff8dd6a 78 //int i = dbm;
Wayne Roberts 0:9c052ff8dd6a 79 RegPdsTrim1_t pds_trim;
Wayne Roberts 0:9c052ff8dd6a 80 uint8_t adr;
Wayne Roberts 0:9c052ff8dd6a 81
Wayne Roberts 0:9c052ff8dd6a 82 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
Wayne Roberts 0:9c052ff8dd6a 83
Wayne Roberts 0:9c052ff8dd6a 84 if (dbm < 20) {
Wayne Roberts 0:9c052ff8dd6a 85 radio.RegPaConfig.bits.PaSelect = 1;
Wayne Roberts 0:9c052ff8dd6a 86 if (dbm < 0)
Wayne Roberts 0:9c052ff8dd6a 87 dbm = 0;
Wayne Roberts 0:9c052ff8dd6a 88 radio.RegPaConfig.bits.OutputPower = PaBTable[dbm];
Wayne Roberts 0:9c052ff8dd6a 89 } else {
Wayne Roberts 0:9c052ff8dd6a 90 radio.RegPaConfig.bits.PaSelect = 0;
Wayne Roberts 0:9c052ff8dd6a 91 if (dbm > 30)
Wayne Roberts 0:9c052ff8dd6a 92 dbm = 30;
Wayne Roberts 0:9c052ff8dd6a 93 radio.RegPaConfig.bits.OutputPower = RfoTable[dbm-20];
Wayne Roberts 0:9c052ff8dd6a 94 }
Wayne Roberts 0:9c052ff8dd6a 95
Wayne Roberts 0:9c052ff8dd6a 96 if (radio.type == SX1276)
Wayne Roberts 0:9c052ff8dd6a 97 adr = REG_PDSTRIM1_SX1276;
Wayne Roberts 0:9c052ff8dd6a 98 else
Wayne Roberts 0:9c052ff8dd6a 99 adr = REG_PDSTRIM1_SX1272;
Wayne Roberts 0:9c052ff8dd6a 100
Wayne Roberts 0:9c052ff8dd6a 101 pds_trim.octet = radio.read_reg(adr);
Wayne Roberts 0:9c052ff8dd6a 102
Wayne Roberts 0:9c052ff8dd6a 103 if (radio.RegPaConfig.bits.PaSelect) {
Wayne Roberts 0:9c052ff8dd6a 104 /* PABOOST used: +2dbm to +17, or +20 */
Wayne Roberts 0:9c052ff8dd6a 105 if (dbm == 20) {
Wayne Roberts 0:9c052ff8dd6a 106 dbm -= 3;
Wayne Roberts 0:9c052ff8dd6a 107 pds_trim.bits.prog_txdac = 7;
Wayne Roberts 0:9c052ff8dd6a 108 radio.write_reg(adr, pds_trim.octet);
Wayne Roberts 0:9c052ff8dd6a 109 ocp(150);
Wayne Roberts 0:9c052ff8dd6a 110 } else if (dbm < 18) {
Wayne Roberts 0:9c052ff8dd6a 111 pds_trim.bits.prog_txdac = 5;
Wayne Roberts 0:9c052ff8dd6a 112 radio.write_reg(adr, pds_trim.octet);
Wayne Roberts 0:9c052ff8dd6a 113 ocp(120);
Wayne Roberts 0:9c052ff8dd6a 114 }
Wayne Roberts 0:9c052ff8dd6a 115 } else
Wayne Roberts 0:9c052ff8dd6a 116 ocp(80);
Wayne Roberts 0:9c052ff8dd6a 117
Wayne Roberts 0:9c052ff8dd6a 118 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
Wayne Roberts 0:9c052ff8dd6a 119 } // ..set_tx_dbm()
Wayne Roberts 0:9c052ff8dd6a 120
Wayne Roberts 0:9c052ff8dd6a 121 void Radio::boardInit()
Wayne Roberts 0:9c052ff8dd6a 122 {
Wayne Roberts 0:9c052ff8dd6a 123 red = LED_OFF;
Wayne Roberts 0:9c052ff8dd6a 124 yellow = LED_OFF;
Wayne Roberts 0:9c052ff8dd6a 125 }
Wayne Roberts 0:9c052ff8dd6a 126