1

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 */