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:
Mon Aug 20 14:07:47 2018 -0700
Revision:
4:57080d572494
Parent:
3:122af639cf0b
Child:
5:ab124d3842a8
tx continuous renamed to tx carrier

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 0:9c052ff8dd6a 1 #include "radio.h"
Wayne Roberts 0:9c052ff8dd6a 2 #ifdef SX126x_H
Wayne Roberts 0:9c052ff8dd6a 3 #include "SPIu.h"
Wayne Roberts 0:9c052ff8dd6a 4
Wayne Roberts 0:9c052ff8dd6a 5 LowPowerTimer Radio::lpt;
Wayne Roberts 0:9c052ff8dd6a 6 volatile us_timestamp_t Radio::irqAt;
Wayne Roberts 0:9c052ff8dd6a 7
Wayne Roberts 0:9c052ff8dd6a 8 #ifdef TARGET_FF_ARDUINO
Wayne Roberts 0:9c052ff8dd6a 9 SPIu spi(D11, D12, D13); // mosi, miso, sclk
Wayne Roberts 0:9c052ff8dd6a 10 //spi, nss, busy, dio1
Wayne Roberts 0:9c052ff8dd6a 11 SX126x Radio::radio(spi, D7, D3, D5);
Wayne Roberts 0:9c052ff8dd6a 12
Wayne Roberts 0:9c052ff8dd6a 13 DigitalOut antswPower(D8);
Wayne Roberts 0:9c052ff8dd6a 14 AnalogIn xtalSel(A3);
Wayne Roberts 0:9c052ff8dd6a 15
Wayne Roberts 2:c321b5919516 16 DigitalIn Radio::chipType(A2);
Wayne Roberts 0:9c052ff8dd6a 17
Wayne Roberts 0:9c052ff8dd6a 18 #define PINNAME_NRST A0
Wayne Roberts 0:9c052ff8dd6a 19
Wayne Roberts 0:9c052ff8dd6a 20 #define LED_ON 1
Wayne Roberts 0:9c052ff8dd6a 21 #define LED_OFF 0
Wayne Roberts 0:9c052ff8dd6a 22 DigitalOut tx_led(A4);
Wayne Roberts 0:9c052ff8dd6a 23 DigitalOut rx_led(A5);
Wayne Roberts 0:9c052ff8dd6a 24
Wayne Roberts 0:9c052ff8dd6a 25 void Radio::chipModeChange()
Wayne Roberts 0:9c052ff8dd6a 26 {
Wayne Roberts 0:9c052ff8dd6a 27 if (radio.chipMode == CHIPMODE_NONE) {
Wayne Roberts 0:9c052ff8dd6a 28 tx_led = LED_OFF;
Wayne Roberts 0:9c052ff8dd6a 29 rx_led = LED_OFF;
Wayne Roberts 0:9c052ff8dd6a 30 } else if (radio.chipMode == CHIPMODE_TX) {
Wayne Roberts 0:9c052ff8dd6a 31 tx_led = LED_ON;
Wayne Roberts 0:9c052ff8dd6a 32 rx_led = LED_OFF;
Wayne Roberts 0:9c052ff8dd6a 33 } else if (radio.chipMode == CHIPMODE_RX) {
Wayne Roberts 0:9c052ff8dd6a 34 tx_led = LED_OFF;
Wayne Roberts 0:9c052ff8dd6a 35 rx_led = LED_ON;
Wayne Roberts 0:9c052ff8dd6a 36 }
Wayne Roberts 0:9c052ff8dd6a 37 }
Wayne Roberts 0:9c052ff8dd6a 38 #endif /* TARGET_FF_ARDUINO */
Wayne Roberts 0:9c052ff8dd6a 39
Wayne Roberts 0:9c052ff8dd6a 40 const RadioEvents_t* RadioEvents;
Wayne Roberts 0:9c052ff8dd6a 41 PacketParams_t Radio::pp;
Wayne Roberts 0:9c052ff8dd6a 42 RadioModems_t Radio::_m_;
Wayne Roberts 0:9c052ff8dd6a 43
Wayne Roberts 3:122af639cf0b 44 #if defined(TARGET_FF_MORPHO) && !defined(TARGET_DISCO_L072CZ_LRWAN1)
Wayne Roberts 0:9c052ff8dd6a 45 DigitalOut pc3(PC_3); // debug RX indication, for nucleo boards
Wayne Roberts 3:122af639cf0b 46 #define RX_INDICATION pc3
Wayne Roberts 0:9c052ff8dd6a 47 #endif /* TARGET_FF_MORPHO */
Wayne Roberts 0:9c052ff8dd6a 48
Wayne Roberts 0:9c052ff8dd6a 49 void Radio::Rx(unsigned timeout)
Wayne Roberts 0:9c052ff8dd6a 50 {
Wayne Roberts 0:9c052ff8dd6a 51 antswPower = 1;
Wayne Roberts 0:9c052ff8dd6a 52
Wayne Roberts 0:9c052ff8dd6a 53 {
Wayne Roberts 0:9c052ff8dd6a 54 uint8_t buf[8];
Wayne Roberts 0:9c052ff8dd6a 55 IrqFlags_t irqEnable;
Wayne Roberts 0:9c052ff8dd6a 56 irqEnable.word = 0;
Wayne Roberts 0:9c052ff8dd6a 57 irqEnable.bits.RxDone = 1;
Wayne Roberts 0:9c052ff8dd6a 58 irqEnable.bits.Timeout = 1;
Wayne Roberts 0:9c052ff8dd6a 59
Wayne Roberts 0:9c052ff8dd6a 60 buf[0] = irqEnable.word >> 8; // enable bits
Wayne Roberts 0:9c052ff8dd6a 61 buf[1] = irqEnable.word; // enable bits
Wayne Roberts 0:9c052ff8dd6a 62 buf[2] = irqEnable.word >> 8; // dio1
Wayne Roberts 0:9c052ff8dd6a 63 buf[3] = irqEnable.word; // dio1
Wayne Roberts 0:9c052ff8dd6a 64 buf[4] = 0; // dio2
Wayne Roberts 0:9c052ff8dd6a 65 buf[5] = 0; // dio2
Wayne Roberts 0:9c052ff8dd6a 66 buf[6] = 0; // dio3
Wayne Roberts 0:9c052ff8dd6a 67 buf[7] = 0; // dio3
Wayne Roberts 0:9c052ff8dd6a 68 radio.xfer(OPCODE_SET_DIO_IRQ_PARAMS, 8, 0, buf);
Wayne Roberts 0:9c052ff8dd6a 69 }
Wayne Roberts 0:9c052ff8dd6a 70
Wayne Roberts 3:122af639cf0b 71 #ifdef RX_INDICATION
Wayne Roberts 3:122af639cf0b 72 RX_INDICATION = 1;
Wayne Roberts 3:122af639cf0b 73 #endif
Wayne Roberts 0:9c052ff8dd6a 74 if (timeout == 0)
Wayne Roberts 0:9c052ff8dd6a 75 radio.start_rx(RX_TIMEOUT_CONTINUOUS);
Wayne Roberts 0:9c052ff8dd6a 76 else
Wayne Roberts 0:9c052ff8dd6a 77 radio.start_rx(timeout * RC_TICKS_PER_US);
Wayne Roberts 0:9c052ff8dd6a 78 }
Wayne Roberts 0:9c052ff8dd6a 79
Wayne Roberts 0:9c052ff8dd6a 80 void Radio::Standby()
Wayne Roberts 0:9c052ff8dd6a 81 {
Wayne Roberts 0:9c052ff8dd6a 82 radio.setStandby(STBY_RC); // STBY_XOSC
Wayne Roberts 0:9c052ff8dd6a 83
Wayne Roberts 0:9c052ff8dd6a 84 antswPower = 0;
Wayne Roberts 0:9c052ff8dd6a 85 }
Wayne Roberts 0:9c052ff8dd6a 86
Wayne Roberts 0:9c052ff8dd6a 87 void Radio::Sleep()
Wayne Roberts 0:9c052ff8dd6a 88 {
Wayne Roberts 0:9c052ff8dd6a 89 radio.setSleep(true, false);
Wayne Roberts 0:9c052ff8dd6a 90
Wayne Roberts 0:9c052ff8dd6a 91 antswPower = 0;
Wayne Roberts 0:9c052ff8dd6a 92 }
Wayne Roberts 0:9c052ff8dd6a 93
Wayne Roberts 0:9c052ff8dd6a 94 void Radio::set_tx_dbm(int8_t dbm)
Wayne Roberts 0:9c052ff8dd6a 95 {
Wayne Roberts 0:9c052ff8dd6a 96 radio.set_tx_dbm(chipType == CHIP_TYPE_SX1262, dbm);
Wayne Roberts 0:9c052ff8dd6a 97 }
Wayne Roberts 0:9c052ff8dd6a 98
Wayne Roberts 0:9c052ff8dd6a 99 void Radio::SetTxContinuousWave(unsigned hz, int8_t dbm, unsigned timeout_us)
Wayne Roberts 0:9c052ff8dd6a 100 {
Wayne Roberts 0:9c052ff8dd6a 101 SetChannel(hz);
Wayne Roberts 0:9c052ff8dd6a 102 radio.set_tx_dbm(chipType == CHIP_TYPE_SX1262, dbm);
Wayne Roberts 4:57080d572494 103 radio.xfer(OPCODE_SET_TX_CARRIER, 0, 0, NULL);
Wayne Roberts 0:9c052ff8dd6a 104 }
Wayne Roberts 0:9c052ff8dd6a 105
Wayne Roberts 0:9c052ff8dd6a 106 uint32_t Radio::Random(void)
Wayne Roberts 0:9c052ff8dd6a 107 {
Wayne Roberts 0:9c052ff8dd6a 108 uint32_t ret;
Wayne Roberts 0:9c052ff8dd6a 109
Wayne Roberts 0:9c052ff8dd6a 110 radio.start_rx(RX_TIMEOUT_CONTINUOUS);
Wayne Roberts 0:9c052ff8dd6a 111
Wayne Roberts 0:9c052ff8dd6a 112 ret = radio.readReg(REG_ADDR_RANDOM, 4);
Wayne Roberts 0:9c052ff8dd6a 113
Wayne Roberts 0:9c052ff8dd6a 114 Standby();
Wayne Roberts 0:9c052ff8dd6a 115
Wayne Roberts 0:9c052ff8dd6a 116 return ret;
Wayne Roberts 0:9c052ff8dd6a 117 }
Wayne Roberts 0:9c052ff8dd6a 118
Wayne Roberts 0:9c052ff8dd6a 119 bool Radio::CheckRfFrequency(unsigned hz)
Wayne Roberts 0:9c052ff8dd6a 120 {
Wayne Roberts 0:9c052ff8dd6a 121 return true;
Wayne Roberts 0:9c052ff8dd6a 122 }
Wayne Roberts 0:9c052ff8dd6a 123
Wayne Roberts 0:9c052ff8dd6a 124 void Radio::SetChannel(unsigned hz)
Wayne Roberts 0:9c052ff8dd6a 125 {
Wayne Roberts 0:9c052ff8dd6a 126 radio.setMHz(hz / 1000000.0);
Wayne Roberts 0:9c052ff8dd6a 127 }
Wayne Roberts 0:9c052ff8dd6a 128
Wayne Roberts 0:9c052ff8dd6a 129 float Radio::getFrfMHz()
Wayne Roberts 0:9c052ff8dd6a 130 {
Wayne Roberts 0:9c052ff8dd6a 131 return radio.getMHz();
Wayne Roberts 0:9c052ff8dd6a 132 }
Wayne Roberts 0:9c052ff8dd6a 133
Wayne Roberts 0:9c052ff8dd6a 134 void Radio::LoRaPacketConfig(unsigned preambleLen, bool fixLen, bool crcOn, bool invIQ)
Wayne Roberts 0:9c052ff8dd6a 135 {
Wayne Roberts 0:9c052ff8dd6a 136 if (radio.getPacketType() != PACKET_TYPE_LORA)
Wayne Roberts 0:9c052ff8dd6a 137 radio.setPacketType(PACKET_TYPE_LORA);
Wayne Roberts 0:9c052ff8dd6a 138
Wayne Roberts 0:9c052ff8dd6a 139 pp.lora.PreambleLengthHi = preambleLen >> 8;
Wayne Roberts 0:9c052ff8dd6a 140 pp.lora.PreambleLengthLo = preambleLen;
Wayne Roberts 0:9c052ff8dd6a 141 pp.lora.HeaderType = fixLen;
Wayne Roberts 0:9c052ff8dd6a 142 pp.lora.CRCType = crcOn;
Wayne Roberts 0:9c052ff8dd6a 143 pp.lora.InvertIQ = invIQ;
Wayne Roberts 0:9c052ff8dd6a 144
Wayne Roberts 0:9c052ff8dd6a 145 radio.xfer(OPCODE_SET_PACKET_PARAMS, 6, 0, pp.buf);
Wayne Roberts 0:9c052ff8dd6a 146 }
Wayne Roberts 0:9c052ff8dd6a 147
Wayne Roberts 0:9c052ff8dd6a 148 void Radio::GFSKModemConfig(unsigned bps, unsigned bw_hz, unsigned fdev_hz)
Wayne Roberts 0:9c052ff8dd6a 149 {
Wayne Roberts 0:9c052ff8dd6a 150 ModulationParams_t mp;
Wayne Roberts 0:9c052ff8dd6a 151 uint32_t u32;
Wayne Roberts 0:9c052ff8dd6a 152
Wayne Roberts 0:9c052ff8dd6a 153 if (radio.getPacketType() != PACKET_TYPE_GFSK)
Wayne Roberts 0:9c052ff8dd6a 154 radio.setPacketType(PACKET_TYPE_GFSK);
Wayne Roberts 0:9c052ff8dd6a 155
Wayne Roberts 0:9c052ff8dd6a 156 u32 = 32 * (XTAL_FREQ_HZ / bps);
Wayne Roberts 0:9c052ff8dd6a 157 mp.gfsk.bitrateHi = u32 >> 16; // param1
Wayne Roberts 0:9c052ff8dd6a 158 mp.gfsk.bitrateMid = u32 >> 8; // param2
Wayne Roberts 0:9c052ff8dd6a 159 mp.gfsk.bitrateLo = u32; // param3
Wayne Roberts 0:9c052ff8dd6a 160 mp.gfsk.PulseShape = GFSK_SHAPE_BT1_0; // param4
Wayne Roberts 0:9c052ff8dd6a 161 // param5:
Wayne Roberts 0:9c052ff8dd6a 162 if (bw_hz < 5800)
Wayne Roberts 0:9c052ff8dd6a 163 mp.gfsk.bandwidth = GFSK_RX_BW_4800;
Wayne Roberts 0:9c052ff8dd6a 164 else if (bw_hz < 7300)
Wayne Roberts 0:9c052ff8dd6a 165 mp.gfsk.bandwidth = GFSK_RX_BW_5800;
Wayne Roberts 0:9c052ff8dd6a 166 else if (bw_hz < 9700)
Wayne Roberts 0:9c052ff8dd6a 167 mp.gfsk.bandwidth = GFSK_RX_BW_7300;
Wayne Roberts 0:9c052ff8dd6a 168 else if (bw_hz < 11700)
Wayne Roberts 0:9c052ff8dd6a 169 mp.gfsk.bandwidth = GFSK_RX_BW_9700;
Wayne Roberts 0:9c052ff8dd6a 170 else if (bw_hz < 14600)
Wayne Roberts 0:9c052ff8dd6a 171 mp.gfsk.bandwidth = GFSK_RX_BW_11700;
Wayne Roberts 0:9c052ff8dd6a 172 else if (bw_hz < 19500)
Wayne Roberts 0:9c052ff8dd6a 173 mp.gfsk.bandwidth = GFSK_RX_BW_14600;
Wayne Roberts 0:9c052ff8dd6a 174 else if (bw_hz < 23400)
Wayne Roberts 0:9c052ff8dd6a 175 mp.gfsk.bandwidth = GFSK_RX_BW_19500;
Wayne Roberts 0:9c052ff8dd6a 176 else if (bw_hz < 29300)
Wayne Roberts 0:9c052ff8dd6a 177 mp.gfsk.bandwidth = GFSK_RX_BW_23400;
Wayne Roberts 0:9c052ff8dd6a 178 else if (bw_hz < 39000)
Wayne Roberts 0:9c052ff8dd6a 179 mp.gfsk.bandwidth = GFSK_RX_BW_29300;
Wayne Roberts 0:9c052ff8dd6a 180 else if (bw_hz < 46900)
Wayne Roberts 0:9c052ff8dd6a 181 mp.gfsk.bandwidth = GFSK_RX_BW_39000;
Wayne Roberts 0:9c052ff8dd6a 182 else if (bw_hz < 58600)
Wayne Roberts 0:9c052ff8dd6a 183 mp.gfsk.bandwidth = GFSK_RX_BW_46900;
Wayne Roberts 0:9c052ff8dd6a 184 else if (bw_hz < 78200)
Wayne Roberts 0:9c052ff8dd6a 185 mp.gfsk.bandwidth = GFSK_RX_BW_58600;
Wayne Roberts 0:9c052ff8dd6a 186 else if (bw_hz < 93800)
Wayne Roberts 0:9c052ff8dd6a 187 mp.gfsk.bandwidth = GFSK_RX_BW_78200;
Wayne Roberts 0:9c052ff8dd6a 188 else if (bw_hz < 117300)
Wayne Roberts 0:9c052ff8dd6a 189 mp.gfsk.bandwidth = GFSK_RX_BW_93800;
Wayne Roberts 0:9c052ff8dd6a 190 else if (bw_hz < 156200)
Wayne Roberts 0:9c052ff8dd6a 191 mp.gfsk.bandwidth = GFSK_RX_BW_117300;
Wayne Roberts 0:9c052ff8dd6a 192 else if (bw_hz < 187200)
Wayne Roberts 0:9c052ff8dd6a 193 mp.gfsk.bandwidth = GFSK_RX_BW_156200;
Wayne Roberts 0:9c052ff8dd6a 194 else if (bw_hz < 234300)
Wayne Roberts 0:9c052ff8dd6a 195 mp.gfsk.bandwidth = GFSK_RX_BW_187200;
Wayne Roberts 0:9c052ff8dd6a 196 else if (bw_hz < 312000)
Wayne Roberts 0:9c052ff8dd6a 197 mp.gfsk.bandwidth = GFSK_RX_BW_234300;
Wayne Roberts 0:9c052ff8dd6a 198 else if (bw_hz < 373600)
Wayne Roberts 0:9c052ff8dd6a 199 mp.gfsk.bandwidth = GFSK_RX_BW_312000;
Wayne Roberts 0:9c052ff8dd6a 200 else if (bw_hz < 467000)
Wayne Roberts 0:9c052ff8dd6a 201 mp.gfsk.bandwidth = GFSK_RX_BW_373600;
Wayne Roberts 0:9c052ff8dd6a 202 else
Wayne Roberts 0:9c052ff8dd6a 203 mp.gfsk.bandwidth = GFSK_RX_BW_467000;
Wayne Roberts 0:9c052ff8dd6a 204
Wayne Roberts 0:9c052ff8dd6a 205 if (fdev_hz > 0) {
Wayne Roberts 0:9c052ff8dd6a 206 u32 = fdev_hz / FREQ_STEP;
Wayne Roberts 0:9c052ff8dd6a 207 mp.gfsk.fdevHi = u32 >> 16; // param6
Wayne Roberts 0:9c052ff8dd6a 208 mp.gfsk.fdevMid = u32 >> 8; // param7
Wayne Roberts 0:9c052ff8dd6a 209 mp.gfsk.fdevLo = u32; // param8
Wayne Roberts 0:9c052ff8dd6a 210 }
Wayne Roberts 0:9c052ff8dd6a 211
Wayne Roberts 0:9c052ff8dd6a 212 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 8, 0, mp.buf);
Wayne Roberts 0:9c052ff8dd6a 213 }
Wayne Roberts 0:9c052ff8dd6a 214
Wayne Roberts 0:9c052ff8dd6a 215 void Radio::GFSKPacketConfig(unsigned preambleLen, bool fixLen, bool crcOn)
Wayne Roberts 0:9c052ff8dd6a 216 {
Wayne Roberts 0:9c052ff8dd6a 217 if (radio.getPacketType() != PACKET_TYPE_GFSK)
Wayne Roberts 0:9c052ff8dd6a 218 radio.setPacketType(PACKET_TYPE_GFSK);
Wayne Roberts 0:9c052ff8dd6a 219
Wayne Roberts 0:9c052ff8dd6a 220 pp.gfsk.PreambleLengthHi = preambleLen >> 8;
Wayne Roberts 0:9c052ff8dd6a 221 pp.gfsk.PreambleLengthLo = preambleLen;
Wayne Roberts 0:9c052ff8dd6a 222 pp.gfsk.PreambleDetectorLength = GFSK_PREAMBLE_DETECTOR_LENGTH_16BITS;
Wayne Roberts 0:9c052ff8dd6a 223 pp.gfsk.SyncWordLength = 24; // 0xC194C1
Wayne Roberts 0:9c052ff8dd6a 224 pp.gfsk.AddrComp = 0;
Wayne Roberts 0:9c052ff8dd6a 225 pp.gfsk.PacketType = fixLen;
Wayne Roberts 0:9c052ff8dd6a 226 if (crcOn)
Wayne Roberts 0:9c052ff8dd6a 227 pp.gfsk.CRCType = GFSK_CRC_2_BYTE;
Wayne Roberts 0:9c052ff8dd6a 228 else
Wayne Roberts 0:9c052ff8dd6a 229 pp.gfsk.CRCType = GFSK_CRC_OFF;
Wayne Roberts 0:9c052ff8dd6a 230
Wayne Roberts 0:9c052ff8dd6a 231 //TODO pp.gfsk.PayloadLength = ;
Wayne Roberts 0:9c052ff8dd6a 232
Wayne Roberts 0:9c052ff8dd6a 233 radio.xfer(OPCODE_SET_PACKET_PARAMS, 8, 0, pp.buf);
Wayne Roberts 0:9c052ff8dd6a 234 }
Wayne Roberts 0:9c052ff8dd6a 235
Wayne Roberts 0:9c052ff8dd6a 236 void Radio::LoRaModemConfig(unsigned bwKHz, uint8_t sf, uint8_t cr)
Wayne Roberts 0:9c052ff8dd6a 237 {
Wayne Roberts 0:9c052ff8dd6a 238 ModulationParams_t mp;
Wayne Roberts 0:9c052ff8dd6a 239 float khz, sp;
Wayne Roberts 0:9c052ff8dd6a 240
Wayne Roberts 0:9c052ff8dd6a 241 if (radio.getPacketType() != PACKET_TYPE_LORA)
Wayne Roberts 0:9c052ff8dd6a 242 radio.setPacketType(PACKET_TYPE_LORA);
Wayne Roberts 0:9c052ff8dd6a 243
Wayne Roberts 0:9c052ff8dd6a 244 if (bwKHz > 250) {
Wayne Roberts 0:9c052ff8dd6a 245 mp.lora.bandwidth = LORA_BW_500;
Wayne Roberts 0:9c052ff8dd6a 246 khz = 500;
Wayne Roberts 0:9c052ff8dd6a 247 } else if (bwKHz > 125) {
Wayne Roberts 0:9c052ff8dd6a 248 mp.lora.bandwidth = LORA_BW_250;
Wayne Roberts 0:9c052ff8dd6a 249 khz = 250;
Wayne Roberts 0:9c052ff8dd6a 250 } else if (bwKHz > 63) {
Wayne Roberts 0:9c052ff8dd6a 251 mp.lora.bandwidth = LORA_BW_125;
Wayne Roberts 0:9c052ff8dd6a 252 khz = 125;
Wayne Roberts 0:9c052ff8dd6a 253 } else if (bwKHz > 42) {
Wayne Roberts 0:9c052ff8dd6a 254 mp.lora.bandwidth = LORA_BW_62;
Wayne Roberts 0:9c052ff8dd6a 255 khz = 62.5;
Wayne Roberts 0:9c052ff8dd6a 256 } else if (bwKHz > 32) {
Wayne Roberts 0:9c052ff8dd6a 257 mp.lora.bandwidth = LORA_BW_41;
Wayne Roberts 0:9c052ff8dd6a 258 khz = 41.67;
Wayne Roberts 0:9c052ff8dd6a 259 } else if (bwKHz > 21) {
Wayne Roberts 0:9c052ff8dd6a 260 mp.lora.bandwidth = LORA_BW_31;
Wayne Roberts 0:9c052ff8dd6a 261 khz = 31.25;
Wayne Roberts 0:9c052ff8dd6a 262 } else if (bwKHz > 16) {
Wayne Roberts 0:9c052ff8dd6a 263 mp.lora.bandwidth = LORA_BW_20;
Wayne Roberts 0:9c052ff8dd6a 264 khz = 20.83;
Wayne Roberts 0:9c052ff8dd6a 265 } else if (bwKHz > 11) {
Wayne Roberts 0:9c052ff8dd6a 266 mp.lora.bandwidth = LORA_BW_15;
Wayne Roberts 0:9c052ff8dd6a 267 khz = 15.625;
Wayne Roberts 0:9c052ff8dd6a 268 } else if (bwKHz > 11) {
Wayne Roberts 0:9c052ff8dd6a 269 mp.lora.bandwidth = LORA_BW_10;
Wayne Roberts 0:9c052ff8dd6a 270 khz = 10.42;
Wayne Roberts 0:9c052ff8dd6a 271 } else {
Wayne Roberts 0:9c052ff8dd6a 272 mp.lora.bandwidth = LORA_BW_7;
Wayne Roberts 0:9c052ff8dd6a 273 khz = 7.81;
Wayne Roberts 0:9c052ff8dd6a 274 }
Wayne Roberts 0:9c052ff8dd6a 275
Wayne Roberts 0:9c052ff8dd6a 276 mp.lora.spreadingFactor = sf;
Wayne Roberts 0:9c052ff8dd6a 277 mp.lora.codingRate = cr;
Wayne Roberts 0:9c052ff8dd6a 278
Wayne Roberts 0:9c052ff8dd6a 279 sp = (1 << mp.lora.spreadingFactor) / khz;
Wayne Roberts 0:9c052ff8dd6a 280 /* TCXO dependent */
Wayne Roberts 0:9c052ff8dd6a 281 if (sp > 16)
Wayne Roberts 0:9c052ff8dd6a 282 mp.lora.LowDatarateOptimize = 1; // param4
Wayne Roberts 0:9c052ff8dd6a 283 else
Wayne Roberts 0:9c052ff8dd6a 284 mp.lora.LowDatarateOptimize = 0; // param4
Wayne Roberts 0:9c052ff8dd6a 285
Wayne Roberts 0:9c052ff8dd6a 286 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 4, 0, mp.buf);
Wayne Roberts 0:9c052ff8dd6a 287
Wayne Roberts 0:9c052ff8dd6a 288 }
Wayne Roberts 0:9c052ff8dd6a 289
Wayne Roberts 0:9c052ff8dd6a 290 void Radio::SetLoRaSymbolTimeout(uint8_t symbs)
Wayne Roberts 0:9c052ff8dd6a 291 {
Wayne Roberts 0:9c052ff8dd6a 292 if (radio.getPacketType() != PACKET_TYPE_LORA)
Wayne Roberts 0:9c052ff8dd6a 293 radio.setPacketType(PACKET_TYPE_LORA);
Wayne Roberts 0:9c052ff8dd6a 294
Wayne Roberts 0:9c052ff8dd6a 295 radio.xfer(OPCODE_SET_LORA_SYMBOL_TIMEOUT, 1, 0, &symbs);
Wayne Roberts 0:9c052ff8dd6a 296 }
Wayne Roberts 0:9c052ff8dd6a 297
Wayne Roberts 0:9c052ff8dd6a 298 int Radio::Send(uint8_t size, timestamp_t maxListenTime, timestamp_t channelFreeTime, int rssiThresh)
Wayne Roberts 0:9c052ff8dd6a 299 {
Wayne Roberts 0:9c052ff8dd6a 300 uint8_t buf[8];
Wayne Roberts 0:9c052ff8dd6a 301 uint8_t pktType = radio.getPacketType();
Wayne Roberts 0:9c052ff8dd6a 302
Wayne Roberts 0:9c052ff8dd6a 303 buf[0] = 0; // TX base address
Wayne Roberts 0:9c052ff8dd6a 304 buf[1] = 0; // RX base address
Wayne Roberts 0:9c052ff8dd6a 305 radio.xfer(OPCODE_SET_BUFFER_BASE_ADDR, 2, 0, buf);
Wayne Roberts 0:9c052ff8dd6a 306
Wayne Roberts 0:9c052ff8dd6a 307 if (pktType == PACKET_TYPE_GFSK) {
Wayne Roberts 0:9c052ff8dd6a 308 pp.gfsk.PayloadLength = size;
Wayne Roberts 0:9c052ff8dd6a 309 radio.xfer(OPCODE_SET_PACKET_PARAMS, 8, 0, pp.buf);
Wayne Roberts 0:9c052ff8dd6a 310 } else if (pktType == PACKET_TYPE_LORA) {
Wayne Roberts 0:9c052ff8dd6a 311 pp.lora.PayloadLength = size;
Wayne Roberts 0:9c052ff8dd6a 312 radio.xfer(OPCODE_SET_PACKET_PARAMS, 6, 0, pp.buf);
Wayne Roberts 0:9c052ff8dd6a 313 }
Wayne Roberts 0:9c052ff8dd6a 314
Wayne Roberts 0:9c052ff8dd6a 315 {
Wayne Roberts 0:9c052ff8dd6a 316 IrqFlags_t irqEnable;
Wayne Roberts 0:9c052ff8dd6a 317 irqEnable.word = 0;
Wayne Roberts 0:9c052ff8dd6a 318 irqEnable.bits.TxDone = 1;
Wayne Roberts 0:9c052ff8dd6a 319 irqEnable.bits.Timeout = 1;
Wayne Roberts 0:9c052ff8dd6a 320
Wayne Roberts 0:9c052ff8dd6a 321 buf[0] = irqEnable.word >> 8; // enable bits
Wayne Roberts 0:9c052ff8dd6a 322 buf[1] = irqEnable.word; // enable bits
Wayne Roberts 0:9c052ff8dd6a 323 buf[2] = irqEnable.word >> 8; // dio1
Wayne Roberts 0:9c052ff8dd6a 324 buf[3] = irqEnable.word; // dio1
Wayne Roberts 0:9c052ff8dd6a 325 buf[4] = 0; // dio2
Wayne Roberts 0:9c052ff8dd6a 326 buf[5] = 0; // dio2
Wayne Roberts 0:9c052ff8dd6a 327 buf[6] = 0; // dio3
Wayne Roberts 0:9c052ff8dd6a 328 buf[7] = 0; // dio3
Wayne Roberts 0:9c052ff8dd6a 329 radio.xfer(OPCODE_SET_DIO_IRQ_PARAMS, 8, 0, buf);
Wayne Roberts 0:9c052ff8dd6a 330 }
Wayne Roberts 0:9c052ff8dd6a 331
Wayne Roberts 0:9c052ff8dd6a 332 antswPower = 1;
Wayne Roberts 0:9c052ff8dd6a 333
Wayne Roberts 0:9c052ff8dd6a 334 if (maxListenTime > 0) {
Wayne Roberts 0:9c052ff8dd6a 335 int rssi;
Wayne Roberts 0:9c052ff8dd6a 336 us_timestamp_t startAt, chFreeAt, now;
Wayne Roberts 0:9c052ff8dd6a 337 uint8_t symbs = 0;
Wayne Roberts 0:9c052ff8dd6a 338
Wayne Roberts 0:9c052ff8dd6a 339 radio.xfer(OPCODE_SET_LORA_SYMBOL_TIMEOUT, 1, 0, &symbs);
Wayne Roberts 0:9c052ff8dd6a 340
Wayne Roberts 0:9c052ff8dd6a 341 radio.start_rx(RX_TIMEOUT_CONTINUOUS);
Wayne Roberts 0:9c052ff8dd6a 342 startAt = lpt.read_us();
Wayne Roberts 0:9c052ff8dd6a 343 Lstart:
Wayne Roberts 0:9c052ff8dd6a 344 do {
Wayne Roberts 0:9c052ff8dd6a 345 now = lpt.read_us();
Wayne Roberts 0:9c052ff8dd6a 346 if ((now - startAt) > maxListenTime) {
Wayne Roberts 0:9c052ff8dd6a 347 return -1;
Wayne Roberts 0:9c052ff8dd6a 348 }
Wayne Roberts 0:9c052ff8dd6a 349 radio.xfer(OPCODE_GET_RSSIINST, 0, 2, buf);
Wayne Roberts 0:9c052ff8dd6a 350 rssi = buf[1] / -2;
Wayne Roberts 0:9c052ff8dd6a 351 } while (rssi > rssiThresh);
Wayne Roberts 0:9c052ff8dd6a 352 chFreeAt = lpt.read_us();
Wayne Roberts 0:9c052ff8dd6a 353 do {
Wayne Roberts 0:9c052ff8dd6a 354 now = lpt.read_us();
Wayne Roberts 0:9c052ff8dd6a 355 radio.xfer(OPCODE_GET_RSSIINST, 0, 2, buf);
Wayne Roberts 0:9c052ff8dd6a 356 rssi = buf[1] / -2;
Wayne Roberts 0:9c052ff8dd6a 357 if (rssi > rssiThresh) {
Wayne Roberts 0:9c052ff8dd6a 358 goto Lstart;
Wayne Roberts 0:9c052ff8dd6a 359 }
Wayne Roberts 0:9c052ff8dd6a 360 } while ((now - chFreeAt) < channelFreeTime);
Wayne Roberts 0:9c052ff8dd6a 361 }
Wayne Roberts 0:9c052ff8dd6a 362
Wayne Roberts 0:9c052ff8dd6a 363 radio.start_tx(size);
Wayne Roberts 0:9c052ff8dd6a 364
Wayne Roberts 0:9c052ff8dd6a 365 return 0;
Wayne Roberts 0:9c052ff8dd6a 366 } // ..Send()
Wayne Roberts 0:9c052ff8dd6a 367
Wayne Roberts 1:e79b0a55135f 368 void Radio::SetRxMaxPayloadLength(uint8_t max)
Wayne Roberts 0:9c052ff8dd6a 369 {
Wayne Roberts 1:e79b0a55135f 370 uint8_t pktType = radio.getPacketType();
Wayne Roberts 0:9c052ff8dd6a 371
Wayne Roberts 1:e79b0a55135f 372 if (pktType == PACKET_TYPE_GFSK) {
Wayne Roberts 0:9c052ff8dd6a 373 pp.gfsk.PayloadLength = max;
Wayne Roberts 1:e79b0a55135f 374 radio.xfer(OPCODE_SET_PACKET_PARAMS, 8, 0, pp.buf);
Wayne Roberts 1:e79b0a55135f 375 } else if (pktType == PACKET_TYPE_LORA) {
Wayne Roberts 0:9c052ff8dd6a 376 pp.lora.PayloadLength = max;
Wayne Roberts 1:e79b0a55135f 377 radio.xfer(OPCODE_SET_PACKET_PARAMS, 6, 0, pp.buf);
Wayne Roberts 0:9c052ff8dd6a 378 }
Wayne Roberts 0:9c052ff8dd6a 379 }
Wayne Roberts 0:9c052ff8dd6a 380
Wayne Roberts 0:9c052ff8dd6a 381 void Radio::dio1_top_half()
Wayne Roberts 0:9c052ff8dd6a 382 {
Wayne Roberts 0:9c052ff8dd6a 383 irqAt = lpt.read_us();
Wayne Roberts 0:9c052ff8dd6a 384
Wayne Roberts 0:9c052ff8dd6a 385 if (radio.chipMode == CHIPMODE_TX) {
Wayne Roberts 0:9c052ff8dd6a 386 /* TxDone handling requires low latency */
Wayne Roberts 0:9c052ff8dd6a 387 if (RadioEvents->TxDone_topHalf) {
Wayne Roberts 0:9c052ff8dd6a 388 RadioEvents->TxDone_topHalf();
Wayne Roberts 0:9c052ff8dd6a 389 }
Wayne Roberts 0:9c052ff8dd6a 390 } else {
Wayne Roberts 3:122af639cf0b 391 #ifdef RX_INDICATION
Wayne Roberts 3:122af639cf0b 392 RX_INDICATION = 0;
Wayne Roberts 3:122af639cf0b 393 #endif
Wayne Roberts 0:9c052ff8dd6a 394 }
Wayne Roberts 0:9c052ff8dd6a 395 }
Wayne Roberts 0:9c052ff8dd6a 396
Wayne Roberts 0:9c052ff8dd6a 397 void Radio::timeout_callback(bool tx)
Wayne Roberts 0:9c052ff8dd6a 398 {
Wayne Roberts 0:9c052ff8dd6a 399 if (!tx) {
Wayne Roberts 0:9c052ff8dd6a 400 if (RadioEvents->RxTimeout)
Wayne Roberts 0:9c052ff8dd6a 401 RadioEvents->RxTimeout();
Wayne Roberts 3:122af639cf0b 402 #ifdef RX_INDICATION
Wayne Roberts 3:122af639cf0b 403 RX_INDICATION = 0;
Wayne Roberts 3:122af639cf0b 404 #endif
Wayne Roberts 0:9c052ff8dd6a 405 } // else TODO tx timeout
Wayne Roberts 0:9c052ff8dd6a 406 }
Wayne Roberts 0:9c052ff8dd6a 407
Wayne Roberts 0:9c052ff8dd6a 408 void Radio::rx_done(uint8_t size, float rssi, float snr)
Wayne Roberts 0:9c052ff8dd6a 409 {
Wayne Roberts 0:9c052ff8dd6a 410 RadioEvents->RxDone(size, rssi, snr);
Wayne Roberts 0:9c052ff8dd6a 411 }
Wayne Roberts 0:9c052ff8dd6a 412
Wayne Roberts 0:9c052ff8dd6a 413 void Radio::txDoneBottom()
Wayne Roberts 0:9c052ff8dd6a 414 {
Wayne Roberts 0:9c052ff8dd6a 415 if (RadioEvents->TxDone_botHalf)
Wayne Roberts 0:9c052ff8dd6a 416 RadioEvents->TxDone_botHalf();
Wayne Roberts 0:9c052ff8dd6a 417 }
Wayne Roberts 0:9c052ff8dd6a 418
Wayne Roberts 0:9c052ff8dd6a 419 void Radio::Init(const RadioEvents_t* e)
Wayne Roberts 0:9c052ff8dd6a 420 {
Wayne Roberts 0:9c052ff8dd6a 421 radio.txDone = txDoneBottom;
Wayne Roberts 0:9c052ff8dd6a 422 radio.rxDone = rx_done;
Wayne Roberts 0:9c052ff8dd6a 423 radio.timeout = timeout_callback;
Wayne Roberts 0:9c052ff8dd6a 424 radio.chipModeChange = chipModeChange;
Wayne Roberts 0:9c052ff8dd6a 425 radio.dio1_topHalf = dio1_top_half;
Wayne Roberts 0:9c052ff8dd6a 426
Wayne Roberts 0:9c052ff8dd6a 427 RadioEvents = e;
Wayne Roberts 0:9c052ff8dd6a 428 lpt.start();
Wayne Roberts 0:9c052ff8dd6a 429
Wayne Roberts 0:9c052ff8dd6a 430 radio.SetDIO2AsRfSwitchCtrl(1);
Wayne Roberts 0:9c052ff8dd6a 431 }
Wayne Roberts 0:9c052ff8dd6a 432
Wayne Roberts 0:9c052ff8dd6a 433 void Radio::service()
Wayne Roberts 0:9c052ff8dd6a 434 {
Wayne Roberts 0:9c052ff8dd6a 435 radio.service();
Wayne Roberts 0:9c052ff8dd6a 436 }
Wayne Roberts 0:9c052ff8dd6a 437
Wayne Roberts 0:9c052ff8dd6a 438 void Radio::SetPublicNetwork(bool en)
Wayne Roberts 0:9c052ff8dd6a 439 {
Wayne Roberts 0:9c052ff8dd6a 440 uint16_t ppg;
Wayne Roberts 0:9c052ff8dd6a 441
Wayne Roberts 0:9c052ff8dd6a 442 if (en)
Wayne Roberts 0:9c052ff8dd6a 443 ppg = 0x3444;
Wayne Roberts 0:9c052ff8dd6a 444 else
Wayne Roberts 0:9c052ff8dd6a 445 ppg = 0x1424;
Wayne Roberts 0:9c052ff8dd6a 446
Wayne Roberts 0:9c052ff8dd6a 447 radio.writeReg(REG_ADDR_LORA_SYNC, ppg, 2);
Wayne Roberts 0:9c052ff8dd6a 448 }
Wayne Roberts 0:9c052ff8dd6a 449
Wayne Roberts 0:9c052ff8dd6a 450 uint32_t Radio::lora_toa_us( uint8_t pktLen )
Wayne Roberts 0:9c052ff8dd6a 451 {
Wayne Roberts 0:9c052ff8dd6a 452 double bwKHz;
Wayne Roberts 0:9c052ff8dd6a 453 unsigned preambleLen;
Wayne Roberts 0:9c052ff8dd6a 454 ModulationParams_t mp;
Wayne Roberts 0:9c052ff8dd6a 455
Wayne Roberts 0:9c052ff8dd6a 456 {
Wayne Roberts 0:9c052ff8dd6a 457 loraConfig1_t conf1;
Wayne Roberts 0:9c052ff8dd6a 458 conf1.octet = radio.readReg(REG_ADDR_LORA_CONFIG1, 1);
Wayne Roberts 0:9c052ff8dd6a 459 mp.lora.LowDatarateOptimize = conf1.bits.ppm_offset;
Wayne Roberts 0:9c052ff8dd6a 460 pp.lora.HeaderType = conf1.bits.implicit_header;
Wayne Roberts 0:9c052ff8dd6a 461 pp.lora.InvertIQ = conf1.bits.rx_invert_iq;
Wayne Roberts 0:9c052ff8dd6a 462 mp.lora.codingRate = conf1.bits.tx_coding_rate;
Wayne Roberts 0:9c052ff8dd6a 463 }
Wayne Roberts 0:9c052ff8dd6a 464
Wayne Roberts 0:9c052ff8dd6a 465 {
Wayne Roberts 0:9c052ff8dd6a 466 loraConfig2_t conf2;
Wayne Roberts 0:9c052ff8dd6a 467 conf2.octet = radio.readReg(REG_ADDR_LORA_CONFIG2, 1);
Wayne Roberts 0:9c052ff8dd6a 468 pp.lora.CRCType = conf2.bits.tx_payload_crc16_en;
Wayne Roberts 0:9c052ff8dd6a 469 }
Wayne Roberts 0:9c052ff8dd6a 470
Wayne Roberts 0:9c052ff8dd6a 471
Wayne Roberts 0:9c052ff8dd6a 472 {
Wayne Roberts 0:9c052ff8dd6a 473 uint32_t val;
Wayne Roberts 0:9c052ff8dd6a 474 val = radio.readReg(REG_ADDR_LORA_PREAMBLE_SYMBNB, 2);
Wayne Roberts 0:9c052ff8dd6a 475 pp.lora.PreambleLengthHi = val >> 8;
Wayne Roberts 0:9c052ff8dd6a 476 pp.lora.PreambleLengthLo = val;
Wayne Roberts 0:9c052ff8dd6a 477 }
Wayne Roberts 0:9c052ff8dd6a 478
Wayne Roberts 0:9c052ff8dd6a 479 preambleLen = (pp.lora.PreambleLengthHi << 8) + pp.lora.PreambleLengthLo;
Wayne Roberts 0:9c052ff8dd6a 480
Wayne Roberts 0:9c052ff8dd6a 481 {
Wayne Roberts 0:9c052ff8dd6a 482 loraConfig0_t conf0;
Wayne Roberts 0:9c052ff8dd6a 483 conf0.octet = radio.readReg(REG_ADDR_LORA_CONFIG0, 1);
Wayne Roberts 0:9c052ff8dd6a 484 mp.lora.spreadingFactor = conf0.bits.modem_sf;
Wayne Roberts 0:9c052ff8dd6a 485 mp.lora.bandwidth = conf0.bits.modem_bw;
Wayne Roberts 0:9c052ff8dd6a 486 }
Wayne Roberts 0:9c052ff8dd6a 487
Wayne Roberts 0:9c052ff8dd6a 488 switch (mp.lora.bandwidth) {
Wayne Roberts 0:9c052ff8dd6a 489 case LORA_BW_7: bwKHz = 7.81; break;
Wayne Roberts 0:9c052ff8dd6a 490 case LORA_BW_10: bwKHz = 10.42; break;
Wayne Roberts 0:9c052ff8dd6a 491 case LORA_BW_15: bwKHz = 15.625; break;
Wayne Roberts 0:9c052ff8dd6a 492 case LORA_BW_20: bwKHz = 20.83; break;
Wayne Roberts 0:9c052ff8dd6a 493 case LORA_BW_31: bwKHz = 31.25; break;
Wayne Roberts 0:9c052ff8dd6a 494 case LORA_BW_41: bwKHz = 41.67; break;
Wayne Roberts 0:9c052ff8dd6a 495 case LORA_BW_62: bwKHz = 62.5; break;
Wayne Roberts 0:9c052ff8dd6a 496 case LORA_BW_125: bwKHz = 125; break;
Wayne Roberts 0:9c052ff8dd6a 497 case LORA_BW_250: bwKHz = 250; break;
Wayne Roberts 0:9c052ff8dd6a 498 case LORA_BW_500: bwKHz = 500; break;
Wayne Roberts 0:9c052ff8dd6a 499 default: bwKHz = 0; break;
Wayne Roberts 0:9c052ff8dd6a 500 }
Wayne Roberts 0:9c052ff8dd6a 501
Wayne Roberts 0:9c052ff8dd6a 502 // Symbol rate : time for one symbol (secs)
Wayne Roberts 0:9c052ff8dd6a 503 double rs = bwKHz / ( 1 << mp.lora.spreadingFactor );
Wayne Roberts 0:9c052ff8dd6a 504 double ts = 1 / rs;
Wayne Roberts 0:9c052ff8dd6a 505 // time of preamble
Wayne Roberts 0:9c052ff8dd6a 506 double tPreamble = ( preambleLen + 4.25 ) * ts;
Wayne Roberts 0:9c052ff8dd6a 507 // Symbol length of payload and time
Wayne Roberts 0:9c052ff8dd6a 508
Wayne Roberts 0:9c052ff8dd6a 509 double tmp = ceil( ( 8 * pktLen - 4 * mp.lora.spreadingFactor +
Wayne Roberts 0:9c052ff8dd6a 510 28 + 16 * pp.lora.CRCType -
Wayne Roberts 0:9c052ff8dd6a 511 ( pp.lora.HeaderType ? 20 : 0 ) ) /
Wayne Roberts 0:9c052ff8dd6a 512 ( double )( 4 * ( mp.lora.spreadingFactor -
Wayne Roberts 0:9c052ff8dd6a 513 ( ( mp.lora.LowDatarateOptimize > 0 ) ? 2 : 0 ) ) ) ) *
Wayne Roberts 0:9c052ff8dd6a 514 ( mp.lora.codingRate + 4 );
Wayne Roberts 0:9c052ff8dd6a 515 double nPayload = 8 + ( ( tmp > 0 ) ? tmp : 0 );
Wayne Roberts 0:9c052ff8dd6a 516 double tPayload = nPayload * ts;
Wayne Roberts 0:9c052ff8dd6a 517 // Time on air
Wayne Roberts 0:9c052ff8dd6a 518 double tOnAir = tPreamble + tPayload;
Wayne Roberts 0:9c052ff8dd6a 519 // return microseconds
Wayne Roberts 0:9c052ff8dd6a 520 return floor( tOnAir * 1000 + 0.999 );
Wayne Roberts 0:9c052ff8dd6a 521 }
Wayne Roberts 0:9c052ff8dd6a 522
Wayne Roberts 0:9c052ff8dd6a 523 #if 0
Wayne Roberts 0:9c052ff8dd6a 524 void Radio::PrintStatus()
Wayne Roberts 0:9c052ff8dd6a 525 {
Wayne Roberts 0:9c052ff8dd6a 526 /* uint8_t buf[4];
Wayne Roberts 0:9c052ff8dd6a 527 status_t status;
Wayne Roberts 0:9c052ff8dd6a 528 IrqFlags_t irqFlags;
Wayne Roberts 0:9c052ff8dd6a 529 radio.xfer(OPCODE_GET_IRQ_STATUS, 0, 3, buf);
Wayne Roberts 0:9c052ff8dd6a 530 irqFlags.word = buf[1] << 8;
Wayne Roberts 0:9c052ff8dd6a 531 irqFlags.word |= buf[2];
Wayne Roberts 0:9c052ff8dd6a 532
Wayne Roberts 0:9c052ff8dd6a 533 printf("dio1:%u irqFlags:%04x\r\n", radio.getDIO1(), irqFlags.word);
Wayne Roberts 0:9c052ff8dd6a 534 radio.xfer(OPCODE_GET_STATUS, 0, 1, &status.octet);
Wayne Roberts 0:9c052ff8dd6a 535 radio.PrintChipStatus(status);*/
Wayne Roberts 0:9c052ff8dd6a 536 {
Wayne Roberts 0:9c052ff8dd6a 537 loraConfig1_t conf1;
Wayne Roberts 0:9c052ff8dd6a 538 conf1.octet = radio.readReg(REG_ADDR_LORA_CONFIG1, 1);
Wayne Roberts 0:9c052ff8dd6a 539 printf("ldro%u %s %s cr%u\r\n",
Wayne Roberts 0:9c052ff8dd6a 540 conf1.bits.ppm_offset,
Wayne Roberts 0:9c052ff8dd6a 541 conf1.bits.implicit_header ? "fixed" : "var",
Wayne Roberts 0:9c052ff8dd6a 542 conf1.bits.rx_invert_iq ? "inv" : "std",
Wayne Roberts 0:9c052ff8dd6a 543 conf1.bits.tx_coding_rate
Wayne Roberts 0:9c052ff8dd6a 544 );
Wayne Roberts 0:9c052ff8dd6a 545 }
Wayne Roberts 0:9c052ff8dd6a 546
Wayne Roberts 0:9c052ff8dd6a 547 {
Wayne Roberts 0:9c052ff8dd6a 548 loraConfig2_t conf2;
Wayne Roberts 0:9c052ff8dd6a 549 conf2.octet = radio.readReg(REG_ADDR_LORA_CONFIG2, 1);
Wayne Roberts 0:9c052ff8dd6a 550 printf("crc16en:%u ", conf2.bits.tx_payload_crc16_en);
Wayne Roberts 0:9c052ff8dd6a 551 }
Wayne Roberts 0:9c052ff8dd6a 552
Wayne Roberts 0:9c052ff8dd6a 553
Wayne Roberts 0:9c052ff8dd6a 554 {
Wayne Roberts 0:9c052ff8dd6a 555 uint32_t val;
Wayne Roberts 0:9c052ff8dd6a 556 val = radio.readReg(REG_ADDR_LORA_PREAMBLE_SYMBNB, 2);
Wayne Roberts 0:9c052ff8dd6a 557 printf("prelen %lu ", val);
Wayne Roberts 0:9c052ff8dd6a 558 }
Wayne Roberts 0:9c052ff8dd6a 559
Wayne Roberts 0:9c052ff8dd6a 560 {
Wayne Roberts 0:9c052ff8dd6a 561 loraConfig0_t conf0;
Wayne Roberts 0:9c052ff8dd6a 562 conf0.octet = radio.readReg(REG_ADDR_LORA_CONFIG0, 1);
Wayne Roberts 0:9c052ff8dd6a 563 printf("sf%u, bw%u ", conf0.bits.modem_sf, conf0.bits.modem_bw);
Wayne Roberts 0:9c052ff8dd6a 564 }
Wayne Roberts 0:9c052ff8dd6a 565
Wayne Roberts 0:9c052ff8dd6a 566 printf("%.3fMHz\r\n", radio.getMHz());
Wayne Roberts 0:9c052ff8dd6a 567 }
Wayne Roberts 0:9c052ff8dd6a 568 #endif /* if 0 */
Wayne Roberts 0:9c052ff8dd6a 569
Wayne Roberts 0:9c052ff8dd6a 570 #endif /* ..SX126x_H */