operate LoRa radio over I2C
Dependencies: TimeoutAbs lib_i2c_slave_block sx12xx_hal
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 NAmote72 or Murata discovery, then you must import only sx127x driver.
This project is used as slave device with i2c_lora_master on raspberry pi. This i2c_lora_slave offloads the real-time requirements onto microcontroller. Also permits multiple slave radio devices connected to master. Radio MAC layer exists on I2C master, along with application layer.
If beacon operation is enabled, I2C functions which access radio chip are blocked while beacon is loaded and transmitted.
See lib_i2c_slave_block for wiring connections.
device_sx127x.cpp@0:9eb5b8bf9f7b, 2019-02-08 (annotated)
- Committer:
- Wayne Roberts
- Date:
- Fri Feb 08 11:58:09 2019 -0800
- Revision:
- 0:9eb5b8bf9f7b
first commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Wayne Roberts |
0:9eb5b8bf9f7b | 1 | #include "radio_device.h" |
Wayne Roberts |
0:9eb5b8bf9f7b | 2 | #ifdef SX127x_H |
Wayne Roberts |
0:9eb5b8bf9f7b | 3 | void get_opmode() |
Wayne Roberts |
0:9eb5b8bf9f7b | 4 | { |
Wayne Roberts |
0:9eb5b8bf9f7b | 5 | Radio::radio.RegOpMode.octet = Radio::radio.read_reg(REG_OPMODE); |
Wayne Roberts |
0:9eb5b8bf9f7b | 6 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 7 | switch (Radio::radio.RegOpMode.bits.Mode) { |
Wayne Roberts |
0:9eb5b8bf9f7b | 8 | case RF_OPMODE_SLEEP: |
Wayne Roberts |
0:9eb5b8bf9f7b | 9 | irq.buf[1] = OPMODE_SLEEP; |
Wayne Roberts |
0:9eb5b8bf9f7b | 10 | break; |
Wayne Roberts |
0:9eb5b8bf9f7b | 11 | case RF_OPMODE_STANDBY: |
Wayne Roberts |
0:9eb5b8bf9f7b | 12 | irq.buf[1] = OPMODE_STANDBY; |
Wayne Roberts |
0:9eb5b8bf9f7b | 13 | break; |
Wayne Roberts |
0:9eb5b8bf9f7b | 14 | case RF_OPMODE_TRANSMITTER: |
Wayne Roberts |
0:9eb5b8bf9f7b | 15 | irq.buf[1] = OPMODE_TX; |
Wayne Roberts |
0:9eb5b8bf9f7b | 16 | break; |
Wayne Roberts |
0:9eb5b8bf9f7b | 17 | case RF_OPMODE_SYNTHESIZER_TX: |
Wayne Roberts |
0:9eb5b8bf9f7b | 18 | case RF_OPMODE_SYNTHESIZER_RX: |
Wayne Roberts |
0:9eb5b8bf9f7b | 19 | irq.buf[1] = OPMODE_FS; |
Wayne Roberts |
0:9eb5b8bf9f7b | 20 | break; |
Wayne Roberts |
0:9eb5b8bf9f7b | 21 | case RF_OPMODE_RECEIVER: |
Wayne Roberts |
0:9eb5b8bf9f7b | 22 | case RF_OPMODE_RECEIVER_SINGLE: |
Wayne Roberts |
0:9eb5b8bf9f7b | 23 | case RF_OPMODE_CAD: |
Wayne Roberts |
0:9eb5b8bf9f7b | 24 | irq.buf[1] = OPMODE_RX; |
Wayne Roberts |
0:9eb5b8bf9f7b | 25 | break; |
Wayne Roberts |
0:9eb5b8bf9f7b | 26 | default: |
Wayne Roberts |
0:9eb5b8bf9f7b | 27 | irq.buf[1] = OPMODE_FAIL; |
Wayne Roberts |
0:9eb5b8bf9f7b | 28 | break; |
Wayne Roberts |
0:9eb5b8bf9f7b | 29 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 30 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 31 | irq.fields.flags.irq_type = IRQ_TYPE_OPMODE; |
Wayne Roberts |
0:9eb5b8bf9f7b | 32 | irqOutPin = 1; |
Wayne Roberts |
0:9eb5b8bf9f7b | 33 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 34 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 35 | void get_lora_packet() |
Wayne Roberts |
0:9eb5b8bf9f7b | 36 | { |
Wayne Roberts |
0:9eb5b8bf9f7b | 37 | uint32_t val; |
Wayne Roberts |
0:9eb5b8bf9f7b | 38 | //LoRaPacketConfig(unsigned preambleLen, bool fixLen, bool crcOn, bool invIQ) |
Wayne Roberts |
0:9eb5b8bf9f7b | 39 | Radio::lora.RegPreamble = Radio::radio.read_u16(REG_LR_PREAMBLEMSB); |
Wayne Roberts |
0:9eb5b8bf9f7b | 40 | val = Radio::lora.RegPreamble; |
Wayne Roberts |
0:9eb5b8bf9f7b | 41 | irq.buf[1] = val & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 42 | val >>= 8; |
Wayne Roberts |
0:9eb5b8bf9f7b | 43 | irq.buf[2] = val & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 44 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 45 | irq.buf[3] = Radio::lora.getHeaderMode(); |
Wayne Roberts |
0:9eb5b8bf9f7b | 46 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 47 | Radio::lora.RegTest33.octet = Radio::radio.read_reg(REG_LR_TEST33); |
Wayne Roberts |
0:9eb5b8bf9f7b | 48 | irq.buf[4] = Radio::lora.RegTest33.bits.invert_i_q; |
Wayne Roberts |
0:9eb5b8bf9f7b | 49 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 50 | irq.buf[5] = Radio::lora.getRxPayloadCrcOn(); |
Wayne Roberts |
0:9eb5b8bf9f7b | 51 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 52 | irq.fields.flags.irq_type = IRQ_TYPE_LORA_PKT; |
Wayne Roberts |
0:9eb5b8bf9f7b | 53 | irqOutPin = 1; |
Wayne Roberts |
0:9eb5b8bf9f7b | 54 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 55 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 56 | static const unsigned* lora_bw_khz; |
Wayne Roberts |
0:9eb5b8bf9f7b | 57 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 58 | void get_lora_modem() |
Wayne Roberts |
0:9eb5b8bf9f7b | 59 | { |
Wayne Roberts |
0:9eb5b8bf9f7b | 60 | uint16_t khz = lora_bw_khz[Radio::lora.getBw()]; |
Wayne Roberts |
0:9eb5b8bf9f7b | 61 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 62 | irq.buf[1] = khz & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 63 | khz >>= 8; |
Wayne Roberts |
0:9eb5b8bf9f7b | 64 | irq.buf[2] = khz & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 65 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 66 | //LoRaModemConfig(unsigned KHz, unsigned sf, unsigned cr) |
Wayne Roberts |
0:9eb5b8bf9f7b | 67 | irq.buf[3] = Radio::lora.getSf(); |
Wayne Roberts |
0:9eb5b8bf9f7b | 68 | irq.buf[4] = Radio::lora.getCodingRate(false); |
Wayne Roberts |
0:9eb5b8bf9f7b | 69 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 70 | irq.fields.flags.irq_type = IRQ_TYPE_LORA_MODEM; |
Wayne Roberts |
0:9eb5b8bf9f7b | 71 | irqOutPin = 1; |
Wayne Roberts |
0:9eb5b8bf9f7b | 72 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 73 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 74 | void get_tx_dbm() |
Wayne Roberts |
0:9eb5b8bf9f7b | 75 | { |
Wayne Roberts |
0:9eb5b8bf9f7b | 76 | int8_t dbm; |
Wayne Roberts |
0:9eb5b8bf9f7b | 77 | RegPdsTrim1_t pds_trim; |
Wayne Roberts |
0:9eb5b8bf9f7b | 78 | uint8_t adr, pa_test_adr; |
Wayne Roberts |
0:9eb5b8bf9f7b | 79 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 80 | if (Radio::radio.type == SX1276) { |
Wayne Roberts |
0:9eb5b8bf9f7b | 81 | adr = REG_PDSTRIM1_SX1276; |
Wayne Roberts |
0:9eb5b8bf9f7b | 82 | pa_test_adr = REG_PATEST_SX1276; |
Wayne Roberts |
0:9eb5b8bf9f7b | 83 | } else { |
Wayne Roberts |
0:9eb5b8bf9f7b | 84 | adr = REG_PDSTRIM1_SX1272; |
Wayne Roberts |
0:9eb5b8bf9f7b | 85 | pa_test_adr = REG_PATEST_SX1272; |
Wayne Roberts |
0:9eb5b8bf9f7b | 86 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 87 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 88 | if (Radio::radio.read_reg(pa_test_adr) & 0x20) { |
Wayne Roberts |
0:9eb5b8bf9f7b | 89 | pds_trim.octet = Radio::radio.read_reg(adr); |
Wayne Roberts |
0:9eb5b8bf9f7b | 90 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 91 | Radio::radio.RegPaConfig.octet = Radio::radio.read_reg(REG_PACONFIG); |
Wayne Roberts |
0:9eb5b8bf9f7b | 92 | if (Radio::radio.RegPaConfig.bits.PaSelect) { |
Wayne Roberts |
0:9eb5b8bf9f7b | 93 | dbm = Radio::radio.RegPaConfig.bits.OutputPower + pds_trim.bits.prog_txdac - 2; |
Wayne Roberts |
0:9eb5b8bf9f7b | 94 | } else { |
Wayne Roberts |
0:9eb5b8bf9f7b | 95 | dbm = Radio::radio.RegPaConfig.bits.OutputPower - 1; |
Wayne Roberts |
0:9eb5b8bf9f7b | 96 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 97 | } else { |
Wayne Roberts |
0:9eb5b8bf9f7b | 98 | dbm = PA_OFF_DBM; |
Wayne Roberts |
0:9eb5b8bf9f7b | 99 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 100 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 101 | irq.buf[1] = dbm; |
Wayne Roberts |
0:9eb5b8bf9f7b | 102 | irq.fields.flags.irq_type = IRQ_TYPE_TXDBM; |
Wayne Roberts |
0:9eb5b8bf9f7b | 103 | irqOutPin = 1; |
Wayne Roberts |
0:9eb5b8bf9f7b | 104 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 105 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 106 | void get_fsk_sync() |
Wayne Roberts |
0:9eb5b8bf9f7b | 107 | { |
Wayne Roberts |
0:9eb5b8bf9f7b | 108 | unsigned n, idx = 1; |
Wayne Roberts |
0:9eb5b8bf9f7b | 109 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 110 | Radio::fsk.RegSyncConfig.octet = Radio::radio.read_reg(REG_FSK_SYNCCONFIG); |
Wayne Roberts |
0:9eb5b8bf9f7b | 111 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 112 | irq.buf[idx++] = Radio::fsk.RegSyncConfig.bits.SyncSize + 1; |
Wayne Roberts |
0:9eb5b8bf9f7b | 113 | for (n = 0; n < irq.buf[2]; n++) { |
Wayne Roberts |
0:9eb5b8bf9f7b | 114 | irq.buf[idx++] = Radio::radio.read_reg(REG_FSK_SYNCVALUE1+n); |
Wayne Roberts |
0:9eb5b8bf9f7b | 115 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 116 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 117 | irq.fields.flags.irq_type = IRQ_TYPE_FSK_SYNC; |
Wayne Roberts |
0:9eb5b8bf9f7b | 118 | irqOutPin = 1; |
Wayne Roberts |
0:9eb5b8bf9f7b | 119 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 120 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 121 | static unsigned bw_read(uint8_t regAddr) |
Wayne Roberts |
0:9eb5b8bf9f7b | 122 | { |
Wayne Roberts |
0:9eb5b8bf9f7b | 123 | RegRxBw_t reg_bw; |
Wayne Roberts |
0:9eb5b8bf9f7b | 124 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 125 | reg_bw.octet = Radio::radio.read_reg(regAddr); |
Wayne Roberts |
0:9eb5b8bf9f7b | 126 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 127 | switch (reg_bw.bits.Exponent) { |
Wayne Roberts |
0:9eb5b8bf9f7b | 128 | case 7: |
Wayne Roberts |
0:9eb5b8bf9f7b | 129 | if (reg_bw.bits.Mantissa == 2) |
Wayne Roberts |
0:9eb5b8bf9f7b | 130 | return 0; |
Wayne Roberts |
0:9eb5b8bf9f7b | 131 | if (reg_bw.bits.Mantissa == 1) |
Wayne Roberts |
0:9eb5b8bf9f7b | 132 | return 1; |
Wayne Roberts |
0:9eb5b8bf9f7b | 133 | if (reg_bw.bits.Mantissa == 0) |
Wayne Roberts |
0:9eb5b8bf9f7b | 134 | return 2; |
Wayne Roberts |
0:9eb5b8bf9f7b | 135 | break; |
Wayne Roberts |
0:9eb5b8bf9f7b | 136 | case 6: |
Wayne Roberts |
0:9eb5b8bf9f7b | 137 | if (reg_bw.bits.Mantissa == 2) |
Wayne Roberts |
0:9eb5b8bf9f7b | 138 | return 3; |
Wayne Roberts |
0:9eb5b8bf9f7b | 139 | if (reg_bw.bits.Mantissa == 1) |
Wayne Roberts |
0:9eb5b8bf9f7b | 140 | return 4; |
Wayne Roberts |
0:9eb5b8bf9f7b | 141 | if (reg_bw.bits.Mantissa == 0) |
Wayne Roberts |
0:9eb5b8bf9f7b | 142 | return 5; |
Wayne Roberts |
0:9eb5b8bf9f7b | 143 | break; |
Wayne Roberts |
0:9eb5b8bf9f7b | 144 | case 5: |
Wayne Roberts |
0:9eb5b8bf9f7b | 145 | if (reg_bw.bits.Mantissa == 2) |
Wayne Roberts |
0:9eb5b8bf9f7b | 146 | return 6; |
Wayne Roberts |
0:9eb5b8bf9f7b | 147 | if (reg_bw.bits.Mantissa == 1) |
Wayne Roberts |
0:9eb5b8bf9f7b | 148 | return 7; |
Wayne Roberts |
0:9eb5b8bf9f7b | 149 | if (reg_bw.bits.Mantissa == 0) |
Wayne Roberts |
0:9eb5b8bf9f7b | 150 | return 8; |
Wayne Roberts |
0:9eb5b8bf9f7b | 151 | break; |
Wayne Roberts |
0:9eb5b8bf9f7b | 152 | case 4: |
Wayne Roberts |
0:9eb5b8bf9f7b | 153 | if (reg_bw.bits.Mantissa == 2) |
Wayne Roberts |
0:9eb5b8bf9f7b | 154 | return 9; |
Wayne Roberts |
0:9eb5b8bf9f7b | 155 | if (reg_bw.bits.Mantissa == 1) |
Wayne Roberts |
0:9eb5b8bf9f7b | 156 | return 10; |
Wayne Roberts |
0:9eb5b8bf9f7b | 157 | if (reg_bw.bits.Mantissa == 0) |
Wayne Roberts |
0:9eb5b8bf9f7b | 158 | return 11; |
Wayne Roberts |
0:9eb5b8bf9f7b | 159 | break; |
Wayne Roberts |
0:9eb5b8bf9f7b | 160 | case 3: |
Wayne Roberts |
0:9eb5b8bf9f7b | 161 | if (reg_bw.bits.Mantissa == 2) |
Wayne Roberts |
0:9eb5b8bf9f7b | 162 | return 12; |
Wayne Roberts |
0:9eb5b8bf9f7b | 163 | if (reg_bw.bits.Mantissa == 1) |
Wayne Roberts |
0:9eb5b8bf9f7b | 164 | return 13; |
Wayne Roberts |
0:9eb5b8bf9f7b | 165 | if (reg_bw.bits.Mantissa == 0) |
Wayne Roberts |
0:9eb5b8bf9f7b | 166 | return 14; |
Wayne Roberts |
0:9eb5b8bf9f7b | 167 | break; |
Wayne Roberts |
0:9eb5b8bf9f7b | 168 | case 2: |
Wayne Roberts |
0:9eb5b8bf9f7b | 169 | if (reg_bw.bits.Mantissa == 2) |
Wayne Roberts |
0:9eb5b8bf9f7b | 170 | return 15; |
Wayne Roberts |
0:9eb5b8bf9f7b | 171 | if (reg_bw.bits.Mantissa == 1) |
Wayne Roberts |
0:9eb5b8bf9f7b | 172 | return 16; |
Wayne Roberts |
0:9eb5b8bf9f7b | 173 | if (reg_bw.bits.Mantissa == 0) |
Wayne Roberts |
0:9eb5b8bf9f7b | 174 | return 17; |
Wayne Roberts |
0:9eb5b8bf9f7b | 175 | break; |
Wayne Roberts |
0:9eb5b8bf9f7b | 176 | case 1: |
Wayne Roberts |
0:9eb5b8bf9f7b | 177 | if (reg_bw.bits.Mantissa == 2) |
Wayne Roberts |
0:9eb5b8bf9f7b | 178 | return 18; |
Wayne Roberts |
0:9eb5b8bf9f7b | 179 | if (reg_bw.bits.Mantissa == 1) |
Wayne Roberts |
0:9eb5b8bf9f7b | 180 | return 19; |
Wayne Roberts |
0:9eb5b8bf9f7b | 181 | if (reg_bw.bits.Mantissa == 0) |
Wayne Roberts |
0:9eb5b8bf9f7b | 182 | return 20; |
Wayne Roberts |
0:9eb5b8bf9f7b | 183 | break; |
Wayne Roberts |
0:9eb5b8bf9f7b | 184 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 185 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 186 | return 21; |
Wayne Roberts |
0:9eb5b8bf9f7b | 187 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 188 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 189 | static const unsigned rxbws[] = { |
Wayne Roberts |
0:9eb5b8bf9f7b | 190 | 2600, // 0 |
Wayne Roberts |
0:9eb5b8bf9f7b | 191 | 3100, // 1 |
Wayne Roberts |
0:9eb5b8bf9f7b | 192 | 3900, // 2 |
Wayne Roberts |
0:9eb5b8bf9f7b | 193 | 5200, // 3 |
Wayne Roberts |
0:9eb5b8bf9f7b | 194 | 6300, // 4 |
Wayne Roberts |
0:9eb5b8bf9f7b | 195 | 7800, // 5 |
Wayne Roberts |
0:9eb5b8bf9f7b | 196 | 10400, // 6 |
Wayne Roberts |
0:9eb5b8bf9f7b | 197 | 12500, // 7 |
Wayne Roberts |
0:9eb5b8bf9f7b | 198 | 15600, // 8 |
Wayne Roberts |
0:9eb5b8bf9f7b | 199 | 20800, // 9 |
Wayne Roberts |
0:9eb5b8bf9f7b | 200 | 25000, // 10 |
Wayne Roberts |
0:9eb5b8bf9f7b | 201 | 31300, // 11 |
Wayne Roberts |
0:9eb5b8bf9f7b | 202 | 41700, // 12 |
Wayne Roberts |
0:9eb5b8bf9f7b | 203 | 50000, // 13 |
Wayne Roberts |
0:9eb5b8bf9f7b | 204 | 62500, // 14 |
Wayne Roberts |
0:9eb5b8bf9f7b | 205 | 83300, // 15 |
Wayne Roberts |
0:9eb5b8bf9f7b | 206 | 100000, // 16 |
Wayne Roberts |
0:9eb5b8bf9f7b | 207 | 125000, // 17 |
Wayne Roberts |
0:9eb5b8bf9f7b | 208 | 166700, // 18 |
Wayne Roberts |
0:9eb5b8bf9f7b | 209 | 200000, // 19 |
Wayne Roberts |
0:9eb5b8bf9f7b | 210 | 250000 // 20 |
Wayne Roberts |
0:9eb5b8bf9f7b | 211 | }; |
Wayne Roberts |
0:9eb5b8bf9f7b | 212 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 213 | void get_fsk_modem() |
Wayne Roberts |
0:9eb5b8bf9f7b | 214 | { |
Wayne Roberts |
0:9eb5b8bf9f7b | 215 | uint32_t u32; |
Wayne Roberts |
0:9eb5b8bf9f7b | 216 | // GFSKModemConfig(unsigned bps, unsigned bwKHz, unsigned fdev_hz) |
Wayne Roberts |
0:9eb5b8bf9f7b | 217 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 218 | u32 = Radio::fsk.get_bitrate(); |
Wayne Roberts |
0:9eb5b8bf9f7b | 219 | irq.buf[1] = u32 & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 220 | u32 >>= 8; |
Wayne Roberts |
0:9eb5b8bf9f7b | 221 | irq.buf[2] = u32 & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 222 | u32 >>= 8; |
Wayne Roberts |
0:9eb5b8bf9f7b | 223 | irq.buf[3] = u32 & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 224 | u32 >>= 8; |
Wayne Roberts |
0:9eb5b8bf9f7b | 225 | irq.buf[4] = u32 & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 226 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 227 | u32 = rxbws[bw_read(REG_FSK_RXBW)]; |
Wayne Roberts |
0:9eb5b8bf9f7b | 228 | irq.buf[5] = u32 & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 229 | u32 >>= 8; |
Wayne Roberts |
0:9eb5b8bf9f7b | 230 | irq.buf[6] = u32 & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 231 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 232 | u32 = Radio::fsk.get_tx_fdev_hz(); |
Wayne Roberts |
0:9eb5b8bf9f7b | 233 | irq.buf[7] = u32 & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 234 | u32 >>= 8; |
Wayne Roberts |
0:9eb5b8bf9f7b | 235 | irq.buf[8] = u32 & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 236 | u32 >>= 8; |
Wayne Roberts |
0:9eb5b8bf9f7b | 237 | irq.buf[9] = u32 & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 238 | u32 >>= 8; |
Wayne Roberts |
0:9eb5b8bf9f7b | 239 | irq.buf[10] = u32 & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 240 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 241 | irq.fields.flags.irq_type = IRQ_TYPE_FSK_MODEM; |
Wayne Roberts |
0:9eb5b8bf9f7b | 242 | irqOutPin = 1; |
Wayne Roberts |
0:9eb5b8bf9f7b | 243 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 244 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 245 | void get_fsk_packet() |
Wayne Roberts |
0:9eb5b8bf9f7b | 246 | { |
Wayne Roberts |
0:9eb5b8bf9f7b | 247 | // GFSKPacketConfig(unsigned preambleLen, bool fixLen, bool crcOn) |
Wayne Roberts |
0:9eb5b8bf9f7b | 248 | unsigned pl = Radio::radio.read_u16(REG_FSK_PREAMBLEMSB); |
Wayne Roberts |
0:9eb5b8bf9f7b | 249 | irq.buf[1] = pl & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 250 | pl >>= 8; |
Wayne Roberts |
0:9eb5b8bf9f7b | 251 | irq.buf[2] = pl & 0xff; |
Wayne Roberts |
0:9eb5b8bf9f7b | 252 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 253 | Radio::fsk.RegPktConfig1.octet = Radio::radio.read_reg(REG_FSK_PACKETCONFIG1); |
Wayne Roberts |
0:9eb5b8bf9f7b | 254 | irq.buf[3] = Radio::fsk.RegPktConfig1.bits.PacketFormatVariable; |
Wayne Roberts |
0:9eb5b8bf9f7b | 255 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 256 | Radio::fsk.RegPktConfig1.octet = Radio::radio.read_reg(REG_FSK_PACKETCONFIG1); |
Wayne Roberts |
0:9eb5b8bf9f7b | 257 | irq.buf[4] = Radio::fsk.RegPktConfig1.bits.CrcOn; |
Wayne Roberts |
0:9eb5b8bf9f7b | 258 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 259 | irq.fields.flags.irq_type = IRQ_TYPE_FSK_PKT; |
Wayne Roberts |
0:9eb5b8bf9f7b | 260 | irqOutPin = 1; |
Wayne Roberts |
0:9eb5b8bf9f7b | 261 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 262 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 263 | void radio_reset() |
Wayne Roberts |
0:9eb5b8bf9f7b | 264 | { |
Wayne Roberts |
0:9eb5b8bf9f7b | 265 | Radio::radio.hw_reset(); |
Wayne Roberts |
0:9eb5b8bf9f7b | 266 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 267 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 268 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 269 | static const unsigned lora_bw_khz_1276[] = { |
Wayne Roberts |
0:9eb5b8bf9f7b | 270 | 8, // 0 |
Wayne Roberts |
0:9eb5b8bf9f7b | 271 | 10, // 1 |
Wayne Roberts |
0:9eb5b8bf9f7b | 272 | 16, // 2 |
Wayne Roberts |
0:9eb5b8bf9f7b | 273 | 21, // 3 |
Wayne Roberts |
0:9eb5b8bf9f7b | 274 | 31, // 4 |
Wayne Roberts |
0:9eb5b8bf9f7b | 275 | 42, // 5 |
Wayne Roberts |
0:9eb5b8bf9f7b | 276 | 63, // 6 |
Wayne Roberts |
0:9eb5b8bf9f7b | 277 | 125, // 7 |
Wayne Roberts |
0:9eb5b8bf9f7b | 278 | 250, // 8 |
Wayne Roberts |
0:9eb5b8bf9f7b | 279 | 500 // 9 |
Wayne Roberts |
0:9eb5b8bf9f7b | 280 | }; |
Wayne Roberts |
0:9eb5b8bf9f7b | 281 | static const unsigned lora_bw_khz_1272[] = { |
Wayne Roberts |
0:9eb5b8bf9f7b | 282 | 125, // 0 |
Wayne Roberts |
0:9eb5b8bf9f7b | 283 | 250, // 1 |
Wayne Roberts |
0:9eb5b8bf9f7b | 284 | 500 // 2 |
Wayne Roberts |
0:9eb5b8bf9f7b | 285 | }; |
Wayne Roberts |
0:9eb5b8bf9f7b | 286 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 287 | void radio_device_init() |
Wayne Roberts |
0:9eb5b8bf9f7b | 288 | { |
Wayne Roberts |
0:9eb5b8bf9f7b | 289 | if (Radio::radio.type == SX1276) { |
Wayne Roberts |
0:9eb5b8bf9f7b | 290 | lora_bw_khz = lora_bw_khz_1276; |
Wayne Roberts |
0:9eb5b8bf9f7b | 291 | } else if (Radio::radio.type == SX1272) { |
Wayne Roberts |
0:9eb5b8bf9f7b | 292 | lora_bw_khz = lora_bw_khz_1272; |
Wayne Roberts |
0:9eb5b8bf9f7b | 293 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 294 | } |
Wayne Roberts |
0:9eb5b8bf9f7b | 295 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 296 | |
Wayne Roberts |
0:9eb5b8bf9f7b | 297 | #endif /* ..SX127x_H */ |