Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of SX1272Lib by
Revision 4:90bd79f1b458, committed 2016-05-13
- Comitter:
- mluis
- Date:
- Fri May 13 14:49:34 2016 +0000
- Parent:
- 3:5baff45eb3c5
- Child:
- 5:e90cbf646eb1
- Commit message:
- Synchronized with https://github.com/Lora-net/LoRaMac-node radio drivers git revision 55d16ca8949c09ee241c87b7600e2a8bc90d3743
Changed in this revision
--- a/sx1272/sx1272-hal.cpp Thu Mar 10 10:20:44 2016 +0000
+++ b/sx1272/sx1272-hal.cpp Fri May 13 14:49:34 2016 +0000
@@ -46,13 +46,13 @@
this->RadioEvents = events;
Reset( );
-
+
IoInit( );
-
+
SetOpMode( RF_OPMODE_SLEEP );
-
+
IoIrqInit( dioIrq );
-
+
RadioRegistersInit( );
SetModem( MODEM_FSK );
@@ -60,7 +60,7 @@
this->settings.State = RF_IDLE ;
}
-SX1272MB2xAS::SX1272MB2xAS( RadioEvents_t *events )
+SX1272MB2xAS::SX1272MB2xAS( RadioEvents_t *events )
#if defined ( TARGET_NUCLEO_L152RE )
: SX1272( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, A3, D9 ), // For NUCLEO L152RE dio4 is on port A3
AntSwitch( A4 ),
@@ -73,7 +73,7 @@
#elif defined ( TARGET_MTS_MDOT_F411RE )
: SX1272( events, LORA_MOSI, LORA_MISO, LORA_SCK, LORA_NSS, LORA_RESET, LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5 ),
TxCtl( LORA_TXCTL ),
- RxCtl( LORA_RXCTL )
+ RxCtl( LORA_RXCTL )
#else
: SX1272( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, D8, D9 ),
AntSwitch( A4 ),
@@ -83,16 +83,16 @@
this->RadioEvents = events;
Reset( );
-
+
boardConnected = UNKNOWN;
-
+
DetectBoardType( );
-
+
IoInit( );
-
+
SetOpMode( RF_OPMODE_SLEEP );
IoIrqInit( dioIrq );
-
+
RadioRegistersInit( );
SetModem( MODEM_FSK );
@@ -268,12 +268,6 @@
break;
}
#elif defined ( TARGET_MTS_MDOT_F411RE )
- if( this->rxTx == rxTx )
- {
- //no need to go further
- return;
- }
-
/* SKY13350 */
this->rxTx = rxTx;
@@ -289,12 +283,6 @@
this->RxCtl = 1;
}
#else
- if( this->rxTx == rxTx )
- {
- //no need to go further
- return;
- }
-
this->rxTx = rxTx;
// 1: Tx, 0: Rx
--- a/sx1272/sx1272-hal.h Thu Mar 10 10:20:44 2016 +0000
+++ b/sx1272/sx1272-hal.h Fri May 13 14:49:34 2016 +0000
@@ -26,6 +26,7 @@
{ MODEM_FSK , REG_LNA , 0x23 },\
{ MODEM_FSK , REG_RXCONFIG , 0x1E },\
{ MODEM_FSK , REG_RSSICONFIG , 0xD2 },\
+ { MODEM_FSK , REG_AFCFEI , 0x01 },\
{ MODEM_FSK , REG_PREAMBLEDETECT , 0xAA },\
{ MODEM_FSK , REG_OSC , 0x07 },\
{ MODEM_FSK , REG_SYNCCONFIG , 0x12 },\
@@ -61,10 +62,10 @@
DigitalInOut AntSwitch;
DigitalIn Fake;
#endif
-
+
private:
static const RadioRegisters_t RadioRegsInit[];
-
+
public:
SX1272MB2xAS( RadioEvents_t *events,
PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset,
@@ -76,17 +77,17 @@
#else
PinName antSwitch );
#endif
-
+
SX1272MB2xAS( RadioEvents_t *events );
-
+
virtual ~SX1272MB2xAS( ) { };
-
- protected:
+
+protected:
/*!
* @brief Initializes the radio I/Os pins interface
*/
virtual void IoInit( void );
-
+
/*!
* @brief Initializes the radio registers
*/
@@ -96,7 +97,7 @@
* @brief Initializes the radio SPI
*/
virtual void SpiInit( void );
-
+
/*!
* @brief Initializes DIO IRQ handlers
*
@@ -146,13 +147,13 @@
* @param [IN] rxTx [1: Tx, 0: Rx]
*/
virtual void SetAntSw( uint8_t rxTx );
-
- public:
+
+public:
/*!
* @brief Detect the board connected by reading the value of the antenna switch pin
*/
virtual uint8_t DetectBoardType( void );
-
+
/*!
* @brief Checks if the given RF frequency is supported by the hardware
*
@@ -160,15 +161,15 @@
* @retval isSupported [true: supported, false: unsupported]
*/
virtual bool CheckRfFrequency( uint32_t frequency );
-
- /*!
+
+ /*!
* @brief Writes the radio register at the specified address
*
* @param [IN]: addr Register address
* @param [IN]: data New register value
*/
virtual void Write ( uint8_t addr, uint8_t data ) ;
-
+
/*!
* @brief Reads the radio register at the specified address
*
@@ -176,7 +177,7 @@
* @retval data Register value
*/
virtual uint8_t Read ( uint8_t addr ) ;
-
+
/*!
* @brief Writes multiple radio registers starting at address
*
@@ -185,7 +186,7 @@
* @param [IN] size Number of registers to be written
*/
virtual void Write( uint8_t addr, uint8_t *buffer, uint8_t size ) ;
-
+
/*!
* @brief Reads multiple radio registers starting at address
*
@@ -194,7 +195,7 @@
* @param [IN] size Number of registers to be read
*/
virtual void Read ( uint8_t addr, uint8_t *buffer, uint8_t size ) ;
-
+
/*!
* @brief Writes the buffer contents to the SX1272 FIFO
*
@@ -210,7 +211,7 @@
* @param [IN] size Number of bytes to be read from the FIFO
*/
virtual void ReadFifo( uint8_t *buffer, uint8_t size ) ;
-
+
/*!
* @brief Reset the SX1272
*/
--- a/sx1272/sx1272.cpp Thu Mar 10 10:20:44 2016 +0000
+++ b/sx1272/sx1272.cpp Fri May 13 14:49:34 2016 +0000
@@ -98,19 +98,19 @@
bool SX1272::IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh )
{
int16_t rssi = 0;
-
+
SetModem( modem );
SetChannel( freq );
-
+
SetOpMode( RF_OPMODE_RECEIVER );
wait_ms( 1 );
-
+
rssi = GetRssi( modem );
-
+
Sleep( );
-
+
if( rssi > rssiThresh )
{
return false;
@@ -124,7 +124,7 @@
uint32_t rnd = 0;
/*
- * Radio setup for random number generation
+ * Radio setup for random number generation
*/
// Set LoRa modem ON
SetModem( MODEM_LORA );
@@ -198,7 +198,7 @@
this->settings.Fsk.IqInverted = iqInverted;
this->settings.Fsk.RxContinuous = rxContinuous;
this->settings.Fsk.PreambleLen = preambleLen;
-
+
datarate = ( uint16_t )( ( double )XTAL_FREQ / ( double )datarate );
Write( REG_BITRATEMSB, ( uint8_t )( datarate >> 8 ) );
Write( REG_BITRATELSB, ( uint8_t )( datarate & 0xFF ) );
@@ -208,18 +208,18 @@
Write( REG_PREAMBLEMSB, ( uint8_t )( ( preambleLen >> 8 ) & 0xFF ) );
Write( REG_PREAMBLELSB, ( uint8_t )( preambleLen & 0xFF ) );
-
+
if( fixLen == 1 )
{
Write( REG_PAYLOADLENGTH, payloadLen );
}
else
{
- Write( REG_PAYLOADLENGTH, 0xFF ); // Set payload length to the maximum
+ Write( REG_PAYLOADLENGTH, 0xFF ); // Set payload length to the maximum
}
Write( REG_PACKETCONFIG1,
- ( Read( REG_PACKETCONFIG1 ) &
+ ( Read( REG_PACKETCONFIG1 ) &
RF_PACKETCONFIG1_CRC_MASK &
RF_PACKETCONFIG1_PACKETFORMAT_MASK ) |
( ( fixLen == 1 ) ? RF_PACKETCONFIG1_PACKETFORMAT_FIXED : RF_PACKETCONFIG1_PACKETFORMAT_VARIABLE ) |
@@ -248,7 +248,7 @@
{
datarate = 6;
}
-
+
if( ( ( bandwidth == 0 ) && ( ( datarate == 11 ) || ( datarate == 12 ) ) ) ||
( ( bandwidth == 1 ) && ( datarate == 12 ) ) )
{
@@ -259,14 +259,14 @@
this->settings.LoRa.LowDatarateOptimize = 0x00;
}
- Write( REG_LR_MODEMCONFIG1,
+ Write( REG_LR_MODEMCONFIG1,
( Read( REG_LR_MODEMCONFIG1 ) &
RFLR_MODEMCONFIG1_BW_MASK &
RFLR_MODEMCONFIG1_CODINGRATE_MASK &
RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK &
RFLR_MODEMCONFIG1_RXPAYLOADCRC_MASK &
RFLR_MODEMCONFIG1_LOWDATARATEOPTIMIZE_MASK ) |
- ( bandwidth << 6 ) | ( coderate << 3 ) |
+ ( bandwidth << 6 ) | ( coderate << 3 ) |
( fixLen << 2 ) | ( crcOn << 1 ) |
this->settings.LoRa.LowDatarateOptimize );
@@ -278,7 +278,7 @@
( ( symbTimeout >> 8 ) & ~RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK ) );
Write( REG_LR_SYMBTIMEOUTLSB, ( uint8_t )( symbTimeout & 0xFF ) );
-
+
Write( REG_LR_PREAMBLEMSB, ( uint8_t )( ( preambleLen >> 8 ) & 0xFF ) );
Write( REG_LR_PREAMBLELSB, ( uint8_t )( preambleLen & 0xFF ) );
@@ -295,11 +295,11 @@
if( datarate == 6 )
{
- Write( REG_LR_DETECTOPTIMIZE,
+ Write( REG_LR_DETECTOPTIMIZE,
( Read( REG_LR_DETECTOPTIMIZE ) &
RFLR_DETECTIONOPTIMIZE_MASK ) |
RFLR_DETECTIONOPTIMIZE_SF6 );
- Write( REG_LR_DETECTIONTHRESHOLD,
+ Write( REG_LR_DETECTIONTHRESHOLD,
RFLR_DETECTIONTHRESH_SF6 );
}
else
@@ -308,7 +308,7 @@
( Read( REG_LR_DETECTOPTIMIZE ) &
RFLR_DETECTIONOPTIMIZE_MASK ) |
RFLR_DETECTIONOPTIMIZE_SF7_TO_SF12 );
- Write( REG_LR_DETECTIONTHRESHOLD,
+ Write( REG_LR_DETECTIONTHRESHOLD,
RFLR_DETECTIONTHRESH_SF7_TO_SF12 );
}
}
@@ -342,17 +342,17 @@
static const uint8_t RfoTable[11] = { 1, 1, 1, 2, 2, 3, 4, 5, 6, 8, 9 };
#endif
-void SX1272::SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
+void SX1272::SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
uint32_t bandwidth, uint32_t datarate,
uint8_t coderate, uint16_t preambleLen,
- bool fixLen, bool crcOn, bool freqHopOn,
+ bool fixLen, bool crcOn, bool freqHopOn,
uint8_t hopPeriod, bool iqInverted, uint32_t timeout )
{
uint8_t paConfig = 0;
uint8_t paDac = 0;
SetModem( modem );
-
+
paConfig = Read( REG_PACONFIG );
paDac = Read( REG_PADAC );
@@ -418,7 +418,6 @@
paConfig = ( paConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power + 1 ) & 0x0F );
}
#endif
-
Write( REG_PACONFIG, paConfig );
Write( REG_PADAC, paDac );
@@ -435,7 +434,7 @@
this->settings.Fsk.CrcOn = crcOn;
this->settings.Fsk.IqInverted = iqInverted;
this->settings.Fsk.TxTimeout = timeout;
-
+
fdev = ( uint16_t )( ( double )fdev / ( double )FREQ_STEP );
Write( REG_FDEVMSB, ( uint8_t )( fdev >> 8 ) );
Write( REG_FDEVLSB, ( uint8_t )( fdev & 0xFF ) );
@@ -448,12 +447,12 @@
Write( REG_PREAMBLELSB, preambleLen & 0xFF );
Write( REG_PACKETCONFIG1,
- ( Read( REG_PACKETCONFIG1 ) &
+ ( Read( REG_PACKETCONFIG1 ) &
RF_PACKETCONFIG1_CRC_MASK &
RF_PACKETCONFIG1_PACKETFORMAT_MASK ) |
( ( fixLen == 1 ) ? RF_PACKETCONFIG1_PACKETFORMAT_FIXED : RF_PACKETCONFIG1_PACKETFORMAT_VARIABLE ) |
( crcOn << 4 ) );
-
+
}
break;
case MODEM_LORA:
@@ -494,14 +493,14 @@
Write( REG_LR_HOPPERIOD, this->settings.LoRa.HopPeriod );
}
- Write( REG_LR_MODEMCONFIG1,
+ Write( REG_LR_MODEMCONFIG1,
( Read( REG_LR_MODEMCONFIG1 ) &
RFLR_MODEMCONFIG1_BW_MASK &
RFLR_MODEMCONFIG1_CODINGRATE_MASK &
RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK &
RFLR_MODEMCONFIG1_RXPAYLOADCRC_MASK &
RFLR_MODEMCONFIG1_LOWDATARATEOPTIMIZE_MASK ) |
- ( bandwidth << 6 ) | ( coderate << 3 ) |
+ ( bandwidth << 6 ) | ( coderate << 3 ) |
( fixLen << 2 ) | ( crcOn << 1 ) |
this->settings.LoRa.LowDatarateOptimize );
@@ -510,17 +509,17 @@
RFLR_MODEMCONFIG2_SF_MASK ) |
( datarate << 4 ) );
-
+
Write( REG_LR_PREAMBLEMSB, ( preambleLen >> 8 ) & 0x00FF );
Write( REG_LR_PREAMBLELSB, preambleLen & 0xFF );
-
+
if( datarate == 6 )
{
- Write( REG_LR_DETECTOPTIMIZE,
+ Write( REG_LR_DETECTOPTIMIZE,
( Read( REG_LR_DETECTOPTIMIZE ) &
RFLR_DETECTIONOPTIMIZE_MASK ) |
RFLR_DETECTIONOPTIMIZE_SF6 );
- Write( REG_LR_DETECTIONTHRESHOLD,
+ Write( REG_LR_DETECTIONTHRESHOLD,
RFLR_DETECTIONTHRESH_SF6 );
}
else
@@ -529,7 +528,7 @@
( Read( REG_LR_DETECTOPTIMIZE ) &
RFLR_DETECTIONOPTIMIZE_MASK ) |
RFLR_DETECTIONOPTIMIZE_SF7_TO_SF12 );
- Write( REG_LR_DETECTIONTHRESHOLD,
+ Write( REG_LR_DETECTIONTHRESHOLD,
RFLR_DETECTIONTHRESH_SF7_TO_SF12 );
}
}
@@ -584,7 +583,7 @@
( this->settings.LoRa.Coderate + 4 );
double nPayload = 8 + ( ( tmp > 0 ) ? tmp : 0 );
double tPayload = nPayload * ts;
- // Time on air
+ // Time on air
double tOnAir = tPreamble + tPayload;
// return us secs
airTime = floor( tOnAir * 1e6 + 0.999 );
@@ -612,8 +611,8 @@
else
{
Write( REG_PAYLOADLENGTH, size );
- }
-
+ }
+
if( ( size > 0 ) && ( size <= 64 ) )
{
this->settings.FskPacketHandler.ChunkSize = size;
@@ -641,14 +640,14 @@
{
Write( REG_LR_INVERTIQ, ( ( Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_OFF ) );
Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_OFF );
- }
-
+ }
+
this->settings.LoRaPacketHandler.Size = size;
// Initializes the payload size
Write( REG_LR_PAYLOADLENGTH, size );
- // Full buffer used for Tx
+ // Full buffer used for Tx
Write( REG_LR_FIFOTXBASEADDR, 0 );
Write( REG_LR_FIFOADDRPTR, 0 );
@@ -695,7 +694,7 @@
case MODEM_FSK:
{
rxContinuous = this->settings.Fsk.RxContinuous;
-
+
// DIO0=PayloadReady
// DIO1=FifoLevel
// DIO2=SyncAddr
@@ -706,15 +705,18 @@
RF_DIOMAPPING1_DIO1_MASK &
RF_DIOMAPPING1_DIO2_MASK ) |
RF_DIOMAPPING1_DIO0_00 |
+ RF_DIOMAPPING1_DIO1_00 |
RF_DIOMAPPING1_DIO2_11 );
-
+
Write( REG_DIOMAPPING2, ( Read( REG_DIOMAPPING2 ) & RF_DIOMAPPING2_DIO4_MASK &
- RF_DIOMAPPING2_MAP_MASK ) |
+ RF_DIOMAPPING2_MAP_MASK ) |
RF_DIOMAPPING2_DIO4_11 |
RF_DIOMAPPING2_MAP_PREAMBLEDETECT );
-
+
this->settings.FskPacketHandler.FifoThresh = Read( REG_FIFOTHRESH ) & 0x3F;
-
+
+ Write( REG_RXCONFIG, RF_RXCONFIG_AFCAUTO_ON | RF_RXCONFIG_AGCAUTO_ON | RF_RXCONFIG_RXTRIGER_PREAMBLEDETECT );
+
this->settings.FskPacketHandler.PreambleDetected = false;
this->settings.FskPacketHandler.SyncWordDetected = false;
this->settings.FskPacketHandler.NbBytes = 0;
@@ -732,10 +734,10 @@
{
Write( REG_LR_INVERTIQ, ( ( Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_OFF ) );
Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_OFF );
- }
-
+ }
+
rxContinuous = this->settings.LoRa.RxContinuous;
-
+
if( this->settings.LoRa.FreqHopOn == true )
{
Write( REG_LR_IRQFLAGSMASK, //RFLR_IRQFLAGS_RXTIMEOUT |
@@ -746,7 +748,7 @@
RFLR_IRQFLAGS_CADDONE |
//RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
RFLR_IRQFLAGS_CADDETECTED );
-
+
// DIO0=RxDone, DIO2=FhssChangeChannel
Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK & RFLR_DIOMAPPING1_DIO2_MASK ) | RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO2_00 );
}
@@ -760,7 +762,7 @@
RFLR_IRQFLAGS_CADDONE |
RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
RFLR_IRQFLAGS_CADDETECTED );
-
+
// DIO0=RxDone
Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_00 );
}
@@ -781,14 +783,14 @@
if( this->settings.Modem == MODEM_FSK )
{
SetOpMode( RF_OPMODE_RECEIVER );
-
+
if( rxContinuous == false )
{
- rxTimeoutSyncWord.attach_us( this, &SX1272::OnTimeoutIrq, ( 8.0 * ( this->settings.Fsk.PreambleLen +
- ( ( Read( REG_SYNCCONFIG ) &
- ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
- 1.0 ) + 10.0 ) /
- ( double )this->settings.Fsk.Datarate ) * 1e6 );
+ rxTimeoutSyncWord.attach_us( this, &SX1272::OnTimeoutIrq, ceil( ( 8.0 * ( this->settings.Fsk.PreambleLen +
+ ( ( Read( REG_SYNCCONFIG ) &
+ ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
+ 1.0 ) + 10.0 ) /
+ ( double )this->settings.Fsk.Datarate ) * 1e6 ) + 4000 );
}
}
else
@@ -818,8 +820,9 @@
// DIO4=LowBat
// DIO5=ModeReady
Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RF_DIOMAPPING1_DIO0_MASK &
- RF_DIOMAPPING1_DIO2_MASK ) |
- RF_DIOMAPPING1_DIO1_01 );
+ RF_DIOMAPPING1_DIO1_MASK &
+ RF_DIOMAPPING1_DIO2_MASK ) |
+ RF_DIOMAPPING1_DIO1_01 );
Write( REG_DIOMAPPING2, ( Read( REG_DIOMAPPING2 ) & RF_DIOMAPPING2_DIO4_MASK &
RF_DIOMAPPING2_MAP_MASK ) );
@@ -838,7 +841,7 @@
RFLR_IRQFLAGS_CADDONE |
//RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
RFLR_IRQFLAGS_CADDETECTED );
-
+
// DIO0=TxDone, DIO2=FhssChangeChannel
Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK & RFLR_DIOMAPPING1_DIO2_MASK ) | RFLR_DIOMAPPING1_DIO0_01 | RFLR_DIOMAPPING1_DIO2_00 );
}
@@ -871,7 +874,7 @@
{
case MODEM_FSK:
{
-
+
}
break;
case MODEM_LORA:
@@ -883,12 +886,12 @@
RFLR_IRQFLAGS_TXDONE |
//RFLR_IRQFLAGS_CADDONE |
RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL // |
- //RFLR_IRQFLAGS_CADDETECTED
+ //RFLR_IRQFLAGS_CADDETECTED
);
-
+
// DIO3=CADDone
Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_00 );
-
+
this->settings.State = RF_CAD;
SetOpMode( RFLR_OPMODE_CAD );
}
@@ -919,27 +922,23 @@
void SX1272::SetOpMode( uint8_t opMode )
{
- if( opMode != currentOpMode )
+ if( opMode == RF_OPMODE_SLEEP )
{
- currentOpMode = opMode;
- if( opMode == RF_OPMODE_SLEEP )
+ SetAntSwLowPower( true );
+ }
+ else
+ {
+ SetAntSwLowPower( false );
+ if( opMode == RF_OPMODE_TRANSMITTER )
{
- SetAntSwLowPower( true );
+ SetAntSw( 1 );
}
else
{
- SetAntSwLowPower( false );
- if( opMode == RF_OPMODE_TRANSMITTER )
- {
- SetAntSw( 1 );
- }
- else
- {
- SetAntSw( 0 );
- }
+ SetAntSw( 0 );
}
- Write( REG_OPMODE, ( Read( REG_OPMODE ) & RF_OPMODE_MASK ) | opMode );
}
+ Write( REG_OPMODE, ( Read( REG_OPMODE ) & RF_OPMODE_MASK ) | opMode );
}
void SX1272::SetModem( RadioModems_t modem )
@@ -1001,7 +1000,7 @@
this->settings.FskPacketHandler.Size = 0;
// Clear Irqs
- Write( REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
+ Write( REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
RF_IRQFLAGS1_PREAMBLEDETECT |
RF_IRQFLAGS1_SYNCADDRESSMATCH );
Write( REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN );
@@ -1010,6 +1009,11 @@
{
// Continuous mode restart Rx chain
Write( REG_RXCONFIG, Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
+ rxTimeoutSyncWord.attach_us( this, &SX1272::OnTimeoutIrq, ceil( ( 8.0 * ( this->settings.Fsk.PreambleLen +
+ ( ( Read( REG_SYNCCONFIG ) &
+ ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
+ 1.0 ) + 10.0 ) /
+ ( double )this->settings.Fsk.Datarate ) * 1e6 ) + 4000 );
}
else
{
@@ -1039,7 +1043,7 @@
volatile uint8_t irqFlags = 0;
switch( this->settings.State )
- {
+ {
case RF_RX_RUNNING:
//TimerStop( &RxTimeoutTimer );
// RxDone interrupt
@@ -1052,27 +1056,30 @@
if( ( irqFlags & RF_IRQFLAGS2_CRCOK ) != RF_IRQFLAGS2_CRCOK )
{
// Clear Irqs
- Write( REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
+ Write( REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
RF_IRQFLAGS1_PREAMBLEDETECT |
RF_IRQFLAGS1_SYNCADDRESSMATCH );
Write( REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN );
-
+
+ rxTimeoutTimer.detach( );
+
if( this->settings.Fsk.RxContinuous == false )
{
+ rxTimeoutSyncWord.detach( );
this->settings.State = RF_IDLE;
- rxTimeoutSyncWord.attach_us( this, &SX1272::OnTimeoutIrq, ( 8.0 * ( this->settings.Fsk.PreambleLen +
- ( ( Read( REG_SYNCCONFIG ) &
- ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
- 1.0 ) + 10.0 ) /
- ( double )this->settings.Fsk.Datarate ) * 1e6 ) ;
}
else
{
// Continuous mode restart Rx chain
Write( REG_RXCONFIG, Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
+ rxTimeoutSyncWord.attach_us( this, &SX1272::OnTimeoutIrq, ceil( ( 8.0 * ( this->settings.Fsk.PreambleLen +
+ ( ( Read( REG_SYNCCONFIG ) &
+ ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
+ 1.0 ) + 10.0 ) /
+ ( double )this->settings.Fsk.Datarate ) * 1e6 ) + 4000 );
}
- rxTimeoutTimer.detach( );
-
+
+
if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxError != NULL ) )
{
this->RadioEvents->RxError( );
@@ -1105,26 +1112,28 @@
this->settings.FskPacketHandler.NbBytes += ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
}
+ rxTimeoutTimer.detach( );
+
if( this->settings.Fsk.RxContinuous == false )
{
this->settings.State = RF_IDLE;
- rxTimeoutSyncWord.attach_us( this, &SX1272::OnTimeoutIrq, ( 8.0 * ( this->settings.Fsk.PreambleLen +
- ( ( Read( REG_SYNCCONFIG ) &
- ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
- 1.0 ) + 10.0 ) /
- ( double )this->settings.Fsk.Datarate ) * 1e6 ) ;
+ rxTimeoutSyncWord.detach( );
}
else
{
// Continuous mode restart Rx chain
Write( REG_RXCONFIG, Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
+ rxTimeoutSyncWord.attach_us( this, &SX1272::OnTimeoutIrq, ceil( ( 8.0 * ( this->settings.Fsk.PreambleLen +
+ ( ( Read( REG_SYNCCONFIG ) &
+ ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
+ 1.0 ) + 10.0 ) /
+ ( double )this->settings.Fsk.Datarate ) * 1e6 ) + 4000 );
}
- rxTimeoutTimer.detach( );
if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxDone != NULL ) )
{
- this->RadioEvents->RxDone( rxtxBuffer, this->settings.FskPacketHandler.Size, this->settings.FskPacketHandler.RssiValue, 0 );
- }
+ this->RadioEvents->RxDone( rxtxBuffer, this->settings.FskPacketHandler.Size, this->settings.FskPacketHandler.RssiValue, 0 );
+ }
this->settings.FskPacketHandler.PreambleDetected = false;
this->settings.FskPacketHandler.SyncWordDetected = false;
this->settings.FskPacketHandler.NbBytes = 0;
@@ -1176,13 +1185,13 @@
snr;
}
else
- {
+ {
this->settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET + rssi + ( rssi >> 4 );
}
this->settings.LoRaPacketHandler.Size = Read( REG_LR_RXNBBYTES );
ReadFifo( rxtxBuffer, this->settings.LoRaPacketHandler.Size );
-
+
if( this->settings.LoRa.RxContinuous == false )
{
this->settings.State = RF_IDLE;
@@ -1200,7 +1209,7 @@
}
break;
case RF_TX_RUNNING:
- txTimeoutTimer.detach( );
+ txTimeoutTimer.detach( );
// TxDone interrupt
switch( this->settings.Modem )
{
@@ -1214,7 +1223,7 @@
if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->TxDone != NULL ) )
{
this->RadioEvents->TxDone( );
- }
+ }
break;
}
break;
@@ -1226,7 +1235,7 @@
void SX1272::OnDio1Irq( void )
{
switch( this->settings.State )
- {
+ {
case RF_RX_RUNNING:
switch( this->settings.Modem )
{
@@ -1273,13 +1282,13 @@
switch( this->settings.Modem )
{
case MODEM_FSK:
- // FifoLevel interrupt
+ // FifoEmpty interrupt
if( ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes ) > this->settings.FskPacketHandler.ChunkSize )
{
WriteFifo( ( rxtxBuffer + this->settings.FskPacketHandler.NbBytes ), this->settings.FskPacketHandler.ChunkSize );
this->settings.FskPacketHandler.NbBytes += this->settings.FskPacketHandler.ChunkSize;
}
- else
+ else
{
// Write the last chunk of data
WriteFifo( rxtxBuffer + this->settings.FskPacketHandler.NbBytes, this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
@@ -1300,7 +1309,7 @@
void SX1272::OnDio2Irq( void )
{
switch( this->settings.State )
- {
+ {
case RF_RX_RUNNING:
switch( this->settings.Modem )
{
@@ -1308,9 +1317,9 @@
if( ( this->settings.FskPacketHandler.PreambleDetected == true ) && ( this->settings.FskPacketHandler.SyncWordDetected == false ) )
{
rxTimeoutSyncWord.detach( );
-
+
this->settings.FskPacketHandler.SyncWordDetected = true;
-
+
this->settings.FskPacketHandler.RssiValue = -( Read( REG_RSSIVALUE ) >> 1 );
this->settings.FskPacketHandler.AfcValue = ( int32_t )( double )( ( ( uint16_t )Read( REG_AFCMSB ) << 8 ) |
@@ -1324,7 +1333,7 @@
{
// Clear Irq
Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL );
-
+
if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->FhssChangeChannel != NULL ) )
{
this->RadioEvents->FhssChangeChannel( ( Read( REG_LR_HOPCHANNEL ) & RFLR_HOPCHANNEL_CHANNEL_MASK ) );
@@ -1345,7 +1354,7 @@
{
// Clear Irq
Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL );
-
+
if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->FhssChangeChannel != NULL ) )
{
this->RadioEvents->FhssChangeChannel( ( Read( REG_LR_HOPCHANNEL ) & RFLR_HOPCHANNEL_CHANNEL_MASK ) );
@@ -1378,7 +1387,7 @@
}
}
else
- {
+ {
// Clear Irq
Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDONE );
if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->CadDone != NULL ) )
@@ -1401,7 +1410,7 @@
if( this->settings.FskPacketHandler.PreambleDetected == false )
{
this->settings.FskPacketHandler.PreambleDetected = true;
- }
+ }
}
break;
case MODEM_LORA:
--- a/sx1272/sx1272.h Thu Mar 10 10:20:44 2016 +0000
+++ b/sx1272/sx1272.h Fri May 13 14:49:34 2016 +0000
@@ -23,7 +23,18 @@
/*!
* Radio wakeup time from SLEEP mode
*/
-#define RADIO_WAKEUP_TIME 1000 // [us]
+#define RADIO_OSC_STARTUP 1000 // [us]
+
+/*!
+ * Radio PLL lock and Mode Ready delay which can vary with the temperature
+ */
+#define RADIO_SLEEP_TO_RX 2000 // [us]
+
+/*!
+ * Radio complete Wake-up Time with margin for temperature compensation
+ */
+#define RADIO_WAKEUP_TIME ( RADIO_OSC_STARTUP + RADIO_SLEEP_TO_RX )
+
/*!
* SX1272 definitions
@@ -64,34 +75,34 @@
InterruptIn dio3;
InterruptIn dio4;
DigitalIn dio5;
-
+
bool isRadioActive;
-
+
uint8_t boardConnected; //1 = SX1272MB1DCS; 0 = SX1272MB1DAS
-
+
uint8_t *rxtxBuffer;
uint8_t currentOpMode;
-
+
/*!
* Hardware DIO IRQ functions
*/
DioIrqHandler *dioIrq;
-
+
/*!
* Tx and Rx timers
*/
Timeout txTimeoutTimer;
Timeout rxTimeoutTimer;
Timeout rxTimeoutSyncWord;
-
+
/*!
* rxTx: [1: Tx, 0: Rx]
*/
uint8_t rxTx;
-
+
RadioSettings_t settings;
-
+
static const FskBandwidth_t FskBandwidths[] ;
protected:
@@ -124,7 +135,7 @@
* @param status Radio status. [RF_IDLE, RX_RUNNING, TX_RUNNING]
*/
virtual RadioState GetStatus( void );
-
+
/*!
* @brief Configures the SX1272 with the given modem
*
@@ -138,7 +149,7 @@
* @param [IN] freq Channel RF frequency
*/
virtual void SetChannel( uint32_t freq );
-
+
/*!
* @brief Sets the channels configuration
*
@@ -149,7 +160,7 @@
* @retval isFree [true: Channel is free, false: Channel is not free]
*/
virtual bool IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh );
-
+
/*!
* @brief Generates a 32 bits random value based on the RSSI readings
*
@@ -161,7 +172,7 @@
* @retval randomValue 32 bits random value
*/
virtual uint32_t Random( void );
-
+
/*!
* @brief Sets the reception parameters
*
@@ -204,7 +215,7 @@
uint8_t payloadLen,
bool crcOn, bool freqHopOn, uint8_t hopPeriod,
bool iqInverted, bool rxContinuous );
-
+
/*!
* @brief Sets the transmission parameters
*
@@ -239,7 +250,7 @@
uint8_t coderate, uint16_t preambleLen,
bool fixLen, bool crcOn, bool freqHopOn,
uint8_t hopPeriod, bool iqInverted, uint32_t timeout );
-
+
/*!
* @brief Computes the packet time on air for the given payload
*
@@ -251,7 +262,7 @@
* @retval airTime Computed airTime for the given packet payload length
*/
virtual double TimeOnAir ( RadioModems_t modem, uint8_t pktLen );
-
+
/*!
* @brief Sends the buffer of size. Prepares the packet to be sent and sets
* the radio in transmission
@@ -260,7 +271,7 @@
* @param [IN]: size Buffer size
*/
virtual void Send( uint8_t *buffer, uint8_t size );
-
+
/*!
* @brief Sets the radio in sleep mode
*/
@@ -270,33 +281,33 @@
* @brief Sets the radio in standby mode
*/
virtual void Standby( void );
-
+
/*!
* @brief Sets the radio in reception mode for the given time
* @param [IN] timeout Reception timeout [us]
* [0: continuous, others timeout]
*/
virtual void Rx( uint32_t timeout );
-
+
/*!
* @brief Sets the radio in transmission mode for the given time
* @param [IN] timeout Transmission timeout [us]
* [0: continuous, others timeout]
*/
virtual void Tx( uint32_t timeout );
-
+
/*!
* @brief Start a Channel Activity Detection
*/
virtual void StartCad( void );
-
+
/*!
* @brief Reads the current RSSI value
*
* @retval rssiValue Current RSSI value in [dBm]
*/
virtual int16_t GetRssi ( RadioModems_t modem );
-
+
/*!
* @brief Writes the radio register at the specified address
*
@@ -304,7 +315,7 @@
* @param [IN]: data New register value
*/
virtual void Write ( uint8_t addr, uint8_t data ) = 0;
-
+
/*!
* @brief Reads the radio register at the specified address
*
@@ -312,7 +323,7 @@
* @retval data Register value
*/
virtual uint8_t Read ( uint8_t addr ) = 0;
-
+
/*!
* @brief Writes multiple radio registers starting at address
*
@@ -321,7 +332,7 @@
* @param [IN] size Number of registers to be written
*/
virtual void Write( uint8_t addr, uint8_t *buffer, uint8_t size ) = 0;
-
+
/*!
* @brief Reads multiple radio registers starting at address
*
@@ -330,7 +341,7 @@
* @param [IN] size Number of registers to be read
*/
virtual void Read ( uint8_t addr, uint8_t *buffer, uint8_t size ) = 0;
-
+
/*!
* @brief Writes the buffer contents to the SX1272 FIFO
*
@@ -350,7 +361,7 @@
* @brief Resets the SX1272
*/
virtual void Reset( void ) = 0;
-
+
/*!
* @brief Sets the maximum payload length.
*
@@ -358,11 +369,11 @@
* @param [IN] max Maximum payload length in bytes
*/
virtual void SetMaxPayloadLength( RadioModems_t modem, uint8_t max );
-
+
//-------------------------------------------------------------------------
// Board relative functions
//-------------------------------------------------------------------------
-
+
protected:
/*!
* @brief Initializes the radio I/Os pins interface
@@ -378,7 +389,7 @@
* @brief Initializes the radio SPI
*/
virtual void SpiInit( void ) = 0;
-
+
/*!
* @brief Initializes DIO IRQ handlers
*
@@ -428,7 +439,7 @@
* @param [IN] rxTx [1: Tx, 0: Rx]
*/
virtual void SetAntSw( uint8_t rxTx ) = 0;
-
+
/*!
* @brief Checks if the given RF frequency is supported by the hardware
*
@@ -483,7 +494,7 @@
* @brief Tx & Rx timeout timer callback
*/
virtual void OnTimeoutIrq( void );
-
+
/*!
* Returns the known FSK bandwidth registers value
*
