Skip to content

Commit 45c66e9

Browse files
committed
Implements fix proposed on pull-request #498 to solve ClassC Rx2 reception issues.
Should also fix issues: #509, #477 and pull-request #472
1 parent 6921e1c commit 45c66e9

File tree

5 files changed

+78
-35
lines changed

5 files changed

+78
-35
lines changed

src/radio/sx126x/radio.c

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ RadioState_t RadioGetStatus( void )
521521
return RF_TX_RUNNING;
522522
case MODE_RX:
523523
return RF_RX_RUNNING;
524-
case RF_CAD:
524+
case MODE_CAD:
525525
return RF_CAD;
526526
default:
527527
return RF_IDLE;
@@ -623,7 +623,10 @@ void RadioSetRxConfig( RadioModems_t modem, uint32_t bandwidth,
623623
{
624624

625625
RxContinuous = rxContinuous;
626-
626+
if( rxContinuous == true )
627+
{
628+
symbTimeout = 0;
629+
}
627630
if( fixLen == true )
628631
{
629632
MaxPayloadLength = payloadLen;
@@ -1071,6 +1074,7 @@ void RadioIrqProcess( void )
10711074
if( IrqFired == true )
10721075
{
10731076
CRITICAL_SECTION_BEGIN( );
1077+
// Clear IRQ flag
10741078
IrqFired = false;
10751079
CRITICAL_SECTION_END( );
10761080

@@ -1080,6 +1084,8 @@ void RadioIrqProcess( void )
10801084
if( ( irqRegs & IRQ_TX_DONE ) == IRQ_TX_DONE )
10811085
{
10821086
TimerStop( &TxTimeoutTimer );
1087+
//!< Update operating mode state to a value lower than \ref MODE_STDBY_XOSC
1088+
SX126xSetOperatingMode( MODE_STDBY_RC );
10831089
if( ( RadioEvents != NULL ) && ( RadioEvents->TxDone != NULL ) )
10841090
{
10851091
RadioEvents->TxDone( );
@@ -1091,6 +1097,11 @@ void RadioIrqProcess( void )
10911097
uint8_t size;
10921098

10931099
TimerStop( &RxTimeoutTimer );
1100+
if( RxContinuous == false )
1101+
{
1102+
//!< Update operating mode state to a value lower than \ref MODE_STDBY_XOSC
1103+
SX126xSetOperatingMode( MODE_STDBY_RC );
1104+
}
10941105
SX126xGetPayload( RadioRxPayload, &size , 255 );
10951106
SX126xGetPacketStatus( &RadioPktStatus );
10961107
if( ( RadioEvents != NULL ) && ( RadioEvents->RxDone != NULL ) )
@@ -1101,6 +1112,11 @@ void RadioIrqProcess( void )
11011112

11021113
if( ( irqRegs & IRQ_CRC_ERROR ) == IRQ_CRC_ERROR )
11031114
{
1115+
if( RxContinuous == false )
1116+
{
1117+
//!< Update operating mode state to a value lower than \ref MODE_STDBY_XOSC
1118+
SX126xSetOperatingMode( MODE_STDBY_RC );
1119+
}
11041120
if( ( RadioEvents != NULL ) && ( RadioEvents->RxError ) )
11051121
{
11061122
RadioEvents->RxError( );
@@ -1109,6 +1125,8 @@ void RadioIrqProcess( void )
11091125

11101126
if( ( irqRegs & IRQ_CAD_DONE ) == IRQ_CAD_DONE )
11111127
{
1128+
//!< Update operating mode state to a value lower than \ref MODE_STDBY_XOSC
1129+
SX126xSetOperatingMode( MODE_STDBY_RC );
11121130
if( ( RadioEvents != NULL ) && ( RadioEvents->CadDone != NULL ) )
11131131
{
11141132
RadioEvents->CadDone( ( ( irqRegs & IRQ_CAD_ACTIVITY_DETECTED ) == IRQ_CAD_ACTIVITY_DETECTED ) );
@@ -1120,6 +1138,8 @@ void RadioIrqProcess( void )
11201138
if( SX126xGetOperatingMode( ) == MODE_TX )
11211139
{
11221140
TimerStop( &TxTimeoutTimer );
1141+
//!< Update operating mode state to a value lower than \ref MODE_STDBY_XOSC
1142+
SX126xSetOperatingMode( MODE_STDBY_RC );
11231143
if( ( RadioEvents != NULL ) && ( RadioEvents->TxTimeout != NULL ) )
11241144
{
11251145
RadioEvents->TxTimeout( );
@@ -1128,6 +1148,8 @@ void RadioIrqProcess( void )
11281148
else if( SX126xGetOperatingMode( ) == MODE_RX )
11291149
{
11301150
TimerStop( &RxTimeoutTimer );
1151+
//!< Update operating mode state to a value lower than \ref MODE_STDBY_XOSC
1152+
SX126xSetOperatingMode( MODE_STDBY_RC );
11311153
if( ( RadioEvents != NULL ) && ( RadioEvents->RxTimeout != NULL ) )
11321154
{
11331155
RadioEvents->RxTimeout( );
@@ -1153,6 +1175,11 @@ void RadioIrqProcess( void )
11531175
if( ( irqRegs & IRQ_HEADER_ERROR ) == IRQ_HEADER_ERROR )
11541176
{
11551177
TimerStop( &RxTimeoutTimer );
1178+
if( RxContinuous == false )
1179+
{
1180+
//!< Update operating mode state to a value lower than \ref MODE_STDBY_XOSC
1181+
SX126xSetOperatingMode( MODE_STDBY_RC );
1182+
}
11561183
if( ( RadioEvents != NULL ) && ( RadioEvents->RxTimeout != NULL ) )
11571184
{
11581185
RadioEvents->RxTimeout( );

src/radio/sx126x/sx126x.c

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,37 @@ void SX126xInit( DioIrqHandler dioIrq )
9999
#endif
100100

101101
SX126xSetDio2AsRfSwitchCtrl( true );
102-
OperatingMode = MODE_STDBY_RC;
102+
SX126xSetOperatingMode( MODE_STDBY_RC );
103103
}
104104

105105
RadioOperatingModes_t SX126xGetOperatingMode( void )
106106
{
107107
return OperatingMode;
108108
}
109109

110+
void SX126xSetOperatingMode( RadioOperatingModes_t mode )
111+
{
112+
OperatingMode = mode;
113+
#if defined( USE_RADIO_DEBUG )
114+
switch( mode )
115+
{
116+
case MODE_TX:
117+
SX126xDbgPinTxWrite( 1 );
118+
SX126xDbgPinRxWrite( 0 );
119+
break;
120+
case MODE_RX:
121+
case MODE_RX_DC:
122+
SX126xDbgPinTxWrite( 0 );
123+
SX126xDbgPinRxWrite( 1 );
124+
break;
125+
default:
126+
SX126xDbgPinTxWrite( 0 );
127+
SX126xDbgPinRxWrite( 0 );
128+
break;
129+
}
130+
#endif
131+
}
132+
110133
void SX126xCheckDeviceReady( void )
111134
{
112135
if( ( SX126xGetOperatingMode( ) == MODE_SLEEP ) || ( SX126xGetOperatingMode( ) == MODE_RX_DC ) )
@@ -223,85 +246,64 @@ void SX126xSetSleep( SleepParams_t sleepConfig )
223246
SX126xAntSwOff( );
224247

225248
SX126xWriteCommand( RADIO_SET_SLEEP, &sleepConfig.Value, 1 );
226-
OperatingMode = MODE_SLEEP;
227-
#if defined( USE_RADIO_DEBUG )
228-
SX126xDbgPinTxWrite( 0 );
229-
SX126xDbgPinRxWrite( 0 );
230-
#endif
249+
SX126xSetOperatingMode( MODE_SLEEP );
231250
}
232251

233252
void SX126xSetStandby( RadioStandbyModes_t standbyConfig )
234253
{
235254
SX126xWriteCommand( RADIO_SET_STANDBY, ( uint8_t* )&standbyConfig, 1 );
236255
if( standbyConfig == STDBY_RC )
237256
{
238-
OperatingMode = MODE_STDBY_RC;
257+
SX126xSetOperatingMode( MODE_STDBY_RC );
239258
}
240259
else
241260
{
242-
OperatingMode = MODE_STDBY_XOSC;
261+
SX126xSetOperatingMode( MODE_STDBY_XOSC );
243262
}
244-
#if defined( USE_RADIO_DEBUG )
245-
SX126xDbgPinTxWrite( 0 );
246-
SX126xDbgPinRxWrite( 0 );
247-
#endif
248263
}
249264

250265
void SX126xSetFs( void )
251266
{
252267
SX126xWriteCommand( RADIO_SET_FS, 0, 0 );
253-
OperatingMode = MODE_FS;
254-
#if defined( USE_RADIO_DEBUG )
255-
SX126xDbgPinTxWrite( 0 );
256-
SX126xDbgPinRxWrite( 0 );
257-
#endif
268+
SX126xSetOperatingMode( MODE_FS );
258269
}
259270

260271
void SX126xSetTx( uint32_t timeout )
261272
{
262273
uint8_t buf[3];
263274

264-
OperatingMode = MODE_TX;
275+
SX126xSetOperatingMode( MODE_TX );
265276

266277
buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF );
267278
buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF );
268279
buf[2] = ( uint8_t )( timeout & 0xFF );
269280
SX126xWriteCommand( RADIO_SET_TX, buf, 3 );
270-
#if defined( USE_RADIO_DEBUG )
271-
SX126xDbgPinTxWrite( 1 );
272-
#endif
273281
}
274282

275283
void SX126xSetRx( uint32_t timeout )
276284
{
277285
uint8_t buf[3];
278286

279-
OperatingMode = MODE_RX;
287+
SX126xSetOperatingMode( MODE_RX );
280288

281289
buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF );
282290
buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF );
283291
buf[2] = ( uint8_t )( timeout & 0xFF );
284292
SX126xWriteCommand( RADIO_SET_RX, buf, 3 );
285-
#if defined( USE_RADIO_DEBUG )
286-
SX126xDbgPinRxWrite( 1 );
287-
#endif
288293
}
289294

290295
void SX126xSetRxBoosted( uint32_t timeout )
291296
{
292297
uint8_t buf[3];
293298

294-
OperatingMode = MODE_RX;
299+
SX126xSetOperatingMode( MODE_RX );
295300

296301
SX126xWriteRegister( REG_RX_GAIN, 0x96 ); // max LNA gain, increase current by ~2mA for around ~3dB in sensivity
297302

298303
buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF );
299304
buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF );
300305
buf[2] = ( uint8_t )( timeout & 0xFF );
301306
SX126xWriteCommand( RADIO_SET_RX, buf, 3 );
302-
#if defined( USE_RADIO_DEBUG )
303-
SX126xDbgPinRxWrite( 1 );
304-
#endif
305307
}
306308

307309
void SX126xSetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime )
@@ -315,13 +317,13 @@ void SX126xSetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime )
315317
buf[4] = ( uint8_t )( ( sleepTime >> 8 ) & 0xFF );
316318
buf[5] = ( uint8_t )( sleepTime & 0xFF );
317319
SX126xWriteCommand( RADIO_SET_RXDUTYCYCLE, buf, 6 );
318-
OperatingMode = MODE_RX_DC;
320+
SX126xSetOperatingMode( MODE_RX_DC );
319321
}
320322

321323
void SX126xSetCad( void )
322324
{
323325
SX126xWriteCommand( RADIO_SET_CAD, 0, 0 );
324-
OperatingMode = MODE_CAD;
326+
SX126xSetOperatingMode( MODE_CAD );
325327
}
326328

327329
void SX126xSetTxContinuousWave( void )
@@ -631,7 +633,7 @@ void SX126xSetCadParams( RadioLoRaCadSymbols_t cadSymbolNum, uint8_t cadDetPeak,
631633
buf[5] = ( uint8_t )( ( cadTimeout >> 8 ) & 0xFF );
632634
buf[6] = ( uint8_t )( cadTimeout & 0xFF );
633635
SX126xWriteCommand( RADIO_SET_CADPARAMS, buf, 5 );
634-
OperatingMode = MODE_CAD;
636+
SX126xSetOperatingMode( MODE_CAD );
635637
}
636638

637639
void SX126xSetBufferBaseAddress( uint8_t txBaseAddress, uint8_t rxBaseAddress )

src/radio/sx126x/sx126x.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -715,12 +715,22 @@ typedef struct
715715
void SX126xInit( DioIrqHandler dioIrq );
716716

717717
/*!
718-
* \brief Gets the current Operation Mode of the Radio
718+
* \brief Gets the current Radio OperationMode variable
719719
*
720720
* \retval RadioOperatingModes_t last operating mode
721721
*/
722722
RadioOperatingModes_t SX126xGetOperatingMode( void );
723723

724+
/*!
725+
* \brief Sets/Updates the current Radio OperationMode variable.
726+
*
727+
* \remark WARNING: This function is only required to reflect the current radio
728+
* operating mode when processing interrupts.
729+
*
730+
* \param [in] mode New operating mode
731+
*/
732+
void SX126xSetOperatingMode( RadioOperatingModes_t mode );
733+
724734
/*!
725735
* \brief Wakeup the radio if it is in Sleep mode and check that Busy is low
726736
*/

src/radio/sx1272/sx1272.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,9 +1020,11 @@ void SX1272SetOpMode( uint8_t opMode )
10201020
{
10211021
case RF_OPMODE_TRANSMITTER:
10221022
SX1272DbgPinTxWrite( 1 );
1023+
SX1272DbgPinRxWrite( 0 );
10231024
break;
10241025
case RF_OPMODE_RECEIVER:
10251026
case RFLR_OPMODE_RECEIVER_SINGLE:
1027+
SX1272DbgPinTxWrite( 0 );
10261028
SX1272DbgPinRxWrite( 1 );
10271029
break;
10281030
default:

src/radio/sx1276/sx1276.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,9 +1181,11 @@ void SX1276SetOpMode( uint8_t opMode )
11811181
{
11821182
case RF_OPMODE_TRANSMITTER:
11831183
SX1276DbgPinTxWrite( 1 );
1184+
SX1276DbgPinRxWrite( 0 );
11841185
break;
11851186
case RF_OPMODE_RECEIVER:
11861187
case RFLR_OPMODE_RECEIVER_SINGLE:
1188+
SX1276DbgPinTxWrite( 0 );
11871189
SX1276DbgPinRxWrite( 1 );
11881190
break;
11891191
default:

0 commit comments

Comments
 (0)