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