fholin fholin / Mbed 2 deprecated MiniMousetest

Dependencies:   mbed

Committer:
fholin
Date:
Fri Dec 15 13:15:04 2017 +0000
Revision:
0:2325d1d28df3
Child:
1:eda561b01daf
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fholin 0:2325d1d28df3 1 /*
fholin 0:2325d1d28df3 2 / _____) _ | |
fholin 0:2325d1d28df3 3 ( (____ _____ ____ _| |_ _____ ____| |__
fholin 0:2325d1d28df3 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
fholin 0:2325d1d28df3 5 _____) ) ____| | | || |_| ____( (___| | | |
fholin 0:2325d1d28df3 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
fholin 0:2325d1d28df3 7 (C) 2014 Semtech
fholin 0:2325d1d28df3 8
fholin 0:2325d1d28df3 9 Description: Actual implementation of a SX1276 radio, inherits Radio
fholin 0:2325d1d28df3 10
fholin 0:2325d1d28df3 11 License: Revised BSD License, see LICENSE.TXT file include in the project
fholin 0:2325d1d28df3 12
fholin 0:2325d1d28df3 13 Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin
fholin 0:2325d1d28df3 14 */
fholin 0:2325d1d28df3 15 #include "sx1276.h"
fholin 0:2325d1d28df3 16 #include "mbed.h"
fholin 0:2325d1d28df3 17
fholin 0:2325d1d28df3 18
fholin 0:2325d1d28df3 19
fholin 0:2325d1d28df3 20 Serial pcsx (PA_9, PA_10);
fholin 0:2325d1d28df3 21 # define DEBUG_PRINT(x) do {} while (0)
fholin 0:2325d1d28df3 22 const FskBandwidth_t SX1276::FskBandwidths[] =
fholin 0:2325d1d28df3 23 {
fholin 0:2325d1d28df3 24 { 2600 , 0x17 },
fholin 0:2325d1d28df3 25 { 3100 , 0x0F },
fholin 0:2325d1d28df3 26 { 3900 , 0x07 },
fholin 0:2325d1d28df3 27 { 5200 , 0x16 },
fholin 0:2325d1d28df3 28 { 6300 , 0x0E },
fholin 0:2325d1d28df3 29 { 7800 , 0x06 },
fholin 0:2325d1d28df3 30 { 10400 , 0x15 },
fholin 0:2325d1d28df3 31 { 12500 , 0x0D },
fholin 0:2325d1d28df3 32 { 15600 , 0x05 },
fholin 0:2325d1d28df3 33 { 20800 , 0x14 },
fholin 0:2325d1d28df3 34 { 25000 , 0x0C },
fholin 0:2325d1d28df3 35 { 31300 , 0x04 },
fholin 0:2325d1d28df3 36 { 41700 , 0x13 },
fholin 0:2325d1d28df3 37 { 50000 , 0x0B },
fholin 0:2325d1d28df3 38 { 62500 , 0x03 },
fholin 0:2325d1d28df3 39 { 83333 , 0x12 },
fholin 0:2325d1d28df3 40 { 100000, 0x0A },
fholin 0:2325d1d28df3 41 { 125000, 0x02 },
fholin 0:2325d1d28df3 42 { 166700, 0x11 },
fholin 0:2325d1d28df3 43 { 200000, 0x09 },
fholin 0:2325d1d28df3 44 { 250000, 0x01 },
fholin 0:2325d1d28df3 45 { 300000, 0x00 }, // Invalid Badwidth
fholin 0:2325d1d28df3 46 };
fholin 0:2325d1d28df3 47
fholin 0:2325d1d28df3 48
fholin 0:2325d1d28df3 49 SX1276::SX1276( RadioEvents_t *events,
fholin 0:2325d1d28df3 50 PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset,
fholin 0:2325d1d28df3 51 PinName dio0, PinName dio1, PinName dio2, PinName dio3, PinName dio4, PinName dio5 )
fholin 0:2325d1d28df3 52 : Radio( events ),
fholin 0:2325d1d28df3 53 spi( mosi, miso, sclk ),
fholin 0:2325d1d28df3 54 nss( nss ),
fholin 0:2325d1d28df3 55 reset( reset ),
fholin 0:2325d1d28df3 56 dio0( dio0 ), dio1( dio1 ), dio2( dio2 ), dio3( dio3 ), dio4( dio4 ), dio5( dio5 ),
fholin 0:2325d1d28df3 57 isRadioActive( false )
fholin 0:2325d1d28df3 58 {
fholin 0:2325d1d28df3 59 wait_ms( 10 );
fholin 0:2325d1d28df3 60 this->rxTx = 0;
fholin 0:2325d1d28df3 61 this->rxBuffer = new uint8_t[RX_BUFFER_SIZE];
fholin 0:2325d1d28df3 62 previousOpMode = RF_OPMODE_STANDBY;
fholin 0:2325d1d28df3 63
fholin 0:2325d1d28df3 64 this->RadioEvents = events;
fholin 0:2325d1d28df3 65
fholin 0:2325d1d28df3 66 this->dioIrq = new DioIrqHandler[6];
fholin 0:2325d1d28df3 67
fholin 0:2325d1d28df3 68 this->dioIrq[0] = &SX1276::OnDio0Irq;
fholin 0:2325d1d28df3 69 this->dioIrq[1] = &SX1276::OnDio1Irq;
fholin 0:2325d1d28df3 70 this->dioIrq[2] = &SX1276::OnDio2Irq;
fholin 0:2325d1d28df3 71 this->dioIrq[3] = &SX1276::OnDio3Irq;
fholin 0:2325d1d28df3 72 this->dioIrq[4] = &SX1276::OnDio4Irq;
fholin 0:2325d1d28df3 73 this->dioIrq[5] = NULL;
fholin 0:2325d1d28df3 74
fholin 0:2325d1d28df3 75 this->settings.State = RF_IDLE;
fholin 0:2325d1d28df3 76 }
fholin 0:2325d1d28df3 77
fholin 0:2325d1d28df3 78 SX1276::~SX1276( )
fholin 0:2325d1d28df3 79 {
fholin 0:2325d1d28df3 80 delete this->rxBuffer;
fholin 0:2325d1d28df3 81 delete this->dioIrq;
fholin 0:2325d1d28df3 82 }
fholin 0:2325d1d28df3 83
fholin 0:2325d1d28df3 84 void SX1276::Init( RadioEvents_t *events )
fholin 0:2325d1d28df3 85 {
fholin 0:2325d1d28df3 86 this->RadioEvents = events;
fholin 0:2325d1d28df3 87 }
fholin 0:2325d1d28df3 88
fholin 0:2325d1d28df3 89 RadioState SX1276::GetStatus( void )
fholin 0:2325d1d28df3 90 {
fholin 0:2325d1d28df3 91 return this->settings.State;
fholin 0:2325d1d28df3 92 }
fholin 0:2325d1d28df3 93
fholin 0:2325d1d28df3 94 void SX1276::SetChannel( uint32_t freq )
fholin 0:2325d1d28df3 95 {
fholin 0:2325d1d28df3 96 this->settings.Channel = freq;
fholin 0:2325d1d28df3 97 freq = ( uint32_t )( ( double )freq / ( double )FREQ_STEP );
fholin 0:2325d1d28df3 98 Write( REG_FRFMSB, ( uint8_t )( ( freq >> 16 ) & 0xFF ) );
fholin 0:2325d1d28df3 99 Write( REG_FRFMID, ( uint8_t )( ( freq >> 8 ) & 0xFF ) );
fholin 0:2325d1d28df3 100 Write( REG_FRFLSB, ( uint8_t )( freq & 0xFF ) );
fholin 0:2325d1d28df3 101 }
fholin 0:2325d1d28df3 102
fholin 0:2325d1d28df3 103 bool SX1276::IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh )
fholin 0:2325d1d28df3 104 {
fholin 0:2325d1d28df3 105 int16_t rssi = 0;
fholin 0:2325d1d28df3 106
fholin 0:2325d1d28df3 107 SetModem( modem );
fholin 0:2325d1d28df3 108
fholin 0:2325d1d28df3 109 SetChannel( freq );
fholin 0:2325d1d28df3 110
fholin 0:2325d1d28df3 111 SetOpMode( RF_OPMODE_RECEIVER );
fholin 0:2325d1d28df3 112
fholin 0:2325d1d28df3 113 wait_ms( 1 );
fholin 0:2325d1d28df3 114
fholin 0:2325d1d28df3 115 rssi = GetRssi( modem );
fholin 0:2325d1d28df3 116
fholin 0:2325d1d28df3 117 Sleep( );
fholin 0:2325d1d28df3 118
fholin 0:2325d1d28df3 119 if( rssi > rssiThresh )
fholin 0:2325d1d28df3 120 {
fholin 0:2325d1d28df3 121 return false;
fholin 0:2325d1d28df3 122 }
fholin 0:2325d1d28df3 123 return true;
fholin 0:2325d1d28df3 124 }
fholin 0:2325d1d28df3 125
fholin 0:2325d1d28df3 126 uint32_t SX1276::Random( void )
fholin 0:2325d1d28df3 127 {
fholin 0:2325d1d28df3 128 uint8_t i;
fholin 0:2325d1d28df3 129 uint32_t rnd = 0;
fholin 0:2325d1d28df3 130
fholin 0:2325d1d28df3 131 /*
fholin 0:2325d1d28df3 132 * Radio setup for random number generation
fholin 0:2325d1d28df3 133 */
fholin 0:2325d1d28df3 134 // Set LoRa modem ON
fholin 0:2325d1d28df3 135 SetModem( MODEM_LORA );
fholin 0:2325d1d28df3 136
fholin 0:2325d1d28df3 137 // Disable LoRa modem interrupts
fholin 0:2325d1d28df3 138 Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
fholin 0:2325d1d28df3 139 RFLR_IRQFLAGS_RXDONE |
fholin 0:2325d1d28df3 140 RFLR_IRQFLAGS_PAYLOADCRCERROR |
fholin 0:2325d1d28df3 141 RFLR_IRQFLAGS_VALIDHEADER |
fholin 0:2325d1d28df3 142 RFLR_IRQFLAGS_TXDONE |
fholin 0:2325d1d28df3 143 RFLR_IRQFLAGS_CADDONE |
fholin 0:2325d1d28df3 144 RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
fholin 0:2325d1d28df3 145 RFLR_IRQFLAGS_CADDETECTED );
fholin 0:2325d1d28df3 146
fholin 0:2325d1d28df3 147 // Set radio in continuous reception
fholin 0:2325d1d28df3 148 SetOpMode( RF_OPMODE_RECEIVER );
fholin 0:2325d1d28df3 149
fholin 0:2325d1d28df3 150 for( i = 0; i < 32; i++ )
fholin 0:2325d1d28df3 151 {
fholin 0:2325d1d28df3 152 wait_ms( 1 );
fholin 0:2325d1d28df3 153 // Unfiltered RSSI value reading. Only takes the LSB value
fholin 0:2325d1d28df3 154 rnd |= ( ( uint32_t )Read( REG_LR_RSSIWIDEBAND ) & 0x01 ) << i;
fholin 0:2325d1d28df3 155 }
fholin 0:2325d1d28df3 156
fholin 0:2325d1d28df3 157 Sleep( );
fholin 0:2325d1d28df3 158
fholin 0:2325d1d28df3 159 return rnd;
fholin 0:2325d1d28df3 160 }
fholin 0:2325d1d28df3 161
fholin 0:2325d1d28df3 162 /*!
fholin 0:2325d1d28df3 163 * Performs the Rx chain calibration for LF and HF bands
fholin 0:2325d1d28df3 164 * \remark Must be called just after the reset so all registers are at their
fholin 0:2325d1d28df3 165 * default values
fholin 0:2325d1d28df3 166 */
fholin 0:2325d1d28df3 167 void SX1276::RxChainCalibration( void )
fholin 0:2325d1d28df3 168 {
fholin 0:2325d1d28df3 169 uint8_t regPaConfigInitVal;
fholin 0:2325d1d28df3 170 uint32_t initialFreq;
fholin 0:2325d1d28df3 171
fholin 0:2325d1d28df3 172 // Save context
fholin 0:2325d1d28df3 173 regPaConfigInitVal = this->Read( REG_PACONFIG );
fholin 0:2325d1d28df3 174 initialFreq = ( double )( ( ( uint32_t )this->Read( REG_FRFMSB ) << 16 ) |
fholin 0:2325d1d28df3 175 ( ( uint32_t )this->Read( REG_FRFMID ) << 8 ) |
fholin 0:2325d1d28df3 176 ( ( uint32_t )this->Read( REG_FRFLSB ) ) ) * ( double )FREQ_STEP;
fholin 0:2325d1d28df3 177
fholin 0:2325d1d28df3 178 // Cut the PA just in case, RFO output, power = -1 dBm
fholin 0:2325d1d28df3 179 this->Write( REG_PACONFIG, 0x00 );
fholin 0:2325d1d28df3 180
fholin 0:2325d1d28df3 181 // Launch Rx chain calibration for LF band
fholin 0:2325d1d28df3 182 Write ( REG_IMAGECAL, ( Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_MASK ) | RF_IMAGECAL_IMAGECAL_START );
fholin 0:2325d1d28df3 183 while( ( Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_RUNNING ) == RF_IMAGECAL_IMAGECAL_RUNNING )
fholin 0:2325d1d28df3 184 {
fholin 0:2325d1d28df3 185 }
fholin 0:2325d1d28df3 186
fholin 0:2325d1d28df3 187 // Sets a Frequency in HF band
fholin 0:2325d1d28df3 188 SetChannel( 868000000 );
fholin 0:2325d1d28df3 189
fholin 0:2325d1d28df3 190 // Launch Rx chain calibration for HF band
fholin 0:2325d1d28df3 191 Write ( REG_IMAGECAL, ( Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_MASK ) | RF_IMAGECAL_IMAGECAL_START );
fholin 0:2325d1d28df3 192 while( ( Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_RUNNING ) == RF_IMAGECAL_IMAGECAL_RUNNING )
fholin 0:2325d1d28df3 193 {
fholin 0:2325d1d28df3 194 }
fholin 0:2325d1d28df3 195
fholin 0:2325d1d28df3 196 // Restore context
fholin 0:2325d1d28df3 197 this->Write( REG_PACONFIG, regPaConfigInitVal );
fholin 0:2325d1d28df3 198 SetChannel( initialFreq );
fholin 0:2325d1d28df3 199 }
fholin 0:2325d1d28df3 200
fholin 0:2325d1d28df3 201 /*!
fholin 0:2325d1d28df3 202 * Returns the known FSK bandwidth registers value
fholin 0:2325d1d28df3 203 *
fholin 0:2325d1d28df3 204 * \param [IN] bandwidth Bandwidth value in Hz
fholin 0:2325d1d28df3 205 * \retval regValue Bandwidth register value.
fholin 0:2325d1d28df3 206 */
fholin 0:2325d1d28df3 207 uint8_t SX1276::GetFskBandwidthRegValue( uint32_t bandwidth )
fholin 0:2325d1d28df3 208 {
fholin 0:2325d1d28df3 209 uint8_t i;
fholin 0:2325d1d28df3 210
fholin 0:2325d1d28df3 211 for( i = 0; i < ( sizeof( FskBandwidths ) / sizeof( FskBandwidth_t ) ) - 1; i++ )
fholin 0:2325d1d28df3 212 {
fholin 0:2325d1d28df3 213 if( ( bandwidth >= FskBandwidths[i].bandwidth ) && ( bandwidth < FskBandwidths[i + 1].bandwidth ) )
fholin 0:2325d1d28df3 214 {
fholin 0:2325d1d28df3 215 return FskBandwidths[i].RegValue;
fholin 0:2325d1d28df3 216 }
fholin 0:2325d1d28df3 217 }
fholin 0:2325d1d28df3 218 // ERROR: Value not found
fholin 0:2325d1d28df3 219 while( 1 );
fholin 0:2325d1d28df3 220 }
fholin 0:2325d1d28df3 221
fholin 0:2325d1d28df3 222 void SX1276::SetRxConfig( RadioModems_t modem, uint32_t bandwidth,
fholin 0:2325d1d28df3 223 uint32_t datarate, uint8_t coderate,
fholin 0:2325d1d28df3 224 uint32_t bandwidthAfc, uint16_t preambleLen,
fholin 0:2325d1d28df3 225 uint16_t symbTimeout, bool fixLen,
fholin 0:2325d1d28df3 226 uint8_t payloadLen,
fholin 0:2325d1d28df3 227 bool crcOn, bool freqHopOn, uint8_t hopPeriod,
fholin 0:2325d1d28df3 228 bool iqInverted, bool rxContinuous )
fholin 0:2325d1d28df3 229 {
fholin 0:2325d1d28df3 230 SetModem( modem );
fholin 0:2325d1d28df3 231
fholin 0:2325d1d28df3 232 switch( modem )
fholin 0:2325d1d28df3 233 {
fholin 0:2325d1d28df3 234 case MODEM_FSK:
fholin 0:2325d1d28df3 235 {
fholin 0:2325d1d28df3 236 this->settings.Fsk.Bandwidth = bandwidth;
fholin 0:2325d1d28df3 237 this->settings.Fsk.Datarate = datarate;
fholin 0:2325d1d28df3 238 this->settings.Fsk.BandwidthAfc = bandwidthAfc;
fholin 0:2325d1d28df3 239 this->settings.Fsk.FixLen = fixLen;
fholin 0:2325d1d28df3 240 this->settings.Fsk.PayloadLen = payloadLen;
fholin 0:2325d1d28df3 241 this->settings.Fsk.CrcOn = crcOn;
fholin 0:2325d1d28df3 242 this->settings.Fsk.IqInverted = iqInverted;
fholin 0:2325d1d28df3 243 this->settings.Fsk.RxContinuous = rxContinuous;
fholin 0:2325d1d28df3 244 this->settings.Fsk.PreambleLen = preambleLen;
fholin 0:2325d1d28df3 245
fholin 0:2325d1d28df3 246 datarate = ( uint16_t )( ( double )XTAL_FREQ / ( double )datarate );
fholin 0:2325d1d28df3 247 Write( REG_BITRATEMSB, ( uint8_t )( datarate >> 8 ) );
fholin 0:2325d1d28df3 248 Write( REG_BITRATELSB, ( uint8_t )( datarate & 0xFF ) );
fholin 0:2325d1d28df3 249
fholin 0:2325d1d28df3 250 Write( REG_RXBW, GetFskBandwidthRegValue( bandwidth ) );
fholin 0:2325d1d28df3 251 Write( REG_AFCBW, GetFskBandwidthRegValue( bandwidthAfc ) );
fholin 0:2325d1d28df3 252
fholin 0:2325d1d28df3 253 Write( REG_PREAMBLEMSB, ( uint8_t )( ( preambleLen >> 8 ) & 0xFF ) );
fholin 0:2325d1d28df3 254 Write( REG_PREAMBLELSB, ( uint8_t )( preambleLen & 0xFF ) );
fholin 0:2325d1d28df3 255
fholin 0:2325d1d28df3 256 if( fixLen == 1 )
fholin 0:2325d1d28df3 257 {
fholin 0:2325d1d28df3 258 Write( REG_PAYLOADLENGTH, payloadLen );
fholin 0:2325d1d28df3 259 }
fholin 0:2325d1d28df3 260
fholin 0:2325d1d28df3 261 Write( REG_PACKETCONFIG1,
fholin 0:2325d1d28df3 262 ( Read( REG_PACKETCONFIG1 ) &
fholin 0:2325d1d28df3 263 RF_PACKETCONFIG1_CRC_MASK &
fholin 0:2325d1d28df3 264 RF_PACKETCONFIG1_PACKETFORMAT_MASK ) |
fholin 0:2325d1d28df3 265 ( ( fixLen == 1 ) ? RF_PACKETCONFIG1_PACKETFORMAT_FIXED : RF_PACKETCONFIG1_PACKETFORMAT_VARIABLE ) |
fholin 0:2325d1d28df3 266 ( crcOn << 4 ) );
fholin 0:2325d1d28df3 267 }
fholin 0:2325d1d28df3 268 break;
fholin 0:2325d1d28df3 269 case MODEM_LORA:
fholin 0:2325d1d28df3 270 {
fholin 0:2325d1d28df3 271 if( bandwidth > 2 )
fholin 0:2325d1d28df3 272 {
fholin 0:2325d1d28df3 273 // Fatal error: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
fholin 0:2325d1d28df3 274 while( 1 );
fholin 0:2325d1d28df3 275 }
fholin 0:2325d1d28df3 276 bandwidth += 7;
fholin 0:2325d1d28df3 277 this->settings.LoRa.Bandwidth = bandwidth;
fholin 0:2325d1d28df3 278 this->settings.LoRa.Datarate = datarate;
fholin 0:2325d1d28df3 279 this->settings.LoRa.Coderate = coderate;
fholin 0:2325d1d28df3 280 this->settings.LoRa.PreambleLen = preambleLen;
fholin 0:2325d1d28df3 281 this->settings.LoRa.FixLen = fixLen;
fholin 0:2325d1d28df3 282 this->settings.LoRa.PayloadLen = payloadLen;
fholin 0:2325d1d28df3 283 this->settings.LoRa.CrcOn = crcOn;
fholin 0:2325d1d28df3 284 this->settings.LoRa.FreqHopOn = freqHopOn;
fholin 0:2325d1d28df3 285 this->settings.LoRa.HopPeriod = hopPeriod;
fholin 0:2325d1d28df3 286 this->settings.LoRa.IqInverted = iqInverted;
fholin 0:2325d1d28df3 287 this->settings.LoRa.RxContinuous = rxContinuous;
fholin 0:2325d1d28df3 288
fholin 0:2325d1d28df3 289 if( datarate > 12 )
fholin 0:2325d1d28df3 290 {
fholin 0:2325d1d28df3 291 datarate = 12;
fholin 0:2325d1d28df3 292 }
fholin 0:2325d1d28df3 293 else if( datarate < 6 )
fholin 0:2325d1d28df3 294 {
fholin 0:2325d1d28df3 295 datarate = 6;
fholin 0:2325d1d28df3 296 }
fholin 0:2325d1d28df3 297
fholin 0:2325d1d28df3 298 if( ( ( bandwidth == 7 ) && ( ( datarate == 11 ) ||( datarate == 11 ) || ( datarate == 12 ) ) ) ||
fholin 0:2325d1d28df3 299 ( ( bandwidth == 8 ) && (( datarate == 11 ) ||( datarate == 12 ) )) )
fholin 0:2325d1d28df3 300
fholin 0:2325d1d28df3 301 {
fholin 0:2325d1d28df3 302 this->settings.LoRa.LowDatarateOptimize = 0x01;
fholin 0:2325d1d28df3 303 }
fholin 0:2325d1d28df3 304 else
fholin 0:2325d1d28df3 305 {
fholin 0:2325d1d28df3 306 this->settings.LoRa.LowDatarateOptimize = 0x00;
fholin 0:2325d1d28df3 307 }
fholin 0:2325d1d28df3 308
fholin 0:2325d1d28df3 309 Write( REG_LR_MODEMCONFIG1,
fholin 0:2325d1d28df3 310 ( Read( REG_LR_MODEMCONFIG1 ) &
fholin 0:2325d1d28df3 311 RFLR_MODEMCONFIG1_BW_MASK &
fholin 0:2325d1d28df3 312 RFLR_MODEMCONFIG1_CODINGRATE_MASK &
fholin 0:2325d1d28df3 313 RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK ) |
fholin 0:2325d1d28df3 314 ( bandwidth << 4 ) | ( coderate << 1 ) |
fholin 0:2325d1d28df3 315 fixLen );
fholin 0:2325d1d28df3 316
fholin 0:2325d1d28df3 317 Write( REG_LR_MODEMCONFIG2,
fholin 0:2325d1d28df3 318 ( Read( REG_LR_MODEMCONFIG2 ) &
fholin 0:2325d1d28df3 319 RFLR_MODEMCONFIG2_SF_MASK &
fholin 0:2325d1d28df3 320 RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK &
fholin 0:2325d1d28df3 321 RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK ) |
fholin 0:2325d1d28df3 322 ( datarate << 4 ) | ( crcOn << 2 ) |
fholin 0:2325d1d28df3 323 ( ( symbTimeout >> 8 ) & ~RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK ) );
fholin 0:2325d1d28df3 324
fholin 0:2325d1d28df3 325 Write( REG_LR_MODEMCONFIG3,
fholin 0:2325d1d28df3 326 ( Read( REG_LR_MODEMCONFIG3 ) &
fholin 0:2325d1d28df3 327 RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK ) |
fholin 0:2325d1d28df3 328 ( this->settings.LoRa.LowDatarateOptimize << 3 ) );
fholin 0:2325d1d28df3 329
fholin 0:2325d1d28df3 330 Write( REG_LR_SYMBTIMEOUTLSB, ( uint8_t )( symbTimeout & 0xFF ) );
fholin 0:2325d1d28df3 331
fholin 0:2325d1d28df3 332 Write( REG_LR_PREAMBLEMSB, ( uint8_t )( ( preambleLen >> 8 ) & 0xFF ) );
fholin 0:2325d1d28df3 333 Write( REG_LR_PREAMBLELSB, ( uint8_t )( preambleLen & 0xFF ) );
fholin 0:2325d1d28df3 334
fholin 0:2325d1d28df3 335 if( fixLen == 1 )
fholin 0:2325d1d28df3 336 {
fholin 0:2325d1d28df3 337 Write( REG_LR_PAYLOADLENGTH, payloadLen );
fholin 0:2325d1d28df3 338 }
fholin 0:2325d1d28df3 339
fholin 0:2325d1d28df3 340 if( this->settings.LoRa.FreqHopOn == true )
fholin 0:2325d1d28df3 341 {
fholin 0:2325d1d28df3 342 Write( REG_LR_PLLHOP, ( Read( REG_LR_PLLHOP ) & RFLR_PLLHOP_FASTHOP_MASK ) | RFLR_PLLHOP_FASTHOP_ON );
fholin 0:2325d1d28df3 343 Write( REG_LR_HOPPERIOD, this->settings.LoRa.HopPeriod );
fholin 0:2325d1d28df3 344 }
fholin 0:2325d1d28df3 345
fholin 0:2325d1d28df3 346 if( ( bandwidth == 9 ) && ( RF_MID_BAND_THRESH ) )
fholin 0:2325d1d28df3 347 {
fholin 0:2325d1d28df3 348 // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
fholin 0:2325d1d28df3 349 Write( REG_LR_TEST36, 0x02 );
fholin 0:2325d1d28df3 350 Write( REG_LR_TEST3A, 0x64 );
fholin 0:2325d1d28df3 351 }
fholin 0:2325d1d28df3 352 else if( bandwidth == 9 )
fholin 0:2325d1d28df3 353 {
fholin 0:2325d1d28df3 354 // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
fholin 0:2325d1d28df3 355 Write( REG_LR_TEST36, 0x02 );
fholin 0:2325d1d28df3 356 Write( REG_LR_TEST3A, 0x7F );
fholin 0:2325d1d28df3 357 }
fholin 0:2325d1d28df3 358 else
fholin 0:2325d1d28df3 359 {
fholin 0:2325d1d28df3 360 // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
fholin 0:2325d1d28df3 361 Write( REG_LR_TEST36, 0x03 );
fholin 0:2325d1d28df3 362 }
fholin 0:2325d1d28df3 363
fholin 0:2325d1d28df3 364 if( datarate == 6 )
fholin 0:2325d1d28df3 365 {
fholin 0:2325d1d28df3 366 Write( REG_LR_DETECTOPTIMIZE,
fholin 0:2325d1d28df3 367 ( Read( REG_LR_DETECTOPTIMIZE ) &
fholin 0:2325d1d28df3 368 RFLR_DETECTIONOPTIMIZE_MASK ) |
fholin 0:2325d1d28df3 369 RFLR_DETECTIONOPTIMIZE_SF6 );
fholin 0:2325d1d28df3 370 Write( REG_LR_DETECTIONTHRESHOLD,
fholin 0:2325d1d28df3 371 RFLR_DETECTIONTHRESH_SF6 );
fholin 0:2325d1d28df3 372 }
fholin 0:2325d1d28df3 373 else
fholin 0:2325d1d28df3 374 {
fholin 0:2325d1d28df3 375 Write( REG_LR_DETECTOPTIMIZE,
fholin 0:2325d1d28df3 376 ( Read( REG_LR_DETECTOPTIMIZE ) &
fholin 0:2325d1d28df3 377 RFLR_DETECTIONOPTIMIZE_MASK ) |
fholin 0:2325d1d28df3 378 RFLR_DETECTIONOPTIMIZE_SF7_TO_SF12 );
fholin 0:2325d1d28df3 379 Write( REG_LR_DETECTIONTHRESHOLD,
fholin 0:2325d1d28df3 380 RFLR_DETECTIONTHRESH_SF7_TO_SF12 );
fholin 0:2325d1d28df3 381 }
fholin 0:2325d1d28df3 382 }
fholin 0:2325d1d28df3 383 break;
fholin 0:2325d1d28df3 384 }
fholin 0:2325d1d28df3 385 }
fholin 0:2325d1d28df3 386
fholin 0:2325d1d28df3 387 void SX1276::SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
fholin 0:2325d1d28df3 388 uint32_t bandwidth, uint32_t datarate,
fholin 0:2325d1d28df3 389 uint8_t coderate, uint16_t preambleLen,
fholin 0:2325d1d28df3 390 bool fixLen, bool crcOn, bool freqHopOn,
fholin 0:2325d1d28df3 391 uint8_t hopPeriod, bool iqInverted, uint32_t timeout )
fholin 0:2325d1d28df3 392 {
fholin 0:2325d1d28df3 393 uint8_t paConfig = 0;
fholin 0:2325d1d28df3 394 uint8_t paDac = 0;
fholin 0:2325d1d28df3 395
fholin 0:2325d1d28df3 396 SetModem( modem );
fholin 0:2325d1d28df3 397
fholin 0:2325d1d28df3 398 paConfig = Read( REG_PACONFIG );
fholin 0:2325d1d28df3 399 paDac = Read( REG_PADAC );
fholin 0:2325d1d28df3 400
fholin 0:2325d1d28df3 401 paConfig = ( paConfig & RF_PACONFIG_PASELECT_MASK ) | GetPaSelect( this->settings.Channel );
fholin 0:2325d1d28df3 402 paConfig = ( paConfig & RF_PACONFIG_MAX_POWER_MASK ) | 0x70;
fholin 0:2325d1d28df3 403
fholin 0:2325d1d28df3 404 if( ( paConfig & RF_PACONFIG_PASELECT_PABOOST ) == RF_PACONFIG_PASELECT_PABOOST )
fholin 0:2325d1d28df3 405 {
fholin 0:2325d1d28df3 406 if( power > 17 )
fholin 0:2325d1d28df3 407 {
fholin 0:2325d1d28df3 408 paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_ON;
fholin 0:2325d1d28df3 409 }
fholin 0:2325d1d28df3 410 else
fholin 0:2325d1d28df3 411 {
fholin 0:2325d1d28df3 412 paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_OFF;
fholin 0:2325d1d28df3 413 }
fholin 0:2325d1d28df3 414 if( ( paDac & RF_PADAC_20DBM_ON ) == RF_PADAC_20DBM_ON )
fholin 0:2325d1d28df3 415 {
fholin 0:2325d1d28df3 416 if( power < 5 )
fholin 0:2325d1d28df3 417 {
fholin 0:2325d1d28df3 418 power = 5;
fholin 0:2325d1d28df3 419 }
fholin 0:2325d1d28df3 420 if( power > 20 )
fholin 0:2325d1d28df3 421 {
fholin 0:2325d1d28df3 422 power = 20;
fholin 0:2325d1d28df3 423 }
fholin 0:2325d1d28df3 424 paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 5 ) & 0x0F );
fholin 0:2325d1d28df3 425 }
fholin 0:2325d1d28df3 426 else
fholin 0:2325d1d28df3 427 {
fholin 0:2325d1d28df3 428 if( power < 2 )
fholin 0:2325d1d28df3 429 {
fholin 0:2325d1d28df3 430 power = 2;
fholin 0:2325d1d28df3 431 }
fholin 0:2325d1d28df3 432 if( power > 17 )
fholin 0:2325d1d28df3 433 {
fholin 0:2325d1d28df3 434 power = 17;
fholin 0:2325d1d28df3 435 }
fholin 0:2325d1d28df3 436 paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 2 ) & 0x0F );
fholin 0:2325d1d28df3 437 }
fholin 0:2325d1d28df3 438 }
fholin 0:2325d1d28df3 439 else
fholin 0:2325d1d28df3 440 {
fholin 0:2325d1d28df3 441 if( power < -1 )
fholin 0:2325d1d28df3 442 {
fholin 0:2325d1d28df3 443 power = -1;
fholin 0:2325d1d28df3 444 }
fholin 0:2325d1d28df3 445 if( power > 14 )
fholin 0:2325d1d28df3 446 {
fholin 0:2325d1d28df3 447 power = 14;
fholin 0:2325d1d28df3 448 }
fholin 0:2325d1d28df3 449 paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power + 1 ) & 0x0F );
fholin 0:2325d1d28df3 450 }
fholin 0:2325d1d28df3 451 Write( REG_PACONFIG, paConfig );
fholin 0:2325d1d28df3 452 Write( REG_PADAC, paDac );
fholin 0:2325d1d28df3 453 //pcsx.printf("Send in lora mode pa = %d \n",power);
fholin 0:2325d1d28df3 454 switch( modem )
fholin 0:2325d1d28df3 455 {
fholin 0:2325d1d28df3 456 case MODEM_FSK:
fholin 0:2325d1d28df3 457 {
fholin 0:2325d1d28df3 458 this->settings.Fsk.Power = power;
fholin 0:2325d1d28df3 459 this->settings.Fsk.Fdev = fdev;
fholin 0:2325d1d28df3 460 this->settings.Fsk.Bandwidth = bandwidth;
fholin 0:2325d1d28df3 461 this->settings.Fsk.Datarate = datarate;
fholin 0:2325d1d28df3 462 this->settings.Fsk.PreambleLen = preambleLen;
fholin 0:2325d1d28df3 463 this->settings.Fsk.FixLen = fixLen;
fholin 0:2325d1d28df3 464 this->settings.Fsk.CrcOn = crcOn;
fholin 0:2325d1d28df3 465 this->settings.Fsk.IqInverted = iqInverted;
fholin 0:2325d1d28df3 466 this->settings.Fsk.TxTimeout = timeout;
fholin 0:2325d1d28df3 467
fholin 0:2325d1d28df3 468 fdev = ( uint16_t )( ( double )fdev / ( double )FREQ_STEP );
fholin 0:2325d1d28df3 469 Write( REG_FDEVMSB, ( uint8_t )( fdev >> 8 ) );
fholin 0:2325d1d28df3 470 Write( REG_FDEVLSB, ( uint8_t )( fdev & 0xFF ) );
fholin 0:2325d1d28df3 471
fholin 0:2325d1d28df3 472 datarate = ( uint16_t )( ( double )XTAL_FREQ / ( double )datarate );
fholin 0:2325d1d28df3 473 Write( REG_BITRATEMSB, ( uint8_t )( datarate >> 8 ) );
fholin 0:2325d1d28df3 474 Write( REG_BITRATELSB, ( uint8_t )( datarate & 0xFF ) );
fholin 0:2325d1d28df3 475
fholin 0:2325d1d28df3 476 Write( REG_PREAMBLEMSB, ( preambleLen >> 8 ) & 0x00FF );
fholin 0:2325d1d28df3 477 Write( REG_PREAMBLELSB, preambleLen & 0xFF );
fholin 0:2325d1d28df3 478
fholin 0:2325d1d28df3 479 Write( REG_PACKETCONFIG1,
fholin 0:2325d1d28df3 480 ( Read( REG_PACKETCONFIG1 ) &
fholin 0:2325d1d28df3 481 RF_PACKETCONFIG1_CRC_MASK &
fholin 0:2325d1d28df3 482 RF_PACKETCONFIG1_PACKETFORMAT_MASK ) |
fholin 0:2325d1d28df3 483 ( ( fixLen == 1 ) ? RF_PACKETCONFIG1_PACKETFORMAT_FIXED : RF_PACKETCONFIG1_PACKETFORMAT_VARIABLE ) |
fholin 0:2325d1d28df3 484 ( crcOn << 4 ) );
fholin 0:2325d1d28df3 485
fholin 0:2325d1d28df3 486 }
fholin 0:2325d1d28df3 487 break;
fholin 0:2325d1d28df3 488 case MODEM_LORA:
fholin 0:2325d1d28df3 489 {
fholin 0:2325d1d28df3 490 this->settings.LoRa.Power = power;
fholin 0:2325d1d28df3 491 if( bandwidth > 2 )
fholin 0:2325d1d28df3 492 {
fholin 0:2325d1d28df3 493 // Fatal error: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
fholin 0:2325d1d28df3 494 while( 1 );
fholin 0:2325d1d28df3 495 }
fholin 0:2325d1d28df3 496 bandwidth += 7;
fholin 0:2325d1d28df3 497 this->settings.LoRa.Bandwidth = bandwidth;
fholin 0:2325d1d28df3 498 this->settings.LoRa.Datarate = datarate;
fholin 0:2325d1d28df3 499 this->settings.LoRa.Coderate = coderate;
fholin 0:2325d1d28df3 500 this->settings.LoRa.PreambleLen = preambleLen;
fholin 0:2325d1d28df3 501 this->settings.LoRa.FixLen = fixLen;
fholin 0:2325d1d28df3 502 this->settings.LoRa.FreqHopOn = freqHopOn;
fholin 0:2325d1d28df3 503 this->settings.LoRa.HopPeriod = hopPeriod;
fholin 0:2325d1d28df3 504 this->settings.LoRa.CrcOn = crcOn;
fholin 0:2325d1d28df3 505 this->settings.LoRa.IqInverted = iqInverted;
fholin 0:2325d1d28df3 506 this->settings.LoRa.TxTimeout = timeout;
fholin 0:2325d1d28df3 507
fholin 0:2325d1d28df3 508 if( datarate > 12 )
fholin 0:2325d1d28df3 509 {
fholin 0:2325d1d28df3 510 datarate = 12;
fholin 0:2325d1d28df3 511 }
fholin 0:2325d1d28df3 512 else if( datarate < 6 )
fholin 0:2325d1d28df3 513 {
fholin 0:2325d1d28df3 514 datarate = 6;
fholin 0:2325d1d28df3 515 }
fholin 0:2325d1d28df3 516 if( ( ( bandwidth == 7 ) && ( ( datarate == 11 ) || ( datarate == 12 ) ) ) ||
fholin 0:2325d1d28df3 517 ( ( bandwidth == 8 ) && ( datarate == 12 ) ) )
fholin 0:2325d1d28df3 518
fholin 0:2325d1d28df3 519 {
fholin 0:2325d1d28df3 520 this->settings.LoRa.LowDatarateOptimize = 0x01;
fholin 0:2325d1d28df3 521 }
fholin 0:2325d1d28df3 522 else
fholin 0:2325d1d28df3 523 {
fholin 0:2325d1d28df3 524 this->settings.LoRa.LowDatarateOptimize = 0x00;
fholin 0:2325d1d28df3 525 }
fholin 0:2325d1d28df3 526
fholin 0:2325d1d28df3 527 if( this->settings.LoRa.FreqHopOn == true )
fholin 0:2325d1d28df3 528 {
fholin 0:2325d1d28df3 529 // DEBUG_PRINT("Send freq hop mod!!!! \n");
fholin 0:2325d1d28df3 530 Write( REG_LR_PLLHOP, ( Read( REG_LR_PLLHOP ) & RFLR_PLLHOP_FASTHOP_MASK ) | RFLR_PLLHOP_FASTHOP_ON );
fholin 0:2325d1d28df3 531 Write( REG_LR_HOPPERIOD, this->settings.LoRa.HopPeriod );
fholin 0:2325d1d28df3 532 }
fholin 0:2325d1d28df3 533
fholin 0:2325d1d28df3 534 Write( REG_LR_MODEMCONFIG1,
fholin 0:2325d1d28df3 535 ( Read( REG_LR_MODEMCONFIG1 ) &
fholin 0:2325d1d28df3 536 RFLR_MODEMCONFIG1_BW_MASK &
fholin 0:2325d1d28df3 537 RFLR_MODEMCONFIG1_CODINGRATE_MASK &
fholin 0:2325d1d28df3 538 RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK ) |
fholin 0:2325d1d28df3 539 ( bandwidth << 4 ) | ( coderate << 1 ) |
fholin 0:2325d1d28df3 540 fixLen );
fholin 0:2325d1d28df3 541
fholin 0:2325d1d28df3 542 Write( REG_LR_MODEMCONFIG2,
fholin 0:2325d1d28df3 543 ( Read( REG_LR_MODEMCONFIG2 ) &
fholin 0:2325d1d28df3 544 RFLR_MODEMCONFIG2_SF_MASK &
fholin 0:2325d1d28df3 545 RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK ) |
fholin 0:2325d1d28df3 546 ( datarate << 4 ) | ( crcOn << 2 ) );
fholin 0:2325d1d28df3 547
fholin 0:2325d1d28df3 548 Write( REG_LR_MODEMCONFIG3,
fholin 0:2325d1d28df3 549 ( Read( REG_LR_MODEMCONFIG3 ) &
fholin 0:2325d1d28df3 550 RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK ) |
fholin 0:2325d1d28df3 551 ( this->settings.LoRa.LowDatarateOptimize << 3 ) );
fholin 0:2325d1d28df3 552
fholin 0:2325d1d28df3 553 Write( REG_LR_PREAMBLEMSB, ( preambleLen >> 8 ) & 0x00FF );
fholin 0:2325d1d28df3 554 Write( REG_LR_PREAMBLELSB, preambleLen & 0xFF );
fholin 0:2325d1d28df3 555
fholin 0:2325d1d28df3 556 if( datarate == 6 )
fholin 0:2325d1d28df3 557 {
fholin 0:2325d1d28df3 558 Write( REG_LR_DETECTOPTIMIZE,
fholin 0:2325d1d28df3 559 ( Read( REG_LR_DETECTOPTIMIZE ) &
fholin 0:2325d1d28df3 560 RFLR_DETECTIONOPTIMIZE_MASK ) |
fholin 0:2325d1d28df3 561 RFLR_DETECTIONOPTIMIZE_SF6 );
fholin 0:2325d1d28df3 562 Write( REG_LR_DETECTIONTHRESHOLD,
fholin 0:2325d1d28df3 563 RFLR_DETECTIONTHRESH_SF6 );
fholin 0:2325d1d28df3 564 }
fholin 0:2325d1d28df3 565 else
fholin 0:2325d1d28df3 566 {
fholin 0:2325d1d28df3 567 Write( REG_LR_DETECTOPTIMIZE,
fholin 0:2325d1d28df3 568 ( Read( REG_LR_DETECTOPTIMIZE ) &
fholin 0:2325d1d28df3 569 RFLR_DETECTIONOPTIMIZE_MASK ) |
fholin 0:2325d1d28df3 570 RFLR_DETECTIONOPTIMIZE_SF7_TO_SF12 );
fholin 0:2325d1d28df3 571 Write( REG_LR_DETECTIONTHRESHOLD,
fholin 0:2325d1d28df3 572 RFLR_DETECTIONTHRESH_SF7_TO_SF12 );
fholin 0:2325d1d28df3 573 }
fholin 0:2325d1d28df3 574 }
fholin 0:2325d1d28df3 575 break;
fholin 0:2325d1d28df3 576 }
fholin 0:2325d1d28df3 577 }
fholin 0:2325d1d28df3 578
fholin 0:2325d1d28df3 579 double SX1276::TimeOnAir( RadioModems_t modem, uint8_t pktLen )
fholin 0:2325d1d28df3 580 {
fholin 0:2325d1d28df3 581 uint32_t airTime = 0;
fholin 0:2325d1d28df3 582
fholin 0:2325d1d28df3 583 switch( modem )
fholin 0:2325d1d28df3 584 {
fholin 0:2325d1d28df3 585 case MODEM_FSK:
fholin 0:2325d1d28df3 586 {
fholin 0:2325d1d28df3 587 airTime = rint( ( 8 * ( this->settings.Fsk.PreambleLen +
fholin 0:2325d1d28df3 588 ( ( Read( REG_SYNCCONFIG ) & ~RF_SYNCCONFIG_SYNCSIZE_MASK ) + 1 ) +
fholin 0:2325d1d28df3 589 ( ( this->settings.Fsk.FixLen == 0x01 ) ? 0.0 : 1.0 ) +
fholin 0:2325d1d28df3 590 ( ( ( Read( REG_PACKETCONFIG1 ) & ~RF_PACKETCONFIG1_ADDRSFILTERING_MASK ) != 0x00 ) ? 1.0 : 0 ) +
fholin 0:2325d1d28df3 591 pktLen +
fholin 0:2325d1d28df3 592 ( ( this->settings.Fsk.CrcOn == 0x01 ) ? 2.0 : 0 ) ) /
fholin 0:2325d1d28df3 593 this->settings.Fsk.Datarate ) * 1e6 );
fholin 0:2325d1d28df3 594 }
fholin 0:2325d1d28df3 595 break;
fholin 0:2325d1d28df3 596 case MODEM_LORA:
fholin 0:2325d1d28df3 597 {
fholin 0:2325d1d28df3 598 double bw = 0.0;
fholin 0:2325d1d28df3 599 // REMARK: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
fholin 0:2325d1d28df3 600 switch( this->settings.LoRa.Bandwidth )
fholin 0:2325d1d28df3 601 {
fholin 0:2325d1d28df3 602 //case 0: // 7.8 kHz
fholin 0:2325d1d28df3 603 // bw = 78e2;
fholin 0:2325d1d28df3 604 // break;
fholin 0:2325d1d28df3 605 //case 1: // 10.4 kHz
fholin 0:2325d1d28df3 606 // bw = 104e2;
fholin 0:2325d1d28df3 607 // break;
fholin 0:2325d1d28df3 608 //case 2: // 15.6 kHz
fholin 0:2325d1d28df3 609 // bw = 156e2;
fholin 0:2325d1d28df3 610 // break;
fholin 0:2325d1d28df3 611 //case 3: // 20.8 kHz
fholin 0:2325d1d28df3 612 // bw = 208e2;
fholin 0:2325d1d28df3 613 // break;
fholin 0:2325d1d28df3 614 //case 4: // 31.2 kHz
fholin 0:2325d1d28df3 615 // bw = 312e2;
fholin 0:2325d1d28df3 616 // break;
fholin 0:2325d1d28df3 617 //case 5: // 41.4 kHz
fholin 0:2325d1d28df3 618 // bw = 414e2;
fholin 0:2325d1d28df3 619 // break;
fholin 0:2325d1d28df3 620 //case 6: // 62.5 kHz
fholin 0:2325d1d28df3 621 // bw = 625e2;
fholin 0:2325d1d28df3 622 // break;
fholin 0:2325d1d28df3 623 case 7: // 125 kHz
fholin 0:2325d1d28df3 624 bw = 125e3;
fholin 0:2325d1d28df3 625 break;
fholin 0:2325d1d28df3 626 case 8: // 250 kHz
fholin 0:2325d1d28df3 627 bw = 250e3;
fholin 0:2325d1d28df3 628 break;
fholin 0:2325d1d28df3 629 case 9: // 500 kHz
fholin 0:2325d1d28df3 630 bw = 500e3;
fholin 0:2325d1d28df3 631 break;
fholin 0:2325d1d28df3 632 }
fholin 0:2325d1d28df3 633
fholin 0:2325d1d28df3 634 // Symbol rate : time for one symbol (secs)
fholin 0:2325d1d28df3 635 double rs = bw / ( 1 << this->settings.LoRa.Datarate );
fholin 0:2325d1d28df3 636 double ts = 1 / rs;
fholin 0:2325d1d28df3 637 // time of preamble
fholin 0:2325d1d28df3 638 double tPreamble = ( this->settings.LoRa.PreambleLen + 4.25 ) * ts;
fholin 0:2325d1d28df3 639 // Symbol length of payload and time
fholin 0:2325d1d28df3 640 double tmp = ceil( ( 8 * pktLen - 4 * this->settings.LoRa.Datarate +
fholin 0:2325d1d28df3 641 28 + 16 * this->settings.LoRa.CrcOn -
fholin 0:2325d1d28df3 642 ( this->settings.LoRa.FixLen ? 20 : 0 ) ) /
fholin 0:2325d1d28df3 643 ( double )( 4 * this->settings.LoRa.Datarate -
fholin 0:2325d1d28df3 644 ( ( this->settings.LoRa.LowDatarateOptimize > 0 ) ? 2 : 0 ) ) ) *
fholin 0:2325d1d28df3 645 ( this->settings.LoRa.Coderate + 4 );
fholin 0:2325d1d28df3 646 double nPayload = 8 + ( ( tmp > 0 ) ? tmp : 0 );
fholin 0:2325d1d28df3 647 double tPayload = nPayload * ts;
fholin 0:2325d1d28df3 648 // Time on air
fholin 0:2325d1d28df3 649 double tOnAir = tPreamble + tPayload;
fholin 0:2325d1d28df3 650 // return us secs
fholin 0:2325d1d28df3 651 airTime = floor( tOnAir * 1e6 + 0.999 );
fholin 0:2325d1d28df3 652 }
fholin 0:2325d1d28df3 653 break;
fholin 0:2325d1d28df3 654 }
fholin 0:2325d1d28df3 655 return airTime;
fholin 0:2325d1d28df3 656 }
fholin 0:2325d1d28df3 657
fholin 0:2325d1d28df3 658 void SX1276::Send( uint8_t *buffer, uint8_t size )
fholin 0:2325d1d28df3 659 {
fholin 0:2325d1d28df3 660 uint32_t txTimeout = 0;
fholin 0:2325d1d28df3 661 // DEBUG_PRINT(("Send func enter \n"));
fholin 0:2325d1d28df3 662 //dio0.rise(this, &SX1276::OnDio0Irq);
fholin 0:2325d1d28df3 663 switch( this->settings.Modem )
fholin 0:2325d1d28df3 664 {
fholin 0:2325d1d28df3 665 case MODEM_FSK:
fholin 0:2325d1d28df3 666 {
fholin 0:2325d1d28df3 667 this->settings.FskPacketHandler.NbBytes = 0;
fholin 0:2325d1d28df3 668 this->settings.FskPacketHandler.Size = size;
fholin 0:2325d1d28df3 669
fholin 0:2325d1d28df3 670 if( this->settings.Fsk.FixLen == false )
fholin 0:2325d1d28df3 671 {
fholin 0:2325d1d28df3 672 WriteFifo( ( uint8_t* )&size, 1 );
fholin 0:2325d1d28df3 673 }
fholin 0:2325d1d28df3 674 else
fholin 0:2325d1d28df3 675 {
fholin 0:2325d1d28df3 676 Write( REG_PAYLOADLENGTH, size );
fholin 0:2325d1d28df3 677 }
fholin 0:2325d1d28df3 678
fholin 0:2325d1d28df3 679 if( ( size > 0 ) && ( size <= 64 ) )
fholin 0:2325d1d28df3 680 {
fholin 0:2325d1d28df3 681 this->settings.FskPacketHandler.ChunkSize = size;
fholin 0:2325d1d28df3 682 }
fholin 0:2325d1d28df3 683 else
fholin 0:2325d1d28df3 684 {
fholin 0:2325d1d28df3 685 this->settings.FskPacketHandler.ChunkSize = 32;
fholin 0:2325d1d28df3 686 }
fholin 0:2325d1d28df3 687
fholin 0:2325d1d28df3 688 // Write payload buffer
fholin 0:2325d1d28df3 689 WriteFifo( buffer, this->settings.FskPacketHandler.ChunkSize );
fholin 0:2325d1d28df3 690 this->settings.FskPacketHandler.NbBytes += this->settings.FskPacketHandler.ChunkSize;
fholin 0:2325d1d28df3 691 txTimeout = this->settings.Fsk.TxTimeout;
fholin 0:2325d1d28df3 692 }
fholin 0:2325d1d28df3 693 break;
fholin 0:2325d1d28df3 694 case MODEM_LORA:
fholin 0:2325d1d28df3 695 {
fholin 0:2325d1d28df3 696
fholin 0:2325d1d28df3 697 if( this->settings.LoRa.IqInverted == true )
fholin 0:2325d1d28df3 698 {
fholin 0:2325d1d28df3 699 Write( REG_LR_INVERTIQ, ( ( Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_ON ) );
fholin 0:2325d1d28df3 700 Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_ON );
fholin 0:2325d1d28df3 701 }
fholin 0:2325d1d28df3 702 else
fholin 0:2325d1d28df3 703 {
fholin 0:2325d1d28df3 704 Write( REG_LR_INVERTIQ, ( ( Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_OFF ) );
fholin 0:2325d1d28df3 705 Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_OFF );
fholin 0:2325d1d28df3 706 }
fholin 0:2325d1d28df3 707
fholin 0:2325d1d28df3 708 this->settings.LoRaPacketHandler.Size = size;
fholin 0:2325d1d28df3 709
fholin 0:2325d1d28df3 710 // Initializes the payload size
fholin 0:2325d1d28df3 711 Write( REG_LR_PAYLOADLENGTH, size );
fholin 0:2325d1d28df3 712
fholin 0:2325d1d28df3 713 // Full buffer used for Tx
fholin 0:2325d1d28df3 714 Write( REG_LR_FIFOTXBASEADDR, 0 );
fholin 0:2325d1d28df3 715 Write( REG_LR_FIFOADDRPTR, 0 );
fholin 0:2325d1d28df3 716
fholin 0:2325d1d28df3 717 // FIFO operations can not take place in Sleep mode
fholin 0:2325d1d28df3 718 if( ( Read( REG_OPMODE ) & ~RF_OPMODE_MASK ) == RF_OPMODE_SLEEP )
fholin 0:2325d1d28df3 719 {
fholin 0:2325d1d28df3 720 Standby( );
fholin 0:2325d1d28df3 721 wait_ms( 1 );
fholin 0:2325d1d28df3 722 }
fholin 0:2325d1d28df3 723 // Write payload buffer
fholin 0:2325d1d28df3 724 WriteFifo( buffer, size );
fholin 0:2325d1d28df3 725 txTimeout = this->settings.LoRa.TxTimeout;
fholin 0:2325d1d28df3 726 }
fholin 0:2325d1d28df3 727 break;
fholin 0:2325d1d28df3 728 }
fholin 0:2325d1d28df3 729
fholin 0:2325d1d28df3 730 Tx( txTimeout );
fholin 0:2325d1d28df3 731 }
fholin 0:2325d1d28df3 732
fholin 0:2325d1d28df3 733 void SX1276::Sleep( void )
fholin 0:2325d1d28df3 734 {
fholin 0:2325d1d28df3 735 txTimeoutTimer.detach( );
fholin 0:2325d1d28df3 736 rxTimeoutTimer.detach( );
fholin 0:2325d1d28df3 737
fholin 0:2325d1d28df3 738 SetOpMode( RF_OPMODE_SLEEP );
fholin 0:2325d1d28df3 739 this->settings.State = RF_IDLE;
fholin 0:2325d1d28df3 740 }
fholin 0:2325d1d28df3 741
fholin 0:2325d1d28df3 742 void SX1276::Standby( void )
fholin 0:2325d1d28df3 743 {
fholin 0:2325d1d28df3 744 txTimeoutTimer.detach( );
fholin 0:2325d1d28df3 745 rxTimeoutTimer.detach( );
fholin 0:2325d1d28df3 746
fholin 0:2325d1d28df3 747 SetOpMode( RF_OPMODE_STANDBY );
fholin 0:2325d1d28df3 748 this->settings.State = RF_IDLE;
fholin 0:2325d1d28df3 749 }
fholin 0:2325d1d28df3 750
fholin 0:2325d1d28df3 751 void SX1276::Rx( uint32_t timeout )
fholin 0:2325d1d28df3 752 {
fholin 0:2325d1d28df3 753 bool rxContinuous = false;
fholin 0:2325d1d28df3 754
fholin 0:2325d1d28df3 755 switch( this->settings.Modem )
fholin 0:2325d1d28df3 756 {
fholin 0:2325d1d28df3 757 case MODEM_FSK:
fholin 0:2325d1d28df3 758 {
fholin 0:2325d1d28df3 759 rxContinuous = this->settings.Fsk.RxContinuous;
fholin 0:2325d1d28df3 760
fholin 0:2325d1d28df3 761 // DIO0=PayloadReady
fholin 0:2325d1d28df3 762 // DIO1=FifoLevel
fholin 0:2325d1d28df3 763 // DIO2=SyncAddr
fholin 0:2325d1d28df3 764 // DIO3=FifoEmpty
fholin 0:2325d1d28df3 765 // DIO4=Preamble
fholin 0:2325d1d28df3 766 // DIO5=ModeReady
fholin 0:2325d1d28df3 767 Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RF_DIOMAPPING1_DIO0_MASK &
fholin 0:2325d1d28df3 768 RF_DIOMAPPING1_DIO2_MASK ) |
fholin 0:2325d1d28df3 769 RF_DIOMAPPING1_DIO0_00 |
fholin 0:2325d1d28df3 770 RF_DIOMAPPING1_DIO2_11 );
fholin 0:2325d1d28df3 771
fholin 0:2325d1d28df3 772 Write( REG_DIOMAPPING2, ( Read( REG_DIOMAPPING2 ) & RF_DIOMAPPING2_DIO4_MASK &
fholin 0:2325d1d28df3 773 RF_DIOMAPPING2_MAP_MASK ) |
fholin 0:2325d1d28df3 774 RF_DIOMAPPING2_DIO4_11 |
fholin 0:2325d1d28df3 775 RF_DIOMAPPING2_MAP_PREAMBLEDETECT );
fholin 0:2325d1d28df3 776
fholin 0:2325d1d28df3 777 this->settings.FskPacketHandler.FifoThresh = Read( REG_FIFOTHRESH ) & 0x3F;
fholin 0:2325d1d28df3 778
fholin 0:2325d1d28df3 779 this->settings.FskPacketHandler.PreambleDetected = false;
fholin 0:2325d1d28df3 780 this->settings.FskPacketHandler.SyncWordDetected = false;
fholin 0:2325d1d28df3 781 this->settings.FskPacketHandler.NbBytes = 0;
fholin 0:2325d1d28df3 782 this->settings.FskPacketHandler.Size = 0;
fholin 0:2325d1d28df3 783 }
fholin 0:2325d1d28df3 784 break;
fholin 0:2325d1d28df3 785 case MODEM_LORA:
fholin 0:2325d1d28df3 786 {
fholin 0:2325d1d28df3 787 if( this->settings.LoRa.IqInverted == true )
fholin 0:2325d1d28df3 788 {
fholin 0:2325d1d28df3 789 Write( REG_LR_INVERTIQ, ( ( Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_ON | RFLR_INVERTIQ_TX_OFF ) );
fholin 0:2325d1d28df3 790 Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_ON );
fholin 0:2325d1d28df3 791 }
fholin 0:2325d1d28df3 792 else
fholin 0:2325d1d28df3 793 {
fholin 0:2325d1d28df3 794 Write( REG_LR_INVERTIQ, ( ( Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_OFF ) );
fholin 0:2325d1d28df3 795 Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_OFF );
fholin 0:2325d1d28df3 796 }
fholin 0:2325d1d28df3 797
fholin 0:2325d1d28df3 798
fholin 0:2325d1d28df3 799 // ERRATA 2.3 - Receiver Spurious Reception of a LoRa Signal
fholin 0:2325d1d28df3 800 if( this->settings.LoRa.Bandwidth < 9 )
fholin 0:2325d1d28df3 801 {
fholin 0:2325d1d28df3 802 Write( REG_LR_DETECTOPTIMIZE, Read( REG_LR_DETECTOPTIMIZE ) & 0x7F );
fholin 0:2325d1d28df3 803 Write( REG_LR_TEST30, 0x00 );
fholin 0:2325d1d28df3 804 switch( this->settings.LoRa.Bandwidth )
fholin 0:2325d1d28df3 805 {
fholin 0:2325d1d28df3 806 case 0: // 7.8 kHz
fholin 0:2325d1d28df3 807 Write( REG_LR_TEST2F, 0x48 );
fholin 0:2325d1d28df3 808 SetChannel(this->settings.Channel + 7.81e3 );
fholin 0:2325d1d28df3 809 break;
fholin 0:2325d1d28df3 810 case 1: // 10.4 kHz
fholin 0:2325d1d28df3 811 Write( REG_LR_TEST2F, 0x44 );
fholin 0:2325d1d28df3 812 SetChannel(this->settings.Channel + 10.42e3 );
fholin 0:2325d1d28df3 813 break;
fholin 0:2325d1d28df3 814 case 2: // 15.6 kHz
fholin 0:2325d1d28df3 815 Write( REG_LR_TEST2F, 0x44 );
fholin 0:2325d1d28df3 816 SetChannel(this->settings.Channel + 15.62e3 );
fholin 0:2325d1d28df3 817 break;
fholin 0:2325d1d28df3 818 case 3: // 20.8 kHz
fholin 0:2325d1d28df3 819 Write( REG_LR_TEST2F, 0x44 );
fholin 0:2325d1d28df3 820 SetChannel(this->settings.Channel + 20.83e3 );
fholin 0:2325d1d28df3 821 break;
fholin 0:2325d1d28df3 822 case 4: // 31.2 kHz
fholin 0:2325d1d28df3 823 Write( REG_LR_TEST2F, 0x44 );
fholin 0:2325d1d28df3 824 SetChannel(this->settings.Channel + 31.25e3 );
fholin 0:2325d1d28df3 825 break;
fholin 0:2325d1d28df3 826 case 5: // 41.4 kHz
fholin 0:2325d1d28df3 827 Write( REG_LR_TEST2F, 0x44 );
fholin 0:2325d1d28df3 828 SetChannel(this->settings.Channel + 41.67e3 );
fholin 0:2325d1d28df3 829 break;
fholin 0:2325d1d28df3 830 case 6: // 62.5 kHz
fholin 0:2325d1d28df3 831 Write( REG_LR_TEST2F, 0x40 );
fholin 0:2325d1d28df3 832 break;
fholin 0:2325d1d28df3 833 case 7: // 125 kHz
fholin 0:2325d1d28df3 834 Write( REG_LR_TEST2F, 0x40 );
fholin 0:2325d1d28df3 835 break;
fholin 0:2325d1d28df3 836 case 8: // 250 kHz
fholin 0:2325d1d28df3 837 Write( REG_LR_TEST2F, 0x40 );
fholin 0:2325d1d28df3 838 break;
fholin 0:2325d1d28df3 839 }
fholin 0:2325d1d28df3 840 }
fholin 0:2325d1d28df3 841 else
fholin 0:2325d1d28df3 842 {
fholin 0:2325d1d28df3 843 Write( REG_LR_DETECTOPTIMIZE, Read( REG_LR_DETECTOPTIMIZE ) | 0x80 );
fholin 0:2325d1d28df3 844 }
fholin 0:2325d1d28df3 845
fholin 0:2325d1d28df3 846 rxContinuous = this->settings.LoRa.RxContinuous;
fholin 0:2325d1d28df3 847
fholin 0:2325d1d28df3 848 if( this->settings.LoRa.FreqHopOn == true )
fholin 0:2325d1d28df3 849 {
fholin 0:2325d1d28df3 850 Write( REG_LR_IRQFLAGSMASK, //RFLR_IRQFLAGS_RXTIMEOUT |
fholin 0:2325d1d28df3 851 //RFLR_IRQFLAGS_RXDONE |
fholin 0:2325d1d28df3 852 RFLR_IRQFLAGS_PAYLOADCRCERROR |
fholin 0:2325d1d28df3 853 RFLR_IRQFLAGS_VALIDHEADER |
fholin 0:2325d1d28df3 854 RFLR_IRQFLAGS_TXDONE |
fholin 0:2325d1d28df3 855 RFLR_IRQFLAGS_CADDONE |
fholin 0:2325d1d28df3 856 //RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
fholin 0:2325d1d28df3 857 RFLR_IRQFLAGS_CADDETECTED );
fholin 0:2325d1d28df3 858
fholin 0:2325d1d28df3 859 // DIO0=RxDone, DIO2=FhssChangeChannel
fholin 0:2325d1d28df3 860 Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK & RFLR_DIOMAPPING1_DIO2_MASK ) | RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO2_00 );
fholin 0:2325d1d28df3 861 }
fholin 0:2325d1d28df3 862 else
fholin 0:2325d1d28df3 863 {
fholin 0:2325d1d28df3 864 Write( REG_LR_IRQFLAGSMASK, //RFLR_IRQFLAGS_RXTIMEOUT |
fholin 0:2325d1d28df3 865 //RFLR_IRQFLAGS_RXDONE |
fholin 0:2325d1d28df3 866 RFLR_IRQFLAGS_PAYLOADCRCERROR |
fholin 0:2325d1d28df3 867 RFLR_IRQFLAGS_VALIDHEADER |
fholin 0:2325d1d28df3 868 RFLR_IRQFLAGS_TXDONE |
fholin 0:2325d1d28df3 869 RFLR_IRQFLAGS_CADDONE |
fholin 0:2325d1d28df3 870 RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
fholin 0:2325d1d28df3 871 RFLR_IRQFLAGS_CADDETECTED );
fholin 0:2325d1d28df3 872
fholin 0:2325d1d28df3 873 // DIO0=RxDone @modify by fabien
fholin 0:2325d1d28df3 874 //Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_00 );
fholin 0:2325d1d28df3 875 Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK & RFLR_DIOMAPPING1_DIO1_MASK ) | RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO1_00 );
fholin 0:2325d1d28df3 876 Write( REG_DIOMAPPING1,0);
fholin 0:2325d1d28df3 877 }
fholin 0:2325d1d28df3 878 Write( REG_LR_FIFORXBASEADDR, 0 );
fholin 0:2325d1d28df3 879 Write( REG_LR_FIFOADDRPTR, 0 );
fholin 0:2325d1d28df3 880 }
fholin 0:2325d1d28df3 881 break;
fholin 0:2325d1d28df3 882 }
fholin 0:2325d1d28df3 883
fholin 0:2325d1d28df3 884 memset( rxBuffer, 0, ( size_t )RX_BUFFER_SIZE );
fholin 0:2325d1d28df3 885
fholin 0:2325d1d28df3 886 this->settings.State = RF_RX_RUNNING;
fholin 0:2325d1d28df3 887 if( timeout != 0 )
fholin 0:2325d1d28df3 888 {
fholin 0:2325d1d28df3 889 rxTimeoutTimer.attach_us( this, &SX1276::OnTimeoutIrqtemp, timeout );
fholin 0:2325d1d28df3 890
fholin 0:2325d1d28df3 891 }
fholin 0:2325d1d28df3 892
fholin 0:2325d1d28df3 893 if( this->settings.Modem == MODEM_FSK )
fholin 0:2325d1d28df3 894 {
fholin 0:2325d1d28df3 895 SetOpMode( RF_OPMODE_RECEIVER );
fholin 0:2325d1d28df3 896
fholin 0:2325d1d28df3 897 if( rxContinuous == false )
fholin 0:2325d1d28df3 898 {
fholin 0:2325d1d28df3 899 rxTimeoutSyncWord.attach_us( this, &SX1276::OnTimeoutIrq, ( 8.0 * ( this->settings.Fsk.PreambleLen +
fholin 0:2325d1d28df3 900 ( ( Read( REG_SYNCCONFIG ) &
fholin 0:2325d1d28df3 901 ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
fholin 0:2325d1d28df3 902 1.0 ) + 10.0 ) /
fholin 0:2325d1d28df3 903 ( double )this->settings.Fsk.Datarate ) * 1e6 );
fholin 0:2325d1d28df3 904 }
fholin 0:2325d1d28df3 905 }
fholin 0:2325d1d28df3 906 else
fholin 0:2325d1d28df3 907 {
fholin 0:2325d1d28df3 908 if( rxContinuous == true )
fholin 0:2325d1d28df3 909 {
fholin 0:2325d1d28df3 910
fholin 0:2325d1d28df3 911 SetOpMode( RFLR_OPMODE_RECEIVER );
fholin 0:2325d1d28df3 912 }
fholin 0:2325d1d28df3 913 else
fholin 0:2325d1d28df3 914 {
fholin 0:2325d1d28df3 915 SetOpMode( RFLR_OPMODE_RECEIVER_SINGLE );
fholin 0:2325d1d28df3 916
fholin 0:2325d1d28df3 917 }
fholin 0:2325d1d28df3 918 }
fholin 0:2325d1d28df3 919
fholin 0:2325d1d28df3 920
fholin 0:2325d1d28df3 921 }
fholin 0:2325d1d28df3 922
fholin 0:2325d1d28df3 923 void SX1276::Tx( uint32_t timeout )
fholin 0:2325d1d28df3 924 {
fholin 0:2325d1d28df3 925 // DEBUG_PRINT("TX func enter\n");
fholin 0:2325d1d28df3 926 switch( this->settings.Modem )
fholin 0:2325d1d28df3 927 {
fholin 0:2325d1d28df3 928 case MODEM_FSK:
fholin 0:2325d1d28df3 929 {
fholin 0:2325d1d28df3 930 // DIO0=PacketSent
fholin 0:2325d1d28df3 931 // DIO1=FifoLevel
fholin 0:2325d1d28df3 932 // DIO2=FifoFull
fholin 0:2325d1d28df3 933 // DIO3=FifoEmpty
fholin 0:2325d1d28df3 934 // DIO4=LowBat
fholin 0:2325d1d28df3 935 // DIO5=ModeReady
fholin 0:2325d1d28df3 936 Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RF_DIOMAPPING1_DIO0_MASK &
fholin 0:2325d1d28df3 937 RF_DIOMAPPING1_DIO2_MASK ) );
fholin 0:2325d1d28df3 938
fholin 0:2325d1d28df3 939 Write( REG_DIOMAPPING2, ( Read( REG_DIOMAPPING2 ) & RF_DIOMAPPING2_DIO4_MASK &
fholin 0:2325d1d28df3 940 RF_DIOMAPPING2_MAP_MASK ) );
fholin 0:2325d1d28df3 941 this->settings.FskPacketHandler.FifoThresh = Read( REG_FIFOTHRESH ) & 0x3F;
fholin 0:2325d1d28df3 942 }
fholin 0:2325d1d28df3 943 break;
fholin 0:2325d1d28df3 944 case MODEM_LORA:
fholin 0:2325d1d28df3 945 {
fholin 0:2325d1d28df3 946 //DEBUG_PRINT("TX func in lora mode enter\n");
fholin 0:2325d1d28df3 947 if( this->settings.LoRa.FreqHopOn == true )
fholin 0:2325d1d28df3 948 {//DEBUG_PRINT("TX func in lora freqhop enter\n");
fholin 0:2325d1d28df3 949 Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
fholin 0:2325d1d28df3 950 RFLR_IRQFLAGS_RXDONE |
fholin 0:2325d1d28df3 951 RFLR_IRQFLAGS_PAYLOADCRCERROR |
fholin 0:2325d1d28df3 952 RFLR_IRQFLAGS_VALIDHEADER |
fholin 0:2325d1d28df3 953 //RFLR_IRQFLAGS_TXDONE |
fholin 0:2325d1d28df3 954 RFLR_IRQFLAGS_CADDONE |
fholin 0:2325d1d28df3 955 //RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
fholin 0:2325d1d28df3 956 RFLR_IRQFLAGS_CADDETECTED );
fholin 0:2325d1d28df3 957
fholin 0:2325d1d28df3 958 // DIO0=TxDone, DIO2=FhssChangeChannel
fholin 0:2325d1d28df3 959 Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK & RFLR_DIOMAPPING1_DIO2_MASK ) | RFLR_DIOMAPPING1_DIO0_01 | RFLR_DIOMAPPING1_DIO2_00 );
fholin 0:2325d1d28df3 960 }
fholin 0:2325d1d28df3 961 else
fholin 0:2325d1d28df3 962 {
fholin 0:2325d1d28df3 963 Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
fholin 0:2325d1d28df3 964 RFLR_IRQFLAGS_RXDONE |
fholin 0:2325d1d28df3 965 RFLR_IRQFLAGS_PAYLOADCRCERROR |
fholin 0:2325d1d28df3 966 RFLR_IRQFLAGS_VALIDHEADER |
fholin 0:2325d1d28df3 967 //RFLR_IRQFLAGS_TXDONE |
fholin 0:2325d1d28df3 968 RFLR_IRQFLAGS_CADDONE |
fholin 0:2325d1d28df3 969 RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
fholin 0:2325d1d28df3 970 RFLR_IRQFLAGS_CADDETECTED );
fholin 0:2325d1d28df3 971
fholin 0:2325d1d28df3 972 // DIO0=TxDone
fholin 0:2325d1d28df3 973 Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_01 );
fholin 0:2325d1d28df3 974 }
fholin 0:2325d1d28df3 975 }
fholin 0:2325d1d28df3 976 break;
fholin 0:2325d1d28df3 977 }
fholin 0:2325d1d28df3 978
fholin 0:2325d1d28df3 979
fholin 0:2325d1d28df3 980 uint8_t registers[] = { 0x01, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x014, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,0x33,0x39};
fholin 0:2325d1d28df3 981
fholin 0:2325d1d28df3 982 uint8_t i;
fholin 0:2325d1d28df3 983 for (i = 0; i < sizeof(registers); i++)
fholin 0:2325d1d28df3 984 {
fholin 0:2325d1d28df3 985 // pcsx.printf("registers[%x]", registers[i]);
fholin 0:2325d1d28df3 986 //pcsx.printf(": ");
fholin 0:2325d1d28df3 987 //pcsx.printf("%x\n",Read(registers[i]));
fholin 0:2325d1d28df3 988 }
fholin 0:2325d1d28df3 989
fholin 0:2325d1d28df3 990
fholin 0:2325d1d28df3 991
fholin 0:2325d1d28df3 992 this->settings.State = RF_TX_RUNNING;
fholin 0:2325d1d28df3 993 txTimeoutTimer.attach_us( this, &SX1276::OnTimeoutIrq, timeout );
fholin 0:2325d1d28df3 994 SetOpMode( RF_OPMODE_TRANSMITTER );
fholin 0:2325d1d28df3 995 }
fholin 0:2325d1d28df3 996
fholin 0:2325d1d28df3 997 void SX1276::StartCad( void )
fholin 0:2325d1d28df3 998 {
fholin 0:2325d1d28df3 999 switch( this->settings.Modem )
fholin 0:2325d1d28df3 1000 {
fholin 0:2325d1d28df3 1001 case MODEM_FSK:
fholin 0:2325d1d28df3 1002 {
fholin 0:2325d1d28df3 1003
fholin 0:2325d1d28df3 1004 }
fholin 0:2325d1d28df3 1005 break;
fholin 0:2325d1d28df3 1006 case MODEM_LORA:
fholin 0:2325d1d28df3 1007 {
fholin 0:2325d1d28df3 1008 Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
fholin 0:2325d1d28df3 1009 RFLR_IRQFLAGS_RXDONE |
fholin 0:2325d1d28df3 1010 RFLR_IRQFLAGS_PAYLOADCRCERROR |
fholin 0:2325d1d28df3 1011 RFLR_IRQFLAGS_VALIDHEADER |
fholin 0:2325d1d28df3 1012 RFLR_IRQFLAGS_TXDONE |
fholin 0:2325d1d28df3 1013 //RFLR_IRQFLAGS_CADDONE |
fholin 0:2325d1d28df3 1014 RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL // |
fholin 0:2325d1d28df3 1015 //RFLR_IRQFLAGS_CADDETECTED
fholin 0:2325d1d28df3 1016 );
fholin 0:2325d1d28df3 1017
fholin 0:2325d1d28df3 1018 // DIO3=CADDone
fholin 0:2325d1d28df3 1019 Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_00 );
fholin 0:2325d1d28df3 1020
fholin 0:2325d1d28df3 1021 this->settings.State = RF_CAD;
fholin 0:2325d1d28df3 1022 SetOpMode( RFLR_OPMODE_CAD );
fholin 0:2325d1d28df3 1023 }
fholin 0:2325d1d28df3 1024 break;
fholin 0:2325d1d28df3 1025 default:
fholin 0:2325d1d28df3 1026 break;
fholin 0:2325d1d28df3 1027 }
fholin 0:2325d1d28df3 1028 }
fholin 0:2325d1d28df3 1029
fholin 0:2325d1d28df3 1030 int16_t SX1276::GetRssi( RadioModems_t modem )
fholin 0:2325d1d28df3 1031 {
fholin 0:2325d1d28df3 1032 int16_t rssi = 0;
fholin 0:2325d1d28df3 1033
fholin 0:2325d1d28df3 1034 switch( modem )
fholin 0:2325d1d28df3 1035 {
fholin 0:2325d1d28df3 1036 case MODEM_FSK:
fholin 0:2325d1d28df3 1037 rssi = -( Read( REG_RSSIVALUE ) >> 1 );
fholin 0:2325d1d28df3 1038 break;
fholin 0:2325d1d28df3 1039 case MODEM_LORA:
fholin 0:2325d1d28df3 1040 if( this->settings.Channel > RF_MID_BAND_THRESH )
fholin 0:2325d1d28df3 1041 {
fholin 0:2325d1d28df3 1042 rssi = RSSI_OFFSET_HF + Read( REG_LR_RSSIVALUE );
fholin 0:2325d1d28df3 1043 }
fholin 0:2325d1d28df3 1044 else
fholin 0:2325d1d28df3 1045 {
fholin 0:2325d1d28df3 1046 rssi = RSSI_OFFSET_LF + Read( REG_LR_RSSIVALUE );
fholin 0:2325d1d28df3 1047 }
fholin 0:2325d1d28df3 1048 break;
fholin 0:2325d1d28df3 1049 default:
fholin 0:2325d1d28df3 1050 rssi = -1;
fholin 0:2325d1d28df3 1051 break;
fholin 0:2325d1d28df3 1052 }
fholin 0:2325d1d28df3 1053 return rssi;
fholin 0:2325d1d28df3 1054 }
fholin 0:2325d1d28df3 1055
fholin 0:2325d1d28df3 1056 void SX1276::SetOpMode( uint8_t opMode )
fholin 0:2325d1d28df3 1057 {
fholin 0:2325d1d28df3 1058 if( opMode != previousOpMode )
fholin 0:2325d1d28df3 1059 {
fholin 0:2325d1d28df3 1060 previousOpMode = opMode;
fholin 0:2325d1d28df3 1061 if( opMode == RF_OPMODE_SLEEP )
fholin 0:2325d1d28df3 1062 {
fholin 0:2325d1d28df3 1063 SetAntSwLowPower( true );
fholin 0:2325d1d28df3 1064 }
fholin 0:2325d1d28df3 1065 else
fholin 0:2325d1d28df3 1066 {
fholin 0:2325d1d28df3 1067 SetAntSwLowPower( false );
fholin 0:2325d1d28df3 1068 if( opMode == RF_OPMODE_TRANSMITTER )
fholin 0:2325d1d28df3 1069 {
fholin 0:2325d1d28df3 1070 SetAntSw( 1 );
fholin 0:2325d1d28df3 1071 }
fholin 0:2325d1d28df3 1072 else
fholin 0:2325d1d28df3 1073 {
fholin 0:2325d1d28df3 1074 SetAntSw( 0 );
fholin 0:2325d1d28df3 1075 }
fholin 0:2325d1d28df3 1076 }
fholin 0:2325d1d28df3 1077 Write( REG_OPMODE, ( Read( REG_OPMODE ) & RF_OPMODE_MASK ) | opMode );
fholin 0:2325d1d28df3 1078 }
fholin 0:2325d1d28df3 1079 }
fholin 0:2325d1d28df3 1080
fholin 0:2325d1d28df3 1081 void SX1276::SetModem( RadioModems_t modem )
fholin 0:2325d1d28df3 1082 {
fholin 0:2325d1d28df3 1083 if( this->settings.Modem == modem )
fholin 0:2325d1d28df3 1084 {
fholin 0:2325d1d28df3 1085 return;
fholin 0:2325d1d28df3 1086 }
fholin 0:2325d1d28df3 1087
fholin 0:2325d1d28df3 1088 this->settings.Modem = modem;
fholin 0:2325d1d28df3 1089 switch( this->settings.Modem )
fholin 0:2325d1d28df3 1090 {
fholin 0:2325d1d28df3 1091 default:
fholin 0:2325d1d28df3 1092 case MODEM_FSK:
fholin 0:2325d1d28df3 1093 SetOpMode( RF_OPMODE_SLEEP );
fholin 0:2325d1d28df3 1094 Write( REG_OPMODE, ( Read( REG_OPMODE ) & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_OFF );
fholin 0:2325d1d28df3 1095
fholin 0:2325d1d28df3 1096 Write( REG_DIOMAPPING1, 0x00 );
fholin 0:2325d1d28df3 1097 Write( REG_DIOMAPPING2, 0x30 ); // DIO5=ModeReady
fholin 0:2325d1d28df3 1098 break;
fholin 0:2325d1d28df3 1099 case MODEM_LORA:
fholin 0:2325d1d28df3 1100 SetOpMode( RF_OPMODE_SLEEP );
fholin 0:2325d1d28df3 1101 Write( REG_OPMODE, ( Read( REG_OPMODE ) & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_ON );
fholin 0:2325d1d28df3 1102
fholin 0:2325d1d28df3 1103 Write( REG_DIOMAPPING1, 0x00 );
fholin 0:2325d1d28df3 1104 Write( REG_DIOMAPPING2, 0x00 );
fholin 0:2325d1d28df3 1105 break;
fholin 0:2325d1d28df3 1106 }
fholin 0:2325d1d28df3 1107 }
fholin 0:2325d1d28df3 1108
fholin 0:2325d1d28df3 1109 void SX1276::SetMaxPayloadLength( RadioModems_t modem, uint8_t max )
fholin 0:2325d1d28df3 1110 {
fholin 0:2325d1d28df3 1111 this->SetModem( modem );
fholin 0:2325d1d28df3 1112
fholin 0:2325d1d28df3 1113 switch( modem )
fholin 0:2325d1d28df3 1114 {
fholin 0:2325d1d28df3 1115 case MODEM_FSK:
fholin 0:2325d1d28df3 1116 if( this->settings.Fsk.FixLen == false )
fholin 0:2325d1d28df3 1117 {
fholin 0:2325d1d28df3 1118 this->Write( REG_PAYLOADLENGTH, max );
fholin 0:2325d1d28df3 1119 }
fholin 0:2325d1d28df3 1120 break;
fholin 0:2325d1d28df3 1121 case MODEM_LORA:
fholin 0:2325d1d28df3 1122 this->Write( REG_LR_PAYLOADMAXLENGTH, max );
fholin 0:2325d1d28df3 1123 break;
fholin 0:2325d1d28df3 1124 }
fholin 0:2325d1d28df3 1125 }
fholin 0:2325d1d28df3 1126
fholin 0:2325d1d28df3 1127 void SX1276::OnTimeoutIrqtemp( void )
fholin 0:2325d1d28df3 1128 {
fholin 0:2325d1d28df3 1129 // //pcsx.printf("status = %x\n",Read(0x18));
fholin 0:2325d1d28df3 1130 // if (Read(0x18)==0xF)
fholin 0:2325d1d28df3 1131 // {
fholin 0:2325d1d28df3 1132 // rxTimeoutTimer.detach();
fholin 0:2325d1d28df3 1133 // rxTimeoutTimer.attach_us( this, &SX1276::OnTimeoutIrq, 3e6 );
fholin 0:2325d1d28df3 1134 // }
fholin 0:2325d1d28df3 1135 // else
fholin 0:2325d1d28df3 1136 // OnTimeoutIrq();
fholin 0:2325d1d28df3 1137 }
fholin 0:2325d1d28df3 1138
fholin 0:2325d1d28df3 1139 void SX1276::OnTimeoutIrq( void )
fholin 0:2325d1d28df3 1140 {
fholin 0:2325d1d28df3 1141 // //DEBUG_PRINT(("TX timeout func in enter irq flag %d\n", Read(REG_LR_IRQFLAGS));
fholin 0:2325d1d28df3 1142 // Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_TXDONE );
fholin 0:2325d1d28df3 1143 // // DEBUG_PRINT(("TX timeout func in enter irq flag %d\n", Read(REG_LR_IRQFLAGS));
fholin 0:2325d1d28df3 1144 //
fholin 0:2325d1d28df3 1145 // switch( this->settings.State )
fholin 0:2325d1d28df3 1146 // {
fholin 0:2325d1d28df3 1147 // case RF_RX_RUNNING:
fholin 0:2325d1d28df3 1148 // if( this->settings.Modem == MODEM_FSK )
fholin 0:2325d1d28df3 1149 // {
fholin 0:2325d1d28df3 1150 // this->settings.FskPacketHandler.PreambleDetected = false;
fholin 0:2325d1d28df3 1151 // this->settings.FskPacketHandler.SyncWordDetected = false;
fholin 0:2325d1d28df3 1152 // this->settings.FskPacketHandler.NbBytes = 0;
fholin 0:2325d1d28df3 1153 // this->settings.FskPacketHandler.Size = 0;
fholin 0:2325d1d28df3 1154
fholin 0:2325d1d28df3 1155 // // Clear Irqs
fholin 0:2325d1d28df3 1156 // Write( REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
fholin 0:2325d1d28df3 1157 // RF_IRQFLAGS1_PREAMBLEDETECT |
fholin 0:2325d1d28df3 1158 // RF_IRQFLAGS1_SYNCADDRESSMATCH );
fholin 0:2325d1d28df3 1159 // Write( REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN );
fholin 0:2325d1d28df3 1160
fholin 0:2325d1d28df3 1161 // if( this->settings.Fsk.RxContinuous == true )
fholin 0:2325d1d28df3 1162 // {
fholin 0:2325d1d28df3 1163 // // Continuous mode restart Rx chain
fholin 0:2325d1d28df3 1164 // Write( REG_RXCONFIG, Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
fholin 0:2325d1d28df3 1165 // }
fholin 0:2325d1d28df3 1166 // else
fholin 0:2325d1d28df3 1167 // {
fholin 0:2325d1d28df3 1168 // this->settings.State = RF_IDLE;
fholin 0:2325d1d28df3 1169 // rxTimeoutSyncWord.detach( );
fholin 0:2325d1d28df3 1170 // }
fholin 0:2325d1d28df3 1171 // }
fholin 0:2325d1d28df3 1172 // if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxTimeout != NULL ) )
fholin 0:2325d1d28df3 1173 // {
fholin 0:2325d1d28df3 1174 // this->RadioEvents->RxTimeout( );
fholin 0:2325d1d28df3 1175 // }
fholin 0:2325d1d28df3 1176 // break;
fholin 0:2325d1d28df3 1177 // case RF_TX_RUNNING:
fholin 0:2325d1d28df3 1178 // this->settings.State = RF_IDLE;
fholin 0:2325d1d28df3 1179 // if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->TxTimeout != NULL ) )
fholin 0:2325d1d28df3 1180 // {
fholin 0:2325d1d28df3 1181 // this->RadioEvents->TxTimeout( );
fholin 0:2325d1d28df3 1182 // }
fholin 0:2325d1d28df3 1183 // break;
fholin 0:2325d1d28df3 1184 // default:
fholin 0:2325d1d28df3 1185 // break;
fholin 0:2325d1d28df3 1186 // }
fholin 0:2325d1d28df3 1187 }
fholin 0:2325d1d28df3 1188
fholin 0:2325d1d28df3 1189 void SX1276::OnDio0Irq( void )
fholin 0:2325d1d28df3 1190 {
fholin 0:2325d1d28df3 1191 volatile uint8_t irqFlags = 0;
fholin 0:2325d1d28df3 1192 //pcsx.printf("TX interrupt func in enter irq flag %d\n", Read(REG_LR_IRQFLAGS));
fholin 0:2325d1d28df3 1193 switch( this->settings.State )
fholin 0:2325d1d28df3 1194 {
fholin 0:2325d1d28df3 1195 case RF_RX_RUNNING:
fholin 0:2325d1d28df3 1196 //TimerStop( &RxTimeoutTimer );
fholin 0:2325d1d28df3 1197 // RxDone interrupt
fholin 0:2325d1d28df3 1198 switch( this->settings.Modem )
fholin 0:2325d1d28df3 1199 {
fholin 0:2325d1d28df3 1200 case MODEM_FSK:
fholin 0:2325d1d28df3 1201 if( this->settings.Fsk.CrcOn == true )
fholin 0:2325d1d28df3 1202 {
fholin 0:2325d1d28df3 1203 irqFlags = Read( REG_IRQFLAGS2 );
fholin 0:2325d1d28df3 1204 if( ( irqFlags & RF_IRQFLAGS2_CRCOK ) != RF_IRQFLAGS2_CRCOK )
fholin 0:2325d1d28df3 1205 {
fholin 0:2325d1d28df3 1206 // Clear Irqs
fholin 0:2325d1d28df3 1207 Write( REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
fholin 0:2325d1d28df3 1208 RF_IRQFLAGS1_PREAMBLEDETECT |
fholin 0:2325d1d28df3 1209 RF_IRQFLAGS1_SYNCADDRESSMATCH );
fholin 0:2325d1d28df3 1210 Write( REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN );
fholin 0:2325d1d28df3 1211
fholin 0:2325d1d28df3 1212 if( this->settings.Fsk.RxContinuous == false )
fholin 0:2325d1d28df3 1213 {
fholin 0:2325d1d28df3 1214 this->settings.State = RF_IDLE;
fholin 0:2325d1d28df3 1215 rxTimeoutSyncWord.attach_us( this, &SX1276::OnTimeoutIrq, ( 8.0 * ( this->settings.Fsk.PreambleLen +
fholin 0:2325d1d28df3 1216 ( ( Read( REG_SYNCCONFIG ) &
fholin 0:2325d1d28df3 1217 ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
fholin 0:2325d1d28df3 1218 1.0 ) + 10.0 ) /
fholin 0:2325d1d28df3 1219 ( double )this->settings.Fsk.Datarate ) * 1e6 ) ;
fholin 0:2325d1d28df3 1220 }
fholin 0:2325d1d28df3 1221 else
fholin 0:2325d1d28df3 1222 {
fholin 0:2325d1d28df3 1223 // Continuous mode restart Rx chain
fholin 0:2325d1d28df3 1224 Write( REG_RXCONFIG, Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
fholin 0:2325d1d28df3 1225 }
fholin 0:2325d1d28df3 1226 rxTimeoutTimer.detach( );
fholin 0:2325d1d28df3 1227
fholin 0:2325d1d28df3 1228 if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxError != NULL ) )
fholin 0:2325d1d28df3 1229 {
fholin 0:2325d1d28df3 1230 this->RadioEvents->RxError( );
fholin 0:2325d1d28df3 1231 }
fholin 0:2325d1d28df3 1232 this->settings.FskPacketHandler.PreambleDetected = false;
fholin 0:2325d1d28df3 1233 this->settings.FskPacketHandler.SyncWordDetected = false;
fholin 0:2325d1d28df3 1234 this->settings.FskPacketHandler.NbBytes = 0;
fholin 0:2325d1d28df3 1235 this->settings.FskPacketHandler.Size = 0;
fholin 0:2325d1d28df3 1236 break;
fholin 0:2325d1d28df3 1237 }
fholin 0:2325d1d28df3 1238 }
fholin 0:2325d1d28df3 1239
fholin 0:2325d1d28df3 1240 // Read received packet size
fholin 0:2325d1d28df3 1241 if( ( this->settings.FskPacketHandler.Size == 0 ) && ( this->settings.FskPacketHandler.NbBytes == 0 ) )
fholin 0:2325d1d28df3 1242 {
fholin 0:2325d1d28df3 1243 if( this->settings.Fsk.FixLen == false )
fholin 0:2325d1d28df3 1244 {
fholin 0:2325d1d28df3 1245 ReadFifo( ( uint8_t* )&this->settings.FskPacketHandler.Size, 1 );
fholin 0:2325d1d28df3 1246 }
fholin 0:2325d1d28df3 1247 else
fholin 0:2325d1d28df3 1248 {
fholin 0:2325d1d28df3 1249 this->settings.FskPacketHandler.Size = Read( REG_PAYLOADLENGTH );
fholin 0:2325d1d28df3 1250 }
fholin 0:2325d1d28df3 1251 ReadFifo( rxBuffer + this->settings.FskPacketHandler.NbBytes, this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
fholin 0:2325d1d28df3 1252 this->settings.FskPacketHandler.NbBytes += ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
fholin 0:2325d1d28df3 1253 }
fholin 0:2325d1d28df3 1254 else
fholin 0:2325d1d28df3 1255 {
fholin 0:2325d1d28df3 1256 ReadFifo( rxBuffer + this->settings.FskPacketHandler.NbBytes, this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
fholin 0:2325d1d28df3 1257 this->settings.FskPacketHandler.NbBytes += ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
fholin 0:2325d1d28df3 1258 }
fholin 0:2325d1d28df3 1259
fholin 0:2325d1d28df3 1260 if( this->settings.Fsk.RxContinuous == false )
fholin 0:2325d1d28df3 1261 {
fholin 0:2325d1d28df3 1262 this->settings.State = RF_IDLE;
fholin 0:2325d1d28df3 1263 rxTimeoutSyncWord.attach_us( this, &SX1276::OnTimeoutIrq, ( 8.0 * ( this->settings.Fsk.PreambleLen +
fholin 0:2325d1d28df3 1264 ( ( Read( REG_SYNCCONFIG ) &
fholin 0:2325d1d28df3 1265 ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
fholin 0:2325d1d28df3 1266 1.0 ) + 10.0 ) /
fholin 0:2325d1d28df3 1267 ( double )this->settings.Fsk.Datarate ) * 1e6 ) ;
fholin 0:2325d1d28df3 1268 }
fholin 0:2325d1d28df3 1269 else
fholin 0:2325d1d28df3 1270 {
fholin 0:2325d1d28df3 1271 // Continuous mode restart Rx chain
fholin 0:2325d1d28df3 1272 Write( REG_RXCONFIG, Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
fholin 0:2325d1d28df3 1273 }
fholin 0:2325d1d28df3 1274 rxTimeoutTimer.detach( );
fholin 0:2325d1d28df3 1275
fholin 0:2325d1d28df3 1276 if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxDone != NULL ) )
fholin 0:2325d1d28df3 1277 {
fholin 0:2325d1d28df3 1278 this->RadioEvents->RxDone( rxBuffer, this->settings.FskPacketHandler.Size, this->settings.FskPacketHandler.RssiValue, 0 );
fholin 0:2325d1d28df3 1279 }
fholin 0:2325d1d28df3 1280 this->settings.FskPacketHandler.PreambleDetected = false;
fholin 0:2325d1d28df3 1281 this->settings.FskPacketHandler.SyncWordDetected = false;
fholin 0:2325d1d28df3 1282 this->settings.FskPacketHandler.NbBytes = 0;
fholin 0:2325d1d28df3 1283 this->settings.FskPacketHandler.Size = 0;
fholin 0:2325d1d28df3 1284 break;
fholin 0:2325d1d28df3 1285 case MODEM_LORA:
fholin 0:2325d1d28df3 1286 {
fholin 0:2325d1d28df3 1287 int8_t snr = 0;
fholin 0:2325d1d28df3 1288 pcsx.printf("RX interrupt func in enter irq flag %d\n", Read(REG_LR_IRQFLAGS));
fholin 0:2325d1d28df3 1289 // Clear Irq
fholin 0:2325d1d28df3 1290 Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXDONE );
fholin 0:2325d1d28df3 1291
fholin 0:2325d1d28df3 1292 irqFlags = Read( REG_LR_IRQFLAGS );
fholin 0:2325d1d28df3 1293 if( ( irqFlags & RFLR_IRQFLAGS_PAYLOADCRCERROR_MASK ) == RFLR_IRQFLAGS_PAYLOADCRCERROR )
fholin 0:2325d1d28df3 1294 {
fholin 0:2325d1d28df3 1295 // Clear Irq
fholin 0:2325d1d28df3 1296 Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_PAYLOADCRCERROR );
fholin 0:2325d1d28df3 1297
fholin 0:2325d1d28df3 1298 if( this->settings.LoRa.RxContinuous == false )
fholin 0:2325d1d28df3 1299 {
fholin 0:2325d1d28df3 1300 this->settings.State = RF_IDLE;
fholin 0:2325d1d28df3 1301 }
fholin 0:2325d1d28df3 1302 rxTimeoutTimer.detach( );
fholin 0:2325d1d28df3 1303
fholin 0:2325d1d28df3 1304 if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxError != NULL ) )
fholin 0:2325d1d28df3 1305 {
fholin 0:2325d1d28df3 1306 this->RadioEvents->RxError( );
fholin 0:2325d1d28df3 1307 }
fholin 0:2325d1d28df3 1308 break;
fholin 0:2325d1d28df3 1309 }
fholin 0:2325d1d28df3 1310
fholin 0:2325d1d28df3 1311 this->settings.LoRaPacketHandler.SnrValue = Read( REG_LR_PKTSNRVALUE );
fholin 0:2325d1d28df3 1312 if( this->settings.LoRaPacketHandler.SnrValue & 0x80 ) // The SNR sign bit is 1
fholin 0:2325d1d28df3 1313 {
fholin 0:2325d1d28df3 1314 // Invert and divide by 4
fholin 0:2325d1d28df3 1315 snr = ( ( ~this->settings.LoRaPacketHandler.SnrValue + 1 ) & 0xFF ) >> 2;
fholin 0:2325d1d28df3 1316 snr = -snr;
fholin 0:2325d1d28df3 1317 }
fholin 0:2325d1d28df3 1318 else
fholin 0:2325d1d28df3 1319 {
fholin 0:2325d1d28df3 1320 // Divide by 4
fholin 0:2325d1d28df3 1321 snr = ( this->settings.LoRaPacketHandler.SnrValue & 0xFF ) >> 2;
fholin 0:2325d1d28df3 1322 }
fholin 0:2325d1d28df3 1323
fholin 0:2325d1d28df3 1324 int16_t rssi = Read( REG_LR_PKTRSSIVALUE );
fholin 0:2325d1d28df3 1325 if( snr < 0 )
fholin 0:2325d1d28df3 1326 {
fholin 0:2325d1d28df3 1327 if( this->settings.Channel > RF_MID_BAND_THRESH )
fholin 0:2325d1d28df3 1328 {
fholin 0:2325d1d28df3 1329 this->settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_HF + rssi + ( rssi >> 4 ) +
fholin 0:2325d1d28df3 1330 snr;
fholin 0:2325d1d28df3 1331 }
fholin 0:2325d1d28df3 1332 else
fholin 0:2325d1d28df3 1333 {
fholin 0:2325d1d28df3 1334 this->settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_LF + rssi + ( rssi >> 4 ) +
fholin 0:2325d1d28df3 1335 snr;
fholin 0:2325d1d28df3 1336 }
fholin 0:2325d1d28df3 1337 }
fholin 0:2325d1d28df3 1338 else
fholin 0:2325d1d28df3 1339 {
fholin 0:2325d1d28df3 1340 if( this->settings.Channel > RF_MID_BAND_THRESH )
fholin 0:2325d1d28df3 1341 {
fholin 0:2325d1d28df3 1342 this->settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_HF + rssi + ( rssi >> 4 );
fholin 0:2325d1d28df3 1343 }
fholin 0:2325d1d28df3 1344 else
fholin 0:2325d1d28df3 1345 {
fholin 0:2325d1d28df3 1346 this->settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_LF + rssi + ( rssi >> 4 );
fholin 0:2325d1d28df3 1347 }
fholin 0:2325d1d28df3 1348 }
fholin 0:2325d1d28df3 1349
fholin 0:2325d1d28df3 1350 this->settings.LoRaPacketHandler.Size = Read( REG_LR_RXNBBYTES );
fholin 0:2325d1d28df3 1351 ReadFifo( rxBuffer, this->settings.LoRaPacketHandler.Size );
fholin 0:2325d1d28df3 1352
fholin 0:2325d1d28df3 1353 if( this->settings.LoRa.RxContinuous == false )
fholin 0:2325d1d28df3 1354 {
fholin 0:2325d1d28df3 1355 this->settings.State = RF_IDLE;
fholin 0:2325d1d28df3 1356 }
fholin 0:2325d1d28df3 1357 rxTimeoutTimer.detach( );
fholin 0:2325d1d28df3 1358
fholin 0:2325d1d28df3 1359 if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxDone != NULL ) )
fholin 0:2325d1d28df3 1360 {
fholin 0:2325d1d28df3 1361 this->RadioEvents->RxDone( rxBuffer, this->settings.LoRaPacketHandler.Size, this->settings.LoRaPacketHandler.RssiValue, this->settings.LoRaPacketHandler.SnrValue );
fholin 0:2325d1d28df3 1362 }
fholin 0:2325d1d28df3 1363 }
fholin 0:2325d1d28df3 1364 break;
fholin 0:2325d1d28df3 1365 default:
fholin 0:2325d1d28df3 1366 break;
fholin 0:2325d1d28df3 1367 }
fholin 0:2325d1d28df3 1368 break;
fholin 0:2325d1d28df3 1369 case RF_TX_RUNNING:
fholin 0:2325d1d28df3 1370 txTimeoutTimer.detach( );
fholin 0:2325d1d28df3 1371 // TxDone interrupt
fholin 0:2325d1d28df3 1372 switch( this->settings.Modem )
fholin 0:2325d1d28df3 1373 {
fholin 0:2325d1d28df3 1374 case MODEM_LORA:
fholin 0:2325d1d28df3 1375 // Clear Irq
fholin 0:2325d1d28df3 1376 Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_TXDONE );
fholin 0:2325d1d28df3 1377 if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->TxDone != NULL ) )
fholin 0:2325d1d28df3 1378 {
fholin 0:2325d1d28df3 1379 this->RadioEvents->TxDone( );
fholin 0:2325d1d28df3 1380 }
fholin 0:2325d1d28df3 1381 case MODEM_FSK:
fholin 0:2325d1d28df3 1382 default:
fholin 0:2325d1d28df3 1383 this->settings.State = RF_IDLE;
fholin 0:2325d1d28df3 1384 if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->TxDone != NULL ) )
fholin 0:2325d1d28df3 1385 {
fholin 0:2325d1d28df3 1386 this->RadioEvents->TxDone( );
fholin 0:2325d1d28df3 1387 }
fholin 0:2325d1d28df3 1388 break;
fholin 0:2325d1d28df3 1389 }
fholin 0:2325d1d28df3 1390 break;
fholin 0:2325d1d28df3 1391 default:
fholin 0:2325d1d28df3 1392
fholin 0:2325d1d28df3 1393 if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->TxDone != NULL ) )
fholin 0:2325d1d28df3 1394 {
fholin 0:2325d1d28df3 1395 this->RadioEvents->TxDone( );
fholin 0:2325d1d28df3 1396 }
fholin 0:2325d1d28df3 1397 break;
fholin 0:2325d1d28df3 1398 }
fholin 0:2325d1d28df3 1399 }
fholin 0:2325d1d28df3 1400
fholin 0:2325d1d28df3 1401 void SX1276::OnDio1Irq( void )
fholin 0:2325d1d28df3 1402 {
fholin 0:2325d1d28df3 1403 switch( this->settings.State )
fholin 0:2325d1d28df3 1404 {
fholin 0:2325d1d28df3 1405 case RF_RX_RUNNING:
fholin 0:2325d1d28df3 1406 switch( this->settings.Modem )
fholin 0:2325d1d28df3 1407 {
fholin 0:2325d1d28df3 1408 case MODEM_FSK:
fholin 0:2325d1d28df3 1409 // FifoLevel interrupt
fholin 0:2325d1d28df3 1410 // Read received packet size
fholin 0:2325d1d28df3 1411 if( ( this->settings.FskPacketHandler.Size == 0 ) && ( this->settings.FskPacketHandler.NbBytes == 0 ) )
fholin 0:2325d1d28df3 1412 {
fholin 0:2325d1d28df3 1413 if( this->settings.Fsk.FixLen == false )
fholin 0:2325d1d28df3 1414 {
fholin 0:2325d1d28df3 1415 ReadFifo( ( uint8_t* )&this->settings.FskPacketHandler.Size, 1 );
fholin 0:2325d1d28df3 1416 }
fholin 0:2325d1d28df3 1417 else
fholin 0:2325d1d28df3 1418 {
fholin 0:2325d1d28df3 1419 this->settings.FskPacketHandler.Size = Read( REG_PAYLOADLENGTH );
fholin 0:2325d1d28df3 1420 }
fholin 0:2325d1d28df3 1421 }
fholin 0:2325d1d28df3 1422
fholin 0:2325d1d28df3 1423 if( ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes ) > this->settings.FskPacketHandler.FifoThresh )
fholin 0:2325d1d28df3 1424 {
fholin 0:2325d1d28df3 1425 ReadFifo( ( rxBuffer + this->settings.FskPacketHandler.NbBytes ), this->settings.FskPacketHandler.FifoThresh );
fholin 0:2325d1d28df3 1426 this->settings.FskPacketHandler.NbBytes += this->settings.FskPacketHandler.FifoThresh;
fholin 0:2325d1d28df3 1427 }
fholin 0:2325d1d28df3 1428 else
fholin 0:2325d1d28df3 1429 {
fholin 0:2325d1d28df3 1430 ReadFifo( ( rxBuffer + this->settings.FskPacketHandler.NbBytes ), this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
fholin 0:2325d1d28df3 1431 this->settings.FskPacketHandler.NbBytes += ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
fholin 0:2325d1d28df3 1432 }
fholin 0:2325d1d28df3 1433 break;
fholin 0:2325d1d28df3 1434 case MODEM_LORA:
fholin 0:2325d1d28df3 1435 // Sync time out
fholin 0:2325d1d28df3 1436 rxTimeoutTimer.detach( );
fholin 0:2325d1d28df3 1437 this->settings.State = RF_IDLE;
fholin 0:2325d1d28df3 1438 if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxTimeout != NULL ) )
fholin 0:2325d1d28df3 1439 {
fholin 0:2325d1d28df3 1440 this->RadioEvents->RxTimeout( );
fholin 0:2325d1d28df3 1441 }
fholin 0:2325d1d28df3 1442 break;
fholin 0:2325d1d28df3 1443 default:
fholin 0:2325d1d28df3 1444 break;
fholin 0:2325d1d28df3 1445 }
fholin 0:2325d1d28df3 1446 break;
fholin 0:2325d1d28df3 1447 case RF_TX_RUNNING:
fholin 0:2325d1d28df3 1448 switch( this->settings.Modem )
fholin 0:2325d1d28df3 1449 {
fholin 0:2325d1d28df3 1450 case MODEM_FSK:
fholin 0:2325d1d28df3 1451 // FifoLevel interrupt
fholin 0:2325d1d28df3 1452 if( ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes ) > this->settings.FskPacketHandler.ChunkSize )
fholin 0:2325d1d28df3 1453 {
fholin 0:2325d1d28df3 1454 WriteFifo( ( rxBuffer + this->settings.FskPacketHandler.NbBytes ), this->settings.FskPacketHandler.ChunkSize );
fholin 0:2325d1d28df3 1455 this->settings.FskPacketHandler.NbBytes += this->settings.FskPacketHandler.ChunkSize;
fholin 0:2325d1d28df3 1456 }
fholin 0:2325d1d28df3 1457 else
fholin 0:2325d1d28df3 1458 {
fholin 0:2325d1d28df3 1459 // Write the last chunk of data
fholin 0:2325d1d28df3 1460 WriteFifo( rxBuffer + this->settings.FskPacketHandler.NbBytes, this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
fholin 0:2325d1d28df3 1461 this->settings.FskPacketHandler.NbBytes += this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes;
fholin 0:2325d1d28df3 1462 }
fholin 0:2325d1d28df3 1463 break;
fholin 0:2325d1d28df3 1464 case MODEM_LORA:
fholin 0:2325d1d28df3 1465 break;
fholin 0:2325d1d28df3 1466 default:
fholin 0:2325d1d28df3 1467 break;
fholin 0:2325d1d28df3 1468 }
fholin 0:2325d1d28df3 1469 break;
fholin 0:2325d1d28df3 1470 default:
fholin 0:2325d1d28df3 1471 break;
fholin 0:2325d1d28df3 1472 }
fholin 0:2325d1d28df3 1473 }
fholin 0:2325d1d28df3 1474
fholin 0:2325d1d28df3 1475 void SX1276::OnDio2Irq( void )
fholin 0:2325d1d28df3 1476 {
fholin 0:2325d1d28df3 1477 switch( this->settings.State )
fholin 0:2325d1d28df3 1478 {
fholin 0:2325d1d28df3 1479 case RF_RX_RUNNING:
fholin 0:2325d1d28df3 1480 switch( this->settings.Modem )
fholin 0:2325d1d28df3 1481 {
fholin 0:2325d1d28df3 1482 case MODEM_FSK:
fholin 0:2325d1d28df3 1483 if( ( this->settings.FskPacketHandler.PreambleDetected == true ) && ( this->settings.FskPacketHandler.SyncWordDetected == false ) )
fholin 0:2325d1d28df3 1484 {
fholin 0:2325d1d28df3 1485 rxTimeoutSyncWord.detach( );
fholin 0:2325d1d28df3 1486
fholin 0:2325d1d28df3 1487 this->settings.FskPacketHandler.SyncWordDetected = true;
fholin 0:2325d1d28df3 1488
fholin 0:2325d1d28df3 1489 this->settings.FskPacketHandler.RssiValue = -( Read( REG_RSSIVALUE ) >> 1 );
fholin 0:2325d1d28df3 1490
fholin 0:2325d1d28df3 1491 this->settings.FskPacketHandler.AfcValue = ( int32_t )( double )( ( ( uint16_t )Read( REG_AFCMSB ) << 8 ) |
fholin 0:2325d1d28df3 1492 ( uint16_t )Read( REG_AFCLSB ) ) *
fholin 0:2325d1d28df3 1493 ( double )FREQ_STEP;
fholin 0:2325d1d28df3 1494 this->settings.FskPacketHandler.RxGain = ( Read( REG_LNA ) >> 5 ) & 0x07;
fholin 0:2325d1d28df3 1495 }
fholin 0:2325d1d28df3 1496 break;
fholin 0:2325d1d28df3 1497 case MODEM_LORA:
fholin 0:2325d1d28df3 1498 if( this->settings.LoRa.FreqHopOn == true )
fholin 0:2325d1d28df3 1499 {
fholin 0:2325d1d28df3 1500 // Clear Irq
fholin 0:2325d1d28df3 1501 Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL );
fholin 0:2325d1d28df3 1502
fholin 0:2325d1d28df3 1503 if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->FhssChangeChannel != NULL ) )
fholin 0:2325d1d28df3 1504 {
fholin 0:2325d1d28df3 1505 this->RadioEvents->FhssChangeChannel( ( Read( REG_LR_HOPCHANNEL ) & RFLR_HOPCHANNEL_CHANNEL_MASK ) );
fholin 0:2325d1d28df3 1506 }
fholin 0:2325d1d28df3 1507 }
fholin 0:2325d1d28df3 1508 break;
fholin 0:2325d1d28df3 1509 default:
fholin 0:2325d1d28df3 1510 break;
fholin 0:2325d1d28df3 1511 }
fholin 0:2325d1d28df3 1512 break;
fholin 0:2325d1d28df3 1513 case RF_TX_RUNNING:
fholin 0:2325d1d28df3 1514 switch( this->settings.Modem )
fholin 0:2325d1d28df3 1515 {
fholin 0:2325d1d28df3 1516 case MODEM_FSK:
fholin 0:2325d1d28df3 1517 break;
fholin 0:2325d1d28df3 1518 case MODEM_LORA:
fholin 0:2325d1d28df3 1519 if( this->settings.LoRa.FreqHopOn == true )
fholin 0:2325d1d28df3 1520 {
fholin 0:2325d1d28df3 1521 // Clear Irq
fholin 0:2325d1d28df3 1522 Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL );
fholin 0:2325d1d28df3 1523
fholin 0:2325d1d28df3 1524 if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->FhssChangeChannel != NULL ) )
fholin 0:2325d1d28df3 1525 {
fholin 0:2325d1d28df3 1526 this->RadioEvents->FhssChangeChannel( ( Read( REG_LR_HOPCHANNEL ) & RFLR_HOPCHANNEL_CHANNEL_MASK ) );
fholin 0:2325d1d28df3 1527 }
fholin 0:2325d1d28df3 1528 }
fholin 0:2325d1d28df3 1529 break;
fholin 0:2325d1d28df3 1530 default:
fholin 0:2325d1d28df3 1531 break;
fholin 0:2325d1d28df3 1532 }
fholin 0:2325d1d28df3 1533 break;
fholin 0:2325d1d28df3 1534 default:
fholin 0:2325d1d28df3 1535 break;
fholin 0:2325d1d28df3 1536 }
fholin 0:2325d1d28df3 1537 }
fholin 0:2325d1d28df3 1538
fholin 0:2325d1d28df3 1539 void SX1276::OnDio3Irq( void )
fholin 0:2325d1d28df3 1540 {
fholin 0:2325d1d28df3 1541 switch( this->settings.Modem )
fholin 0:2325d1d28df3 1542 {
fholin 0:2325d1d28df3 1543 case MODEM_FSK:
fholin 0:2325d1d28df3 1544 break;
fholin 0:2325d1d28df3 1545 case MODEM_LORA:
fholin 0:2325d1d28df3 1546 if( ( Read( REG_LR_IRQFLAGS ) & RFLR_IRQFLAGS_CADDETECTED ) == RFLR_IRQFLAGS_CADDETECTED )
fholin 0:2325d1d28df3 1547 {
fholin 0:2325d1d28df3 1548 // Clear Irq
fholin 0:2325d1d28df3 1549 Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDETECTED | RFLR_IRQFLAGS_CADDONE );
fholin 0:2325d1d28df3 1550 if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->CadDone != NULL ) )
fholin 0:2325d1d28df3 1551 {
fholin 0:2325d1d28df3 1552 this->RadioEvents->CadDone( true );
fholin 0:2325d1d28df3 1553 }
fholin 0:2325d1d28df3 1554 }
fholin 0:2325d1d28df3 1555 else
fholin 0:2325d1d28df3 1556 {
fholin 0:2325d1d28df3 1557 // Clear Irq
fholin 0:2325d1d28df3 1558 Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDONE );
fholin 0:2325d1d28df3 1559 if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->CadDone != NULL ) )
fholin 0:2325d1d28df3 1560 {
fholin 0:2325d1d28df3 1561 this->RadioEvents->CadDone( false );
fholin 0:2325d1d28df3 1562 }
fholin 0:2325d1d28df3 1563 }
fholin 0:2325d1d28df3 1564 break;
fholin 0:2325d1d28df3 1565 default:
fholin 0:2325d1d28df3 1566 break;
fholin 0:2325d1d28df3 1567 }
fholin 0:2325d1d28df3 1568 }
fholin 0:2325d1d28df3 1569
fholin 0:2325d1d28df3 1570 void SX1276::OnDio4Irq( void )
fholin 0:2325d1d28df3 1571 {
fholin 0:2325d1d28df3 1572 switch( this->settings.Modem )
fholin 0:2325d1d28df3 1573 {
fholin 0:2325d1d28df3 1574 case MODEM_FSK:
fholin 0:2325d1d28df3 1575 {
fholin 0:2325d1d28df3 1576 if( this->settings.FskPacketHandler.PreambleDetected == false )
fholin 0:2325d1d28df3 1577 {
fholin 0:2325d1d28df3 1578 this->settings.FskPacketHandler.PreambleDetected = true;
fholin 0:2325d1d28df3 1579 }
fholin 0:2325d1d28df3 1580 }
fholin 0:2325d1d28df3 1581 break;
fholin 0:2325d1d28df3 1582 case MODEM_LORA:
fholin 0:2325d1d28df3 1583 break;
fholin 0:2325d1d28df3 1584 default:
fholin 0:2325d1d28df3 1585 break;
fholin 0:2325d1d28df3 1586 }
fholin 0:2325d1d28df3 1587 }
fholin 0:2325d1d28df3 1588
fholin 0:2325d1d28df3 1589 void SX1276::OnDio5Irq( void )
fholin 0:2325d1d28df3 1590 {
fholin 0:2325d1d28df3 1591 switch( this->settings.Modem )
fholin 0:2325d1d28df3 1592 {
fholin 0:2325d1d28df3 1593 case MODEM_FSK:
fholin 0:2325d1d28df3 1594 break;
fholin 0:2325d1d28df3 1595 case MODEM_LORA:
fholin 0:2325d1d28df3 1596 break;
fholin 0:2325d1d28df3 1597 default:
fholin 0:2325d1d28df3 1598 break;
fholin 0:2325d1d28df3 1599 }
fholin 0:2325d1d28df3 1600 }