Skip to content

Commit ed819b0

Browse files
committed
Implemented SX126x radio workarounds provided on DS_SX1261-2_V1.2 datasheet (not publicly available yet)
1 parent b5d7ff0 commit ed819b0

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

src/radio/sx126x/radio.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,19 @@ void RadioSetRxConfig( RadioModems_t modem, uint32_t bandwidth,
725725
SX126xSetModulationParams( &SX126x.ModulationParams );
726726
SX126xSetPacketParams( &SX126x.PacketParams );
727727

728+
// WORKAROUND - Optimizing the Inverted IQ Operation, see DS_SX1261-2_V1.2 datasheet chapter 15.4
729+
if( SX126x.PacketParams.Params.LoRa.InvertIQ == LORA_IQ_INVERTED )
730+
{
731+
// RegIqPolaritySetup = @address 0x0736
732+
SX126xWriteRegister( 0x0736, SX126xReadRegister( 0x0736 ) & ~( 1 << 2 ) );
733+
}
734+
else
735+
{
736+
// RegIqPolaritySetup @address 0x0736
737+
SX126xWriteRegister( 0x0736, SX126xReadRegister( 0x0736 ) | ( 1 << 2 ) );
738+
}
739+
// WORKAROUND END
740+
728741
// Timeout Max, Timeout handled directly in SetRx function
729742
RxTimeout = 0xFFFF;
730743

@@ -820,6 +833,20 @@ void RadioSetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
820833
SX126xSetPacketParams( &SX126x.PacketParams );
821834
break;
822835
}
836+
837+
// WORKAROUND - Modulation Quality with 500 kHz LoRa® Bandwidth, see DS_SX1261-2_V1.2 datasheet chapter 15.1
838+
if( ( modem == MODEM_LORA ) && ( SX126x.ModulationParams.Params.LoRa.Bandwidth == LORA_BW_500 ) )
839+
{
840+
// RegTxModulation = @address 0x0889
841+
SX126xWriteRegister( 0x0889, SX126xReadRegister( 0x0889 ) & ~( 1 << 2 ) );
842+
}
843+
else
844+
{
845+
// RegTxModulation = @address 0x0889
846+
SX126xWriteRegister( 0x0889, SX126xReadRegister( 0x0889 ) | ( 1 << 2 ) );
847+
}
848+
// WORKAROUND END
849+
823850
SX126xSetRfTxPower( power );
824851
TxTimeout = timeout;
825852
}
@@ -1106,6 +1133,13 @@ void RadioIrqProcess( void )
11061133
{
11071134
//!< Update operating mode state to a value lower than \ref MODE_STDBY_XOSC
11081135
SX126xSetOperatingMode( MODE_STDBY_RC );
1136+
1137+
// WORKAROUND - Implicit Header Mode Timeout Behavior, see DS_SX1261-2_V1.2 datasheet chapter 15.3
1138+
// RegRtcControl = @address 0x0902
1139+
SX126xWriteRegister( 0x0902, 0x00 );
1140+
// RegEventMask = @address 0x0944
1141+
SX126xWriteRegister( 0x0944, SX126xReadRegister( 0x0944 ) | ( 1 << 1 ) );
1142+
// WORKAROUND END
11091143
}
11101144
SX126xGetPayload( RadioRxPayload, &size , 255 );
11111145
SX126xGetPacketStatus( &RadioPktStatus );

src/radio/sx126x/sx126x.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,11 @@ void SX126xSetTxParams( int8_t power, RadioRampTimes_t rampTime )
512512
}
513513
else // sx1262
514514
{
515+
// WORKAROUND - Better Resistance of the SX1262 Tx to Antenna Mismatch, see DS_SX1261-2_V1.2 datasheet chapter 15.2
516+
// RegTxClampConfig = @address 0x08D8
517+
SX126xWriteRegister( 0x08D8, SX126xReadRegister( 0x08D8 ) | ( 0x0F << 1 ) );
518+
// WORKAROUND END
519+
515520
SX126xSetPaConfig( 0x04, 0x07, 0x00, 0x01 );
516521
if( power > 22 )
517522
{

0 commit comments

Comments
 (0)