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 Jul 16 11:15:59 2018 -0700
Revision:
1:e79b0a55135f
Parent:
0:9c052ff8dd6a
Child:
2:c321b5919516
update sx1280 HAL to work with current sx1280 driver

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