Merge pull request #1529 from Dazza0/feature/add_ramp_time

[LR11X0] Add support for specifying PA ramp time
pull/1521/merge
Jan Gromeš 2025-06-20 14:48:00 +02:00 zatwierdzone przez GitHub
commit e173cb32ed
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
6 zmienionych plików z 76 dodań i 7 usunięć

Wyświetl plik

@ -71,7 +71,7 @@ int16_t LR1110::setOutputPower(int8_t power) {
return(this->setOutputPower(power, false));
}
int16_t LR1110::setOutputPower(int8_t power, bool forceHighPower) {
int16_t LR1110::setOutputPower(int8_t power, bool forceHighPower, uint32_t rampTimeUs) {
// check if power value is configurable
int16_t state = this->checkOutputPower(power, NULL, forceHighPower);
RADIOLIB_ASSERT(state);
@ -86,7 +86,7 @@ int16_t LR1110::setOutputPower(int8_t power, bool forceHighPower) {
RADIOLIB_ASSERT(state);
// set output power
state = setTxParams(power, RADIOLIB_LR11X0_PA_RAMP_48U);
state = setTxParams(power, roundRampTime(rampTimeUs));
return(state);
}

Wyświetl plik

@ -103,9 +103,11 @@ class LR1110: public LR11x0 {
\param power Output power to be set in dBm.
\param forceHighPower Force using the high-power PA. If set to false, PA will be determined automatically
based on configured output power, preferring the low-power PA. If set to true, only high-power PA will be used.
\param rampTimeUs PA power ramping time in microseconds. Provided value is rounded up to the
nearest discrete ramp time supported by the PA. Defaults to 48 us.
\returns \ref status_codes
*/
int16_t setOutputPower(int8_t power, bool forceHighPower);
int16_t setOutputPower(int8_t power, bool forceHighPower, uint32_t rampTimeUs = 48);
/*!
\brief Check if output power is configurable.

Wyświetl plik

@ -78,7 +78,7 @@ int16_t LR1120::setOutputPower(int8_t power) {
return(this->setOutputPower(power, false));
}
int16_t LR1120::setOutputPower(int8_t power, bool forceHighPower) {
int16_t LR1120::setOutputPower(int8_t power, bool forceHighPower, uint32_t rampTimeUs) {
// check if power value is configurable
int16_t state = this->checkOutputPower(power, NULL, forceHighPower);
RADIOLIB_ASSERT(state);
@ -100,7 +100,7 @@ int16_t LR1120::setOutputPower(int8_t power, bool forceHighPower) {
RADIOLIB_ASSERT(state);
// set output power
state = setTxParams(power, RADIOLIB_LR11X0_PA_RAMP_48U);
state = setTxParams(power, roundRampTime(rampTimeUs));
return(state);
}

Wyświetl plik

@ -112,9 +112,11 @@ class LR1120: public LR11x0 {
If set to false, PA will be determined automatically based on configured output power and frequency,
preferring the low-power PA but always using high-frequency PA in 2.4 GHz band.
Ignored when operating in 2.4 GHz band.
\param rampTimeUs PA power ramping time in microseconds. Provided value is rounded up to the
nearest discrete ramp time supported by the PA. Defaults to 48 us.
\returns \ref status_codes
*/
int16_t setOutputPower(int8_t power, bool forceHighPower);
int16_t setOutputPower(int8_t power, bool forceHighPower, uint32_t rampTimeUs = 48);
/*!
\brief Check if output power is configurable.

Wyświetl plik

@ -443,7 +443,22 @@
#define RADIOLIB_LR11X0_GFSK_WHITENING_ENABLED (0x01UL << 0) // 7 0 enabled
// RADIOLIB_LR11X0_CMD_SET_TX_PARAMS
#define RADIOLIB_LR11X0_PA_RAMP_48U (0x02UL << 0) // 7 0 PA ramp time: 48 us
#define RADIOLIB_LR11X0_PA_RAMP_16U (0x00UL << 0) // 7 0 PA ramp time: 16 us
#define RADIOLIB_LR11X0_PA_RAMP_32U (0x01UL << 0) // 7 0 32 us
#define RADIOLIB_LR11X0_PA_RAMP_48U (0x02UL << 0) // 7 0 48 us
#define RADIOLIB_LR11X0_PA_RAMP_64U (0x03UL << 0) // 7 0 64 us
#define RADIOLIB_LR11X0_PA_RAMP_80U (0x04UL << 0) // 7 0 80 us
#define RADIOLIB_LR11X0_PA_RAMP_96U (0x05UL << 0) // 7 0 96 us
#define RADIOLIB_LR11X0_PA_RAMP_112U (0x06UL << 0) // 7 0 112 us
#define RADIOLIB_LR11X0_PA_RAMP_128U (0x07UL << 0) // 7 0 128 us
#define RADIOLIB_LR11X0_PA_RAMP_144U (0x08UL << 0) // 7 0 144 us
#define RADIOLIB_LR11X0_PA_RAMP_160U (0x09UL << 0) // 7 0 160 us
#define RADIOLIB_LR11X0_PA_RAMP_176U (0x0AUL << 0) // 7 0 176 us
#define RADIOLIB_LR11X0_PA_RAMP_192U (0x0BUL << 0) // 7 0 192 us
#define RADIOLIB_LR11X0_PA_RAMP_208U (0x0CUL << 0) // 7 0 208 us
#define RADIOLIB_LR11X0_PA_RAMP_240U (0x0DUL << 0) // 7 0 240 us
#define RADIOLIB_LR11X0_PA_RAMP_272U (0x0EUL << 0) // 7 0 272 us
#define RADIOLIB_LR11X0_PA_RAMP_304U (0x0FUL << 0) // 7 0 304 us
// RADIOLIB_LR11X0_CMD_SET_RX_TX_FALLBACK_MODE
#define RADIOLIB_LR11X0_FALLBACK_MODE_STBY_RC (0x01UL << 0) // 1 0 fallback mode after Rx/Tx: standby with RC
@ -1610,6 +1625,14 @@ class LR11x0: public PhysicalLayer {
#endif
Module* getMod() override;
// LR11x0 command helpers
/*!
\brief Round up a PA power ramp time to register value
\param rampTimeUs Ramp time in microseconds
\returns Register value of rounded ramp time
*/
uint8_t roundRampTime(uint32_t rampTimeUs);
// LR11x0 SPI command implementations
int16_t writeRegMem32(uint32_t addr, const uint32_t* data, size_t len);
int16_t readRegMem32(uint32_t addr, uint32_t* data, size_t len);

Wyświetl plik

@ -8,6 +8,48 @@
#if !RADIOLIB_EXCLUDE_LR11X0
uint8_t LR11x0::roundRampTime(uint32_t rampTimeUs)
{
uint8_t regVal;
// Round up the ramp time to nearest discrete register value
if(rampTimeUs <= 16) {
regVal = RADIOLIB_LR11X0_PA_RAMP_16U;
} else if(rampTimeUs <= 32) {
regVal = RADIOLIB_LR11X0_PA_RAMP_32U;
} else if(rampTimeUs <= 48) {
regVal = RADIOLIB_LR11X0_PA_RAMP_48U;
} else if(rampTimeUs <= 64) {
regVal = RADIOLIB_LR11X0_PA_RAMP_64U;
} else if(rampTimeUs <= 80) {
regVal = RADIOLIB_LR11X0_PA_RAMP_80U;
} else if(rampTimeUs <= 96) {
regVal = RADIOLIB_LR11X0_PA_RAMP_96U;
} else if(rampTimeUs <= 112) {
regVal = RADIOLIB_LR11X0_PA_RAMP_112U;
} else if(rampTimeUs <= 128) {
regVal = RADIOLIB_LR11X0_PA_RAMP_128U;
} else if(rampTimeUs <= 144) {
regVal = RADIOLIB_LR11X0_PA_RAMP_144U;
} else if(rampTimeUs <= 160) {
regVal = RADIOLIB_LR11X0_PA_RAMP_160U;
} else if(rampTimeUs <= 176) {
regVal = RADIOLIB_LR11X0_PA_RAMP_176U;
} else if(rampTimeUs <= 192) {
regVal = RADIOLIB_LR11X0_PA_RAMP_192U;
} else if(rampTimeUs <= 208) {
regVal = RADIOLIB_LR11X0_PA_RAMP_208U;
} else if(rampTimeUs <= 240) {
regVal = RADIOLIB_LR11X0_PA_RAMP_240U;
} else if(rampTimeUs <= 272) {
regVal = RADIOLIB_LR11X0_PA_RAMP_272U;
} else { // 304
regVal = RADIOLIB_LR11X0_PA_RAMP_304U;
}
return regVal;
}
int16_t LR11x0::writeRegMem32(uint32_t addr, const uint32_t* data, size_t len) {
// check maximum size
if(len > (RADIOLIB_LR11X0_SPI_MAX_READ_WRITE_LEN/sizeof(uint32_t))) {