Skip to content

Commit 8a3ae6a

Browse files
committed
Resolve modem, TX power, and RX gain settings compatibility
1 parent c655d9b commit 8a3ae6a

File tree

7 files changed

+338
-343
lines changed

7 files changed

+338
-343
lines changed

keywords.txt

Lines changed: 41 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,15 @@ getError KEYWORD2
7676
# Instances (KEYWORD2)
7777

7878
# Constants (LITERAL1)
79+
FSK_MODEM LITERAL1
80+
LORA_MODEM LITERAL1
81+
LORA_RX_GAIN_POWER_SAVING LITERAL1
82+
LORA_RX_GAIN_BOOSTED LITERAL1
83+
LORA_HEADER_EXPLICIT LITERAL1
84+
LORA_HEADER_IMPLICIT LITERAL1
85+
LORA_TX_SINGLE LITERAL1
86+
LORA_RX_SINGLE LITERAL1
87+
LORA_RX_CONTINUOUS LITERAL1
7988
LORA_STATUS_DEFAULT LITERAL1
8089
LORA_STATUS_TX_WAIT LITERAL1
8190
LORA_STATUS_TX_TIMEOUT LITERAL1
@@ -95,28 +104,19 @@ SX126X_SLEEP_COLD_START_RTC LITERAL1
95104
SX126X_SLEEP_WARM_START_RTC LITERAL1
96105
SX126X_STANDBY_RC LITERAL1
97106
SX126X_STANDBY_XOSC LITERAL1
98-
SX126X_TX_SINGLE LITERAL1
99-
SX126X_RX_SINGLE LITERAL1
100-
SX126X_RX_CONTINUOUS LITERAL1
101-
SX126X_REGULATOR_LDO LITERAL1
102-
SX126X_REGULATOR_DC_DC LITERAL1
103-
SX126X_TX_POWER_SX1261_15 LITERAL1
104-
SX126X_TX_POWER_SX1261_14 LITERAL1
105-
SX126X_TX_POWER_SX1261_10 LITERAL1
106-
SX126X_TX_POWER_SX1262_22 LITERAL1
107-
SX126X_TX_POWER_SX1262_20 LITERAL1
108-
SX126X_TX_POWER_SX1262_17 LITERAL1
109-
SX126X_TX_POWER_SX1262_14 LITERAL1
110-
SX126X_TX_POWER_SX1268_22 LITERAL1
111-
SX126X_TX_POWER_SX1268_20 LITERAL1
112-
SX126X_TX_POWER_SX1268_17 LITERAL1
113-
SX126X_TX_POWER_SX1268_14 LITERAL1
114-
SX126X_TX_POWER_SX1268_10 LITERAL1
115107
SX126X_FALLBACK_FS LITERAL1
116108
SX126X_FALLBACK_STDBY_XOSC LITERAL1
117109
SX126X_FALLBACK_STDBY_RC LITERAL1
118-
SX126X_DIO2_AS_IRQ LITERAL1
119-
SX126X_DIO2_AS_RF_SWITCH LITERAL1
110+
SX126X_STATUS_DATA_AVAILABLE LITERAL1
111+
SX126X_STATUS_CMD_TIMEOUT LITERAL1
112+
SX126X_STATUS_CMD_ERROR LITERAL1
113+
SX126X_STATUS_CMD_FAILED LITERAL1
114+
SX126X_STATUS_CMD_TX_DONE LITERAL1
115+
SX126X_STATUS_MODE_STDBY_RC LITERAL1
116+
SX126X_STATUS_MODE_STDBY_XOSC LITERAL1
117+
SX126X_STATUS_MODE_FS LITERAL1
118+
SX126X_STATUS_MODE_RX LITERAL1
119+
SX126X_STATUS_MODE_TX LITERAL1
120120
SX126X_DIO3_OUTPUT_1_6 LITERAL1
121121
SX126X_DIO3_OUTPUT_1_7 LITERAL1
122122
SX126X_DIO3_OUTPUT_1_8 LITERAL1
@@ -128,8 +128,19 @@ SX126X_DIO3_OUTPUT_3_3 LITERAL1
128128
SX126X_TCXO_DELAY_2_5 LITERAL1
129129
SX126X_TCXO_DELAY_5 LITERAL1
130130
SX126X_TCXO_DELAY_10 LITERAL1
131+
SX126X_REGULATOR_LDO LITERAL1
132+
SX126X_REGULATOR_DC_DC LITERAL1
131133
SX126X_FSK_MODEM LITERAL1
132134
SX126X_LORA_MODEM LITERAL1
135+
SX126X_TX_POWER_SX1261 LITERAL1
136+
SX126X_TX_POWER_SX1262 LITERAL1
137+
SX126X_TX_POWER_SX1268 LITERAL1
138+
SX126X_RX_GAIN_POWER_SAVING LITERAL1
139+
SX126X_RX_GAIN_BOOSTED LITERAL1
140+
SX126X_HEADER_EXPLICIT LITERAL1
141+
SX126X_HEADER_IMPLICIT LITERAL1
142+
SX126X_LORA_SYNC_WORD_PUBLIC LITERAL1
143+
SX126X_LORA_SYNC_WORD_PRIVATE LITERAL1
133144
SX126X_PULSE_NO_FILTER LITERAL1
134145
SX126X_PULSE_GAUSSIAN_BT_0_3 LITERAL1
135146
SX126X_PULSE_GAUSSIAN_BT_0_5 LITERAL1
@@ -156,8 +167,6 @@ SX126X_BW_234300 LITERAL1
156167
SX126X_BW_312000 LITERAL1
157168
SX126X_BW_373600 LITERAL1
158169
SX126X_BW_467000 LITERAL1
159-
SX126X_HEADER_EXPLICIT LITERAL1
160-
SX126X_HEADER_IMPLICIT LITERAL1
161170
SX126X_PREAMBLE_DET_LEN_OFF LITERAL1
162171
SX126X_PREAMBLE_DET_LEN_8 LITERAL1
163172
SX126X_PREAMBLE_DET_LEN_16 LITERAL1
@@ -175,35 +184,9 @@ SX126X_CRC_1_INV LITERAL1
175184
SX126X_CRC_2_INV LITERAL1
176185
SX126X_WHITENING_OFF LITERAL1
177186
SX126X_WHITENING_ON LITERAL1
178-
SX126X_CAD_ON_1_SYMB LITERAL1
179-
SX126X_CAD_ON_2_SYMB LITERAL1
180-
SX126X_CAD_ON_4_SYMB LITERAL1
181-
SX126X_CAD_ON_8_SYMB LITERAL1
182-
SX126X_CAD_ON_16_SYMB LITERAL1
183-
SX126X_CAD_EXIT_STDBY LITERAL1
184-
SX126X_CAD_EXIT_RX LITERAL1
185-
SX126X_STATUS_DATA_AVAILABLE LITERAL1
186-
SX126X_STATUS_CMD_TIMEOUT LITERAL1
187-
SX126X_STATUS_CMD_ERROR LITERAL1
188-
SX126X_STATUS_CMD_FAILED LITERAL1
189-
SX126X_STATUS_CMD_TX_DONE LITERAL1
190-
SX126X_STATUS_MODE_STDBY_RC LITERAL1
191-
SX126X_STATUS_MODE_STDBY_XOSC LITERAL1
192-
SX126X_STATUS_MODE_FS LITERAL1
193-
SX126X_STATUS_MODE_RX LITERAL1
194-
SX126X_STATUS_MODE_TX LITERAL1
195-
SX126X_RC64K_CALIB_ERR LITERAL1
196-
SX126X_RC13M_CALIB_ERR LITERAL1
197-
SX126X_PLL_CALIB_ERR LITERAL1
198-
SX126X_ADC_CALIB_ERR LITERAL1
199-
SX126X_IMG_CALIB_ERR LITERAL1
200-
SX126X_XOSC_START_ERR LITERAL1
201-
SX126X_PLL_LOCK_ERR LITERAL1
202-
SX126X_PA_RAMP_ERR LITERAL1
203-
SX126X_LORA_SYNC_WORD_PUBLIC LITERAL1
204-
SX126X_LORA_SYNC_WORD_PRIVATE LITERAL1
205-
SX126X_RX_GAIN_POWER_SAVING LITERAL1
206-
SX126X_RX_GAIN_BOOSTED LITERAL1
187+
SX126X_TX_SINGLE LITERAL1
188+
SX126X_RX_SINGLE LITERAL1
189+
SX126X_RX_CONTINUOUS LITERAL1
207190
SX126X_STATUS_DEFAULT LITERAL1
208191
SX126X_STATUS_TX_WAIT LITERAL1
209192
SX126X_STATUS_TX_TIMEOUT LITERAL1
@@ -217,19 +200,21 @@ SX126X_STATUS_CRC_ERR LITERAL1
217200
SX126X_STATUS_CAD_WAIT LITERAL1
218201
SX126X_STATUS_CAD_DETECTED LITERAL1
219202
SX126X_STATUS_CAD_DONE LITERAL1
203+
SX127X_OSC_CRYSTAL LITERAL1
204+
SX127X_OSC_TCXO LITERAL1
220205
SX127X_FSK_MODEM LITERAL1
221206
SX127X_OOK_MODEM LITERAL1
222207
SX127X_LORA_MODEM LITERAL1
223-
SX127X_RX_SINGLELITERAL1
224-
SX127X_RX_CONTINUOUSLITERAL1
225-
SX127X_PIN_RFOLITERAL1
226-
SX127X_PIN_PA_BOOSTLITERAL1
208+
SX127X_TX_POWER_RFOLITERAL1
209+
SX127X_TX_POWER_PA_BOOSTLITERAL1
210+
SX127X_RX_GAIN_POWER_SAVINGLITERAL1
211+
SX127X_RX_GAIN_BOOSTEDLITERAL1
227212
SX127X_RX_GAIN_AUTO LITERAL1
228213
SX127X_HEADER_EXPLICIT LITERAL1
229214
SX127X_HEADER_IMPLICIT LITERAL1
230215
SX127X_SYNCWORD_LORAWAN LITERAL1
231-
SX127X_OSC_CRYSTALLITERAL1
232-
SX127X_OSC_TCXOLITERAL1
216+
SX127X_RX_SINGLELITERAL1
217+
SX127X_RX_CONTINUOUSLITERAL1
233218
SX127X_STATUS_DEFAULT LITERAL1
234219
SX127X_STATUS_TX_WAIT LITERAL1
235220
SX127X_STATUS_TX_TIMEOUT LITERAL1

src/BaseLoRa.h

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,37 @@
33

44
#include <Arduino.h>
55

6+
// Modem options
7+
#define FSK_MODEM 0x00 // GFSK packet type
8+
#define LORA_MODEM 0x01 // LoRa packet type
9+
10+
// RX gain options
11+
#define LORA_RX_GAIN_POWER_SAVING 0x00 // gain used in Rx mode: power saving gain
12+
#define LORA_RX_GAIN_BOOSTED 0x01 // boosted gain
13+
14+
// Header type
15+
#define LORA_HEADER_EXPLICIT 0x00 // explicit header mode
16+
#define LORA_HEADER_IMPLICIT 0x01 // implicit header mode
17+
618
// TX and RX operation mode
7-
#define LORA_TX_MODE_SINGLE 0x000000 // Tx timeout duration: no timeout (Rx single mode)
8-
#define LORA_RX_MODE_SINGLE 0x000000 // Rx timeout duration: no timeout (Rx single mode)
9-
#define LORA_RX_MODE_CONTINUOUS 0xFFFFFF // infinite (Rx continuous mode)
19+
#define LORA_TX_SINGLE 0x000000 // Tx timeout duration: no timeout (Rx single mode)
20+
#define LORA_RX_SINGLE 0x000000 // Rx timeout duration: no timeout (Rx single mode)
21+
#define LORA_RX_CONTINUOUS 0xFFFFFF // infinite (Rx continuous mode)
1022

1123
// Status TX and RX operation
12-
#define LORA_STATUS_DEFAULT 0 // default status (false)
13-
#define LORA_STATUS_TX_WAIT 1
14-
#define LORA_STATUS_TX_TIMEOUT 2
15-
#define LORA_STATUS_TX_DONE 3
16-
#define LORA_STATUS_RX_WAIT 4
17-
#define LORA_STATUS_RX_CONTINUOUS 5
18-
#define LORA_STATUS_RX_TIMEOUT 6
19-
#define LORA_STATUS_RX_DONE 7
20-
#define LORA_STATUS_HEADER_ERR 8
21-
#define LORA_STATUS_CRC_ERR 9
22-
#define LORA_STATUS_CAD_WAIT 10
23-
#define LORA_STATUS_CAD_DETECTED 11
24-
#define LORA_STATUS_CAD_DONE 12
24+
#define LORA_STATUS_DEFAULT 0 // default status (false)
25+
#define LORA_STATUS_TX_WAIT 1
26+
#define LORA_STATUS_TX_TIMEOUT 2
27+
#define LORA_STATUS_TX_DONE 3
28+
#define LORA_STATUS_RX_WAIT 4
29+
#define LORA_STATUS_RX_CONTINUOUS 5
30+
#define LORA_STATUS_RX_TIMEOUT 6
31+
#define LORA_STATUS_RX_DONE 7
32+
#define LORA_STATUS_HEADER_ERR 8
33+
#define LORA_STATUS_CRC_ERR 9
34+
#define LORA_STATUS_CAD_WAIT 10
35+
#define LORA_STATUS_CAD_DETECTED 11
36+
#define LORA_STATUS_CAD_DONE 12
2537

2638
// Uncomment one of line below to use a LoRa model exclusively
2739
#define USE_LORA_SX126X

src/SX126x.cpp

Lines changed: 51 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -205,66 +205,64 @@ void SX126x::setFrequency(uint32_t frequency)
205205
SX126x_API::setRfFrequency(rfFreq);
206206
}
207207

208-
void SX126x::setTxPower(uint32_t txPower)
209-
{
210-
// set output power and ramp time option
211-
uint8_t power, ramp;
212-
switch (txPower) {
213-
case SX126X_TX_POWER_SX1261_15:
214-
power = 0x0E;
215-
ramp = SX126X_PA_RAMP_200U;
216-
break;
217-
case SX126X_TX_POWER_SX1261_14:
218-
power = 0x0E;
219-
ramp = SX126X_PA_RAMP_200U;
220-
break;
221-
case SX126X_TX_POWER_SX1261_10:
222-
power = 0x0D;
223-
ramp = SX126X_PA_RAMP_80U;
224-
break;
225-
case SX126X_TX_POWER_SX1262_22: // also for SX126X_TX_POWER_SX1268_22
226-
power = 0x16;
227-
ramp = SX126X_PA_RAMP_800U;
228-
break;
229-
case SX126X_TX_POWER_SX1262_20: // also for SX126X_TX_POWER_SX1268_20
230-
power = 0x16;
231-
ramp = SX126X_PA_RAMP_800U;
232-
break;
233-
case SX126X_TX_POWER_SX1262_17: // also for SX126X_TX_POWER_SX1268_17
234-
power = 0x16;
235-
ramp = SX126X_PA_RAMP_200U;
236-
break;
237-
case SX126X_TX_POWER_SX1262_14:
238-
power = 0x16;
239-
ramp = SX126X_PA_RAMP_200U;
240-
break;
241-
case SX126X_TX_POWER_SX1268_14:
242-
power = 0x0F;
243-
ramp = SX126X_PA_RAMP_200U;
244-
break;
245-
case SX126X_TX_POWER_SX1268_10:
246-
power = 0x0F;
247-
ramp = SX126X_PA_RAMP_80U;
248-
break;
249-
default: return;
208+
void SX126x::setTxPower(uint8_t txPower, uint8_t version)
209+
{
210+
// maximum TX power is 22 dBm and 14 dBm for RFO pin
211+
if (txPower > 22) txPower = 22;
212+
else if (txPower > 15 && version == SX126X_TX_POWER_SX1261) txPower = 15;
213+
214+
uint8_t paDutyCycle = 0x00;
215+
uint8_t hpMax = 0x00;
216+
uint8_t deviceSel = version == SX126X_TX_POWER_SX1261 ? 0x01 : 0x00;
217+
uint8_t power = 0x0E;
218+
// set parameters for PA config and TX params configuration
219+
if (txPower == 22) {
220+
paDutyCycle = 0x04;
221+
hpMax = 0x07;
222+
power = 0x16;
223+
} else if (txPower >= 20) {
224+
paDutyCycle = 0x03;
225+
hpMax = 0x05;
226+
power = 0x16;
227+
} else if (txPower >= 17) {
228+
paDutyCycle = 0x02;
229+
hpMax = 0x03;
230+
power = 0x16;
231+
} else if (txPower >= 14 && version == SX126X_TX_POWER_SX1261) {
232+
paDutyCycle = 0x04;
233+
hpMax = 0x00;
234+
power = 0x0E;
235+
} else if (txPower >= 14 && version == SX126X_TX_POWER_SX1262) {
236+
paDutyCycle = 0x02;
237+
hpMax = 0x02;
238+
power = 0x16;
239+
} else if (txPower >= 14 && version == SX126X_TX_POWER_SX1268) {
240+
paDutyCycle = 0x04;
241+
hpMax = 0x06;
242+
power = 0x0F;
243+
} else if (txPower >= 10 && version == SX126X_TX_POWER_SX1261) {
244+
paDutyCycle = 0x01;
245+
hpMax = 0x00;
246+
power = 0x0D;
247+
} else if (txPower >= 10 && version == SX126X_TX_POWER_SX1268) {
248+
paDutyCycle = 0x00;
249+
hpMax = 0x03;
250+
power = 0x0F;
251+
} else {
252+
return;
250253
}
251-
uint8_t paDutyCycle = (txPower >> 16) & 0xFF;
252-
uint8_t hpMax = (txPower >> 8) & 0xFF;
253-
uint8_t deviceSel = txPower & 0xFF;
254-
uint8_t paLut = 0x01;
255254

256255
// set power amplifier and TX power configuration
257-
SX126x_API::setPaConfig(paDutyCycle, hpMax, deviceSel, paLut);
258-
SX126x_API::setTxParams(power, ramp);
256+
SX126x_API::setPaConfig(paDutyCycle, hpMax, deviceSel, 0x01);
257+
SX126x_API::setTxParams(power, SX126X_PA_RAMP_800U);
259258
}
260259

261-
void SX126x::setRxGain(uint8_t rxGain)
260+
void SX126x::setRxGain(uint8_t boost)
262261
{
263262
// set power saving or boosted gain in register
264-
uint8_t gain = SX126X_RX_GAIN_POWER_SAVING;
265-
if (rxGain == SX126X_RX_GAIN_BOOSTED){
266-
gain = SX126X_RX_GAIN_BOOSTED;
267-
SX126x_API::writeRegister(SX126X_REG_RX_GAIN, &gain, 1);
263+
uint8_t gain = boost ? SX126X_BOOSTED_GAIN : SX126X_POWER_SAVING_GAIN;
264+
SX126x_API::writeRegister(SX126X_REG_RX_GAIN, &gain, 1);
265+
if (boost){
268266
// set certain register to retain configuration after wake from sleep mode
269267
uint8_t value = 0x01;
270268
SX126x_API::writeRegister(0x029F, &value, 1);
@@ -273,7 +271,6 @@ void SX126x::setRxGain(uint8_t rxGain)
273271
value = 0xAC;
274272
SX126x_API::writeRegister(0x02A1, &value, 1);
275273
}
276-
else SX126x_API::writeRegister(SX126X_REG_RX_GAIN, &gain, 1);
277274
}
278275

279276
void SX126x::setLoRaModulation(uint8_t sf, uint32_t bw, uint8_t cr, bool ldro)

src/SX126x.h

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@
55
#include <SX126x_API.h>
66

77
// Status TX and RX operation
8-
#define SX126X_STATUS_DEFAULT LORA_STATUS_DEFAULT
9-
#define SX126X_STATUS_TX_WAIT LORA_STATUS_TX_WAIT
10-
#define SX126X_STATUS_TX_TIMEOUT LORA_STATUS_TX_TIMEOUT
11-
#define SX126X_STATUS_TX_DONE LORA_STATUS_TX_DONE
12-
#define SX126X_STATUS_RX_WAIT LORA_STATUS_RX_WAIT
13-
#define SX126X_STATUS_RX_CONTINUOUS LORA_STATUS_RX_CONTINUOUS
14-
#define SX126X_STATUS_RX_TIMEOUT LORA_STATUS_RX_TIMEOUT
15-
#define SX126X_STATUS_RX_DONE LORA_STATUS_RX_DONE
16-
#define SX126X_STATUS_HEADER_ERR LORA_STATUS_HEADER_ERR
17-
#define SX126X_STATUS_CRC_ERR LORA_STATUS_CRC_ERR
18-
#define SX126X_STATUS_CAD_WAIT LORA_STATUS_CAD_WAIT
19-
#define SX126X_STATUS_CAD_DETECTED LORA_STATUS_CAD_DETECTED
20-
#define SX126X_STATUS_CAD_DONE LORA_STATUS_CAD_DONE
8+
#define SX126X_STATUS_DEFAULT LORA_STATUS_DEFAULT
9+
#define SX126X_STATUS_TX_WAIT LORA_STATUS_TX_WAIT
10+
#define SX126X_STATUS_TX_TIMEOUT LORA_STATUS_TX_TIMEOUT
11+
#define SX126X_STATUS_TX_DONE LORA_STATUS_TX_DONE
12+
#define SX126X_STATUS_RX_WAIT LORA_STATUS_RX_WAIT
13+
#define SX126X_STATUS_RX_CONTINUOUS LORA_STATUS_RX_CONTINUOUS
14+
#define SX126X_STATUS_RX_TIMEOUT LORA_STATUS_RX_TIMEOUT
15+
#define SX126X_STATUS_RX_DONE LORA_STATUS_RX_DONE
16+
#define SX126X_STATUS_HEADER_ERR LORA_STATUS_HEADER_ERR
17+
#define SX126X_STATUS_CRC_ERR LORA_STATUS_CRC_ERR
18+
#define SX126X_STATUS_CAD_WAIT LORA_STATUS_CAD_WAIT
19+
#define SX126X_STATUS_CAD_DETECTED LORA_STATUS_CAD_DETECTED
20+
#define SX126X_STATUS_CAD_DONE LORA_STATUS_CAD_DONE
2121

2222
// Default Hardware Configuration
2323
#define SX126X_PIN_RF_IRQ 1
@@ -59,8 +59,8 @@ class SX126x : public BaseLoRa
5959
// Modem, modulation parameter, and packet parameter setup methods
6060
void setModem(uint8_t modem=SX126X_LORA_MODEM);
6161
void setFrequency(uint32_t frequency);
62-
void setTxPower(uint32_t txPower);
63-
void setRxGain(uint8_t rxGain);
62+
void setTxPower(uint8_t txPower, uint8_t version=SX126X_TX_POWER_SX1262);
63+
void setRxGain(uint8_t boost);
6464
void setLoRaModulation(uint8_t sf, uint32_t bw, uint8_t cr, bool ldro=false);
6565
void setLoRaPacket(uint8_t headerType, uint16_t preambleLength, uint8_t payloadLength, bool crcType=false, bool invertIq=false);
6666
void setSpreadingFactor(uint8_t sf);

0 commit comments

Comments
 (0)