Skip to content

Commit 0a2bd01

Browse files
authored
Merge pull request #21713 from fabian18/pr/sx126x_radio_hal_img_calibration
drivers/sx126x: image calibration after frequency change
2 parents 9538f90 + 0c624ba commit 0a2bd01

File tree

3 files changed

+94
-20
lines changed

3 files changed

+94
-20
lines changed

drivers/sx126x/include/sx126x_internal.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,23 @@ static inline bool sx126x_is_stm32wl(sx126x_t *dev)
122122
}
123123
}
124124

125+
/**
126+
* @brief Get the current chip state
127+
*
128+
* @param[in] dev Device descriptor of the driver
129+
*
130+
* @return Chip state
131+
*/
132+
sx126x_chip_modes_t sx126x_get_state(const sx126x_t *dev);
133+
134+
/**
135+
* @brief Set the internal chip state
136+
*
137+
* @param[in] dev Device descriptor of the driver
138+
* @param[in] state State to set
139+
*/
140+
void sx126x_set_state(sx126x_t *dev, sx126x_chip_modes_t state);
141+
125142
#ifdef __cplusplus
126143
}
127144
#endif

drivers/sx126x/sx126x.c

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#include "sx126x_netdev.h"
2424

25+
#include "macros/units.h"
2526
#include "net/lora.h"
2627
#include "periph/spi.h"
2728

@@ -434,17 +435,84 @@ int sx126x_init(sx126x_t *dev)
434435
return res;
435436
}
436437

438+
sx126x_chip_modes_t sx126x_get_state(const sx126x_t *dev)
439+
{
440+
sx126x_chip_status_t radio_status;
441+
sx126x_get_status(dev, &radio_status);
442+
return radio_status.chip_mode;
443+
}
444+
445+
void sx126x_set_state(sx126x_t *dev, sx126x_chip_modes_t state)
446+
{
447+
switch (state) {
448+
case SX126X_CHIP_MODE_TX:
449+
sx126x_set_tx(dev, 0); /* no TX frame timeout */
450+
break;
451+
case SX126X_CHIP_MODE_RX: {
452+
int timeout = (sx126x_symbol_to_msec(dev, dev->rx_timeout));
453+
sx126x_set_rx_tx_fallback_mode(dev, SX126X_FALLBACK_STDBY_XOSC);
454+
if (timeout > 0) {
455+
sx126x_set_rx(dev, timeout);
456+
}
457+
else {
458+
sx126x_set_rx(dev, SX126X_RX_SINGLE_MODE);
459+
}
460+
} break;
461+
case SX126X_CHIP_MODE_STBY_RC:
462+
case SX126X_CHIP_MODE_STBY_XOSC:
463+
sx126x_set_standby(dev, state);
464+
break;
465+
default:
466+
break;
467+
}
468+
}
469+
437470
uint32_t sx126x_get_channel(const sx126x_t *dev)
438471
{
439472
DEBUG("[sx126x]: sx126x_get_radio_status \n");
440473
return dev->channel;
441474
}
442475

476+
/* 9.2.1 Image Calibration for Specific Frequency Bands */
477+
static void _cal_img(sx126x_t *dev, uint32_t freq)
478+
{
479+
sx126x_chip_modes_t state = sx126x_get_state(dev);
480+
/* don't know what to do with frequencies that don't fit in the intervals from the datasheet */
481+
if (freq >= MHZ(902) && freq <= MHZ(928)) {
482+
/* 902 - 928 MHz band and anything upper */
483+
sx126x_cal_img_in_mhz(dev, 902, 928);
484+
}
485+
else if (freq >= MHZ(863) && freq <= MHZ(870)) {
486+
/* 863 - 870 MHz band */
487+
sx126x_cal_img_in_mhz(dev, 863, 870);
488+
}
489+
else if (freq >= MHZ(779) && freq <= MHZ(787)) {
490+
/* 779 - 787 MHz band */
491+
sx126x_cal_img_in_mhz(dev, 779, 787);
492+
}
493+
else if (freq >= MHZ(470) && freq <= MHZ(510)) {
494+
/* 470 - 510 MHz band */
495+
sx126x_cal_img_in_mhz(dev, 470, 510);
496+
}
497+
else if (freq >= MHZ(430) && freq <= MHZ(440)) {
498+
/* 430 - 440 MHz band and anything lower */
499+
sx126x_cal_img_in_mhz(dev, 430, 440);
500+
}
501+
else {
502+
/* Contact your Semtech representative for the other optimal calibration settings
503+
outside of the given frequency bands. */
504+
}
505+
/* Image calibration sets the chip mode back to STBY_RC */
506+
/* When using DIO3, TCXO switches off. */
507+
sx126x_set_state(dev, state);
508+
}
509+
443510
void sx126x_set_channel(sx126x_t *dev, uint32_t freq)
444511
{
445512
DEBUG("[sx126x]: sx126x_set_channel %" PRIu32 "Hz \n", freq);
446513
dev->channel = freq;
447514
sx126x_set_rf_freq(dev, dev->channel);
515+
_cal_img(dev, freq);
448516
}
449517

450518
uint8_t sx126x_get_bandwidth(const sx126x_t *dev)

drivers/sx126x/sx126x_netdev.c

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -206,16 +206,11 @@ static void _isr(netdev_t *netdev)
206206

207207
static int _get_state(sx126x_t *dev, void *val)
208208
{
209-
sx126x_chip_status_t radio_status;
210-
211-
sx126x_get_status(dev, &radio_status);
212-
netopt_state_t state = NETOPT_STATE_OFF;
213-
214-
switch (radio_status.chip_mode) {
215-
case SX126X_CHIP_MODE_RFU:
216-
case SX126X_CHIP_MODE_STBY_RC:
217-
case SX126X_CHIP_MODE_STBY_XOSC:
218-
state = NETOPT_STATE_STANDBY;
209+
netopt_state_t state;
210+
sx126x_chip_modes_t mode = sx126x_get_state(dev);
211+
switch (mode) {
212+
case SX126X_CHIP_MODE_FS:
213+
state = NETOPT_STATE_IDLE;
219214
break;
220215

221216
case SX126X_CHIP_MODE_TX:
@@ -227,6 +222,7 @@ static int _get_state(sx126x_t *dev, void *val)
227222
break;
228223

229224
default:
225+
state = NETOPT_STATE_STANDBY;
230226
break;
231227
}
232228
memcpy(val, &state, sizeof(netopt_state_t));
@@ -312,7 +308,7 @@ static int _set_state(sx126x_t *dev, netopt_state_t state)
312308
switch (state) {
313309
case NETOPT_STATE_STANDBY:
314310
DEBUG("[sx126x] netdev: set NETOPT_STATE_STANDBY state\n");
315-
sx126x_set_standby(dev, SX126X_CHIP_MODE_STBY_XOSC);
311+
sx126x_set_state(dev, SX126X_CHIP_MODE_STBY_XOSC);
316312
break;
317313

318314
case NETOPT_STATE_IDLE:
@@ -324,14 +320,7 @@ static int _set_state(sx126x_t *dev, netopt_state_t state)
324320
dev->params->set_rf_mode(dev, SX126X_RF_MODE_RX);
325321
}
326322
#endif
327-
sx126x_cfg_rx_boosted(dev, true);
328-
int _timeout = (sx126x_symbol_to_msec(dev, dev->rx_timeout));
329-
if (_timeout != 0) {
330-
sx126x_set_rx(dev, _timeout);
331-
}
332-
else {
333-
sx126x_set_rx(dev, SX126X_RX_SINGLE_MODE);
334-
}
323+
sx126x_set_state(dev, SX126X_CHIP_MODE_RX);
335324
break;
336325

337326
case NETOPT_STATE_TX:
@@ -341,7 +330,7 @@ static int _set_state(sx126x_t *dev, netopt_state_t state)
341330
dev->params->set_rf_mode(dev, dev->params->tx_pa_mode);
342331
}
343332
#endif
344-
sx126x_set_tx(dev, 0);
333+
sx126x_set_state(dev, SX126X_CHIP_MODE_TX);
345334
break;
346335

347336
case NETOPT_STATE_RESET:

0 commit comments

Comments
 (0)