Add proper tx power control for LoRa1280F27

This commit is contained in:
jacob.eva 2025-03-29 15:20:06 +00:00
parent 51139d98fa
commit c5e84eab6c
No known key found for this signature in database
GPG Key ID: 0B92E083BBCCAA1E
2 changed files with 57 additions and 3 deletions

View File

@ -1623,7 +1623,7 @@ sx128x::sx128x(uint8_t index, SPIClass* spi, bool tcxo, int ss, int sclk, int mo
_bw(0x34), _cr(0x01), _packetIndex(0), _implicitHeaderMode(0), _bw(0x34), _cr(0x01), _packetIndex(0), _implicitHeaderMode(0),
_payloadLength(255), _crcMode(0), _fifo_tx_addr_ptr(0), _fifo_rx_addr_ptr(0), _payloadLength(255), _crcMode(0), _fifo_tx_addr_ptr(0), _fifo_rx_addr_ptr(0),
_rxPacketLength(0), _preinit_done(false), _rxPacketLength(0), _preinit_done(false),
_tcxo(tcxo) _tcxo(tcxo), _txp_dc(55)
{ {
// overide Stream timeout value // overide Stream timeout value
setTimeout(0); setTimeout(0);
@ -1709,7 +1709,11 @@ uint8_t ISR_VECT sx128x::singleTransfer(uint8_t opcode, uint16_t address, uint8_
void sx128x::rxAntEnable() void sx128x::rxAntEnable()
{ {
if (_txen != -1) { if (_txen != -1) {
#if BOARD_VARIANT == MODEL_13 || BOARD_VARIANT == MODEL_21
analogWrite(_txen, 0);
#else
digitalWrite(_txen, LOW); digitalWrite(_txen, LOW);
#endif
} }
if (_rxen != -1) { if (_rxen != -1) {
digitalWrite(_rxen, HIGH); digitalWrite(_rxen, HIGH);
@ -1719,7 +1723,15 @@ void sx128x::rxAntEnable()
void sx128x::txAntEnable() void sx128x::txAntEnable()
{ {
if (_txen != -1) { if (_txen != -1) {
#if BOARD_VARIANT == MODEL_13 || BOARD_VARIANT == MODEL_21
// RAK4631 with WisBlock SX1280 module (LIBSYS002)
// This board needs to use a PWM input in order to scale the power of
// the PA output. Undocumented by NiceRF, they have been contacted for
// comment. (March 2025)
analogWrite(_txen, _txp_dc);
#else
digitalWrite(_txen, HIGH); digitalWrite(_txen, HIGH);
#endif
} }
if (_rxen != -1) { if (_rxen != -1) {
digitalWrite(_rxen, LOW); digitalWrite(_rxen, LOW);
@ -2242,7 +2254,13 @@ void sx128x::disableTCXO() {
void sx128x::setTxPower(int level, int outputPin) { void sx128x::setTxPower(int level, int outputPin) {
uint8_t tx_buf[2]; uint8_t tx_buf[2];
#if BOARD_VARIANT == MODEL_13 || BOARD_VARIANT == MODEL_21 #if BOARD_VARIANT == MODEL_13 || BOARD_VARIANT == MODEL_21
// RAK4631 with WisBlock SX1280 module (LIBSYS002) // RAK4631 with WisBlock SX1280 module (LIBSYS002) The following duty cycle
// values assume a battery is in use which has a maximum voltage supply of
// 4.2v (each case assumes 3.7v, except 15-20dBm to ensure legal compliance
// at all battery voltages), as per the specification for the RAK19001.
// Higher voltage batteries may cause your device to operate illegally due
// to the resulting increase in transmission power. Beware!
if (level > 27) { if (level > 27) {
level = 27; level = 27;
} else if (level < 0) { } else if (level < 0) {
@ -2256,90 +2274,125 @@ void sx128x::setTxPower(int level, int outputPin) {
switch (level) { switch (level) {
case 0: case 0:
reg_value = -18; reg_value = -18;
_txp_dc = 55;
break; break;
case 1: case 1:
reg_value = -16; reg_value = -16;
_txp_dc = 64;
break; break;
case 2: case 2:
reg_value = -15; reg_value = -15;
_txp_dc = 73;
break; break;
case 3: case 3:
reg_value = -14; reg_value = -14;
_txp_dc = 81;
break; break;
case 4: case 4:
reg_value = -13; reg_value = -13;
_txp_dc = 90;
break; break;
case 5: case 5:
reg_value = -12; reg_value = -12;
_txp_dc = 100;
break; break;
case 6: case 6:
reg_value = -11; reg_value = -11;
_txp_dc = 108;
break; break;
case 7: case 7:
reg_value = -9; reg_value = -9;
_txp_dc = 117;
break; break;
case 8: case 8:
reg_value = -8; reg_value = -8;
_txp_dc = 126;
break; break;
case 9: case 9:
reg_value = -7; reg_value = -7;
_txp_dc = 135;
break; break;
case 10: case 10:
reg_value = -6; reg_value = -6;
_txp_dc = 144;
break; break;
case 11: case 11:
reg_value = -5; reg_value = -5;
_txp_dc = 153;
break; break;
case 12: case 12:
reg_value = -4; reg_value = -4;
_txp_dc = 161;
break; break;
case 13: case 13:
reg_value = -3; reg_value = -3;
_txp_dc = 170;
break; break;
case 14: case 14:
reg_value = -2; reg_value = -2;
_txp_dc = 180;
break; break;
case 15: case 15:
reg_value = -1; reg_value = -1;
// Capped to ensure it doesn't exceed 15dBm
_txp_dc = 183;
break; break;
case 16: case 16:
reg_value = 0; reg_value = 0;
// Capped to ensure it doesn't exceed 16dBm
_txp_dc = 190;
break; break;
case 17: case 17:
reg_value = 1; reg_value = 1;
// Capped to ensure it doesn't exceed 17dBm
_txp_dc = 200;
break; break;
case 18: case 18:
reg_value = 2; reg_value = 2;
// Capped to ensure it doesn't exceed 18dBm
_txp_dc = 209;
break; break;
case 19: case 19:
reg_value = 3; reg_value = 3;
// Capped to ensure it doesn't exceed 19dBm
_txp_dc = 218;
break; break;
case 20: case 20:
reg_value = 4; reg_value = 4;
// Capped to ensure it doesn't exceed 20dBm
_txp_dc = 227;
break; break;
case 21: case 21:
reg_value = 5; reg_value = 5;
_txp_dc = 247;
break; break;
case 22: case 22:
reg_value = 6; reg_value = 6;
_txp_dc = 254;
break; break;
case 23: case 23:
reg_value = 7; reg_value = 7;
_txp_dc = 255;
break; break;
case 24: case 24:
reg_value = 8; reg_value = 8;
_txp_dc = 255;
break; break;
case 25: case 25:
reg_value = 9; reg_value = 9;
_txp_dc = 255;
break; break;
case 26: case 26:
reg_value = 12; reg_value = 12;
_txp_dc = 255;
break; break;
case 27: case 27:
reg_value = 13; reg_value = 13;
_txp_dc = 255;
break; break;
default: default:
reg_value = 0; reg_value = -18;
_txp_dc = 55;
break; break;
} }

View File

@ -670,5 +670,6 @@ private:
bool _preinit_done; bool _preinit_done;
int _rxPacketLength; int _rxPacketLength;
bool _tcxo; bool _tcxo;
uint8_t _txp_dc;
}; };
#endif #endif