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