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 SX1276Lib by
Revision 26:d09a8ef807e2, committed 2017-04-24
- Comitter:
- mluis
- Date:
- Mon Apr 24 09:26:23 2017 +0000
- Parent:
- 22:7f3aab69cca9
- Child:
- 27:5a56a5d281bf
- Commit message:
- WARNING: Radio API timings changed from micro-seconds to milliseconds; ; Synchronized with https://github.com/Lora-net/LoRaMac-node git revision e506c246652fa44c3f24cecb89d0707b49ece739
Changed in this revision
--- a/enums/enums.h Thu Nov 26 16:55:15 2015 +0000
+++ b/enums/enums.h Mon Apr 24 09:26:23 2017 +0000
@@ -62,6 +62,7 @@
bool IqInverted;
bool RxContinuous;
uint32_t TxTimeout;
+ uint32_t RxSingleTimeout;
}RadioFskSettings_t;
/*!
@@ -99,6 +100,7 @@
bool IqInverted;
bool RxContinuous;
uint32_t TxTimeout;
+ bool PublicNetwork;
}RadioLoRaSettings_t;
/*!
--- a/radio/radio.h Thu Nov 26 16:55:15 2015 +0000
+++ b/radio/radio.h Mon Apr 24 09:26:23 2017 +0000
@@ -57,7 +57,6 @@
* \param [IN] currentChannel Index number of the current channel
*/
void ( *FhssChangeChannel )( uint8_t currentChannel );
-
/*!
* @brief CAD Done callback prototype.
*
@@ -89,35 +88,30 @@
//-------------------------------------------------------------------------
// Pure virtual functions
//-------------------------------------------------------------------------
-
/*!
* @brief Initializes the radio
*
* @param [IN] events Structure containing the driver callback functions
*/
virtual void Init( RadioEvents_t *events ) = 0;
-
/*!
* @brief Return current radio status
*
* @param status Radio status.[RF_IDLE, RF_RX_RUNNING, RF_TX_RUNNING]
*/
virtual RadioState GetStatus( void ) = 0;
-
/*!
* @brief Configures the radio with the given modem
*
* @param [IN] modem Modem to be used [0: FSK, 1: LoRa]
*/
virtual void SetModem( RadioModems_t modem ) = 0;
-
/*!
* @brief Sets the channel frequency
*
* @param [IN] freq Channel RF frequency
*/
virtual void SetChannel( uint32_t freq ) = 0;
-
/*!
* @brief Sets the channels configuration
*
@@ -128,7 +122,6 @@
* @retval isFree [true: Channel is free, false: Channel is not free]
*/
virtual bool IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh ) = 0;
-
/*!
* @brief Generates a 32 bits random value based on the RSSI readings
*
@@ -140,7 +133,6 @@
* @retval randomValue 32 bits random value
*/
virtual uint32_t Random( void )= 0;
-
/*!
* @brief Sets the reception parameters
*
@@ -162,8 +154,8 @@
* @param [IN] preambleLen Sets the Preamble length ( LoRa only )
* FSK : N/A ( set to 0 )
* LoRa: Length in symbols ( the hardware adds 4 more symbols )
- * @param [IN] symbTimeout Sets the RxSingle timeout value ( LoRa only )
- * FSK : N/A ( set to 0 )
+ * @param [IN] symbTimeout Sets the RxSingle timeout value
+ * FSK : timeout number of bytes
* LoRa: timeout in symbols
* @param [IN] fixLen Fixed length packets [0: variable, 1: fixed]
* @param [IN] payloadLen Sets payload length when fixed lenght is used
@@ -183,7 +175,6 @@
uint8_t payloadLen,
bool crcOn, bool freqHopOn, uint8_t hopPeriod,
bool iqInverted, bool rxContinuous ) = 0;
-
/*!
* @brief Sets the transmission parameters
*
@@ -218,7 +209,6 @@
uint8_t coderate, uint16_t preambleLen,
bool fixLen, bool crcOn, bool freqHopOn,
uint8_t hopPeriod, bool iqInverted, uint32_t timeout ) = 0;
-
/*!
* @brief Checks if the given RF frequency is supported by the hardware
*
@@ -226,7 +216,6 @@
* @retval isSupported [true: supported, false: unsupported]
*/
virtual bool CheckRfFrequency( uint32_t frequency ) = 0;
-
/*!
* @brief Computes the packet time on air for the given payload
*
@@ -237,8 +226,7 @@
*
* @retval airTime Computed airTime for the given packet payload length
*/
- virtual double TimeOnAir ( RadioModems_t modem, uint8_t pktLen ) = 0;
-
+ virtual uint32_t TimeOnAir ( RadioModems_t modem, uint8_t pktLen ) = 0;
/*!
* @brief Sends the buffer of size. Prepares the packet to be sent and sets
* the radio in transmission
@@ -247,43 +235,44 @@
* @param [IN]: size Buffer size
*/
virtual void Send( uint8_t *buffer, uint8_t size ) = 0;
-
/*!
* @brief Sets the radio in sleep mode
*/
virtual void Sleep( void ) = 0;
-
/*!
* @brief Sets the radio in standby mode
*/
virtual void Standby( void ) = 0;
-
/*!
* @brief Sets the radio in CAD mode
*/
virtual void StartCad( void ) = 0;
-
/*!
* @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 ) = 0;
-
/*!
* @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 ) = 0;
-
+ /*!
+ * @brief Sets the radio in continuous wave transmission mode
+ *
+ * @param [IN]: freq Channel RF frequency
+ * @param [IN]: power Sets the output power [dBm]
+ * @param [IN]: time Transmission mode timeout [s]
+ */
+ virtual void SetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time ) = 0;
/*!
* @brief Reads the current RSSI value
*
* @retval rssiValue Current RSSI value in [dBm]
*/
virtual int16_t GetRssi ( RadioModems_t modem ) = 0;
-
/*!
* @brief Writes the radio register at the specified address
*
@@ -291,7 +280,6 @@
* @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
*
@@ -299,7 +287,6 @@
* @retval data Register value
*/
virtual uint8_t Read ( uint8_t addr ) = 0;
-
/*!
* @brief Writes multiple radio registers starting at address
*
@@ -308,7 +295,6 @@
* @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
*
@@ -317,23 +303,20 @@
* @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 SX1276 FIFO
+ * @brief Writes the buffer contents to the Radio FIFO
*
* @param [IN] buffer Buffer containing data to be put on the FIFO.
* @param [IN] size Number of bytes to be written to the FIFO
*/
virtual void WriteFifo( uint8_t *buffer, uint8_t size ) = 0;
-
/*!
- * @brief Reads the contents of the SX1276 FIFO
+ * @brief Reads the contents of the Radio FIFO
*
* @param [OUT] buffer Buffer where to copy the FIFO read data.
* @param [IN] size Number of bytes to be read from the FIFO
*/
virtual void ReadFifo( uint8_t *buffer, uint8_t size ) = 0;
-
/*!
* @brief Sets the maximum payload length.
*
@@ -341,6 +324,14 @@
* @param [IN] max Maximum payload length in bytes
*/
virtual void SetMaxPayloadLength( RadioModems_t modem, uint8_t max ) = 0;
+ /*!
+ * @brief Sets the network to public or private. Updates the sync byte.
+ *
+ * @remark Applies to LoRa modem only
+ *
+ * @param [IN] enable if true, it enables a public network
+ */
+ virtual void SetPublicNetwork( bool enable ) = 0;
};
#endif // __RADIO_H__
--- a/registers/sx1276Regs-Fsk.h Thu Nov 26 16:55:15 2015 +0000 +++ b/registers/sx1276Regs-Fsk.h Mon Apr 24 09:26:23 2017 +0000 @@ -376,9 +376,15 @@ /*! * RegPaRamp */ -#define RF_PARAMP_LOWPNTXPLL_MASK 0xE0 -#define RF_PARAMP_LOWPNTXPLL_OFF 0x10 // Default -#define RF_PARAMP_LOWPNTXPLL_ON 0x00 +#define RF_PARAMP_MODULATIONSHAPING_MASK 0x9F +#define RF_PARAMP_MODULATIONSHAPING_00 0x00 // Default +#define RF_PARAMP_MODULATIONSHAPING_01 0x20 +#define RF_PARAMP_MODULATIONSHAPING_10 0x40 +#define RF_PARAMP_MODULATIONSHAPING_11 0x60 + +#define RF_PARAMP_LOWPNTXPLL_MASK 0xEF +#define RF_PARAMP_LOWPNTXPLL_OFF 0x10 +#define RF_PARAMP_LOWPNTXPLL_ON 0x00 // Default #define RF_PARAMP_MASK 0xF0 #define RF_PARAMP_3400_US 0x00
--- a/sx1276/sx1276-hal.cpp Thu Nov 26 16:55:15 2015 +0000
+++ b/sx1276/sx1276-hal.cpp Mon Apr 24 09:26:23 2017 +0000
@@ -21,25 +21,25 @@
PinName dio0, PinName dio1, PinName dio2, PinName dio3, PinName dio4, PinName dio5,
PinName antSwitch )
: SX1276( events, mosi, miso, sclk, nss, reset, dio0, dio1, dio2, dio3, dio4, dio5 ),
- antSwitch( antSwitch ),
+ AntSwitch( antSwitch ),
#if( defined ( TARGET_NUCLEO_L152RE ) )
- fake( D8 )
+ Fake( D8 )
#else
- fake( A3 )
+ Fake( A3 )
#endif
{
this->RadioEvents = events;
Reset( );
-
+
RxChainCalibration( );
-
+
IoInit( );
-
+
SetOpMode( RF_OPMODE_SLEEP );
-
+
IoIrqInit( dioIrq );
-
+
RadioRegistersInit( );
SetModem( MODEM_FSK );
@@ -47,36 +47,36 @@
this->settings.State = RF_IDLE ;
}
-SX1276MB1xAS::SX1276MB1xAS( RadioEvents_t *events )
+SX1276MB1xAS::SX1276MB1xAS( RadioEvents_t *events )
#if defined ( TARGET_NUCLEO_L152RE )
: SX1276( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, A3, D9 ), // For NUCLEO L152RE dio4 is on port A3
- antSwitch( A4 ),
- fake( D8 )
+ AntSwitch( A4 ),
+ Fake( D8 )
#elif defined( TARGET_LPC11U6X )
: SX1276( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, D8, D9 ),
- antSwitch( P0_23 ),
- fake( A3 )
+ AntSwitch( P0_23 ),
+ Fake( A3 )
#else
: SX1276( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, D8, D9 ),
- antSwitch( A4 ),
- fake( A3 )
+ AntSwitch( A4 ),
+ Fake( A3 )
#endif
{
this->RadioEvents = events;
Reset( );
-
+
boardConnected = UNKNOWN;
-
+
DetectBoardType( );
-
+
RxChainCalibration( );
-
+
IoInit( );
-
+
SetOpMode( RF_OPMODE_SLEEP );
IoIrqInit( dioIrq );
-
+
RadioRegistersInit( );
SetModem( MODEM_FSK );
@@ -91,9 +91,9 @@
{
if( boardConnected == UNKNOWN )
{
- antSwitch.input( );
+ this->AntSwitch.input( );
wait_ms( 1 );
- if( antSwitch == 1 )
+ if( this->AntSwitch == 1 )
{
boardConnected = SX1276MB1LAS;
}
@@ -101,7 +101,7 @@
{
boardConnected = SX1276MB1MAS;
}
- antSwitch.output( );
+ this->AntSwitch.output( );
wait_ms( 1 );
}
return ( boardConnected );
@@ -128,7 +128,7 @@
nss = 1;
spi.format( 8,0 );
uint32_t frequencyToSet = 8000000;
- #if( defined ( TARGET_NUCLEO_L152RE ) || defined ( TARGET_LPC11U6X ) )
+ #if( defined ( TARGET_NUCLEO_L152RE ) || defined ( TARGET_LPC11U6X ) )
spi.frequency( frequencyToSet );
#elif( defined ( TARGET_KL25Z ) ) //busclock frequency is halved -> double the spi frequency to compensate
spi.frequency( frequencyToSet * 2 );
@@ -140,18 +140,18 @@
void SX1276MB1xAS::IoIrqInit( DioIrqHandler *irqHandlers )
{
-#if( defined ( TARGET_NUCLEO_L152RE ) || defined ( TARGET_LPC11U6X ) )
- dio0.mode(PullDown);
- dio1.mode(PullDown);
- dio2.mode(PullDown);
- dio3.mode(PullDown);
- dio4.mode(PullDown);
+#if( defined ( TARGET_NUCLEO_L152RE ) || defined ( TARGET_LPC11U6X ) )
+ dio0.mode( PullDown );
+ dio1.mode( PullDown );
+ dio2.mode( PullDown );
+ dio3.mode( PullDown );
+ dio4.mode( PullDown );
#endif
- dio0.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[0] ) );
- dio1.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[1] ) );
- dio2.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[2] ) );
- dio3.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[3] ) );
- dio4.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[4] ) );
+ dio0.rise( mbed::callback( this, static_cast< TriggerMB1xAS > ( irqHandlers[0] ) ) );
+ dio1.rise( mbed::callback( this, static_cast< TriggerMB1xAS > ( irqHandlers[1] ) ) );
+ dio2.rise( mbed::callback( this, static_cast< TriggerMB1xAS > ( irqHandlers[2] ) ) );
+ dio3.rise( mbed::callback( this, static_cast< TriggerMB1xAS > ( irqHandlers[3] ) ) );
+ dio4.rise( mbed::callback( this, static_cast< TriggerMB1xAS > ( irqHandlers[4] ) ) );
}
void SX1276MB1xAS::IoDeInit( void )
@@ -159,6 +159,68 @@
//nothing
}
+void SX1276MB1xAS::SetRfTxPower( int8_t power )
+{
+ uint8_t paConfig = 0;
+ uint8_t paDac = 0;
+
+ paConfig = Read( REG_PACONFIG );
+ paDac = Read( REG_PADAC );
+
+ paConfig = ( paConfig & RF_PACONFIG_PASELECT_MASK ) | GetPaSelect( this->settings.Channel );
+ paConfig = ( paConfig & RF_PACONFIG_MAX_POWER_MASK ) | 0x70;
+
+ if( ( paConfig & RF_PACONFIG_PASELECT_PABOOST ) == RF_PACONFIG_PASELECT_PABOOST )
+ {
+ if( power > 17 )
+ {
+ paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_ON;
+ }
+ else
+ {
+ paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_OFF;
+ }
+ if( ( paDac & RF_PADAC_20DBM_ON ) == RF_PADAC_20DBM_ON )
+ {
+ if( power < 5 )
+ {
+ power = 5;
+ }
+ if( power > 20 )
+ {
+ power = 20;
+ }
+ paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 5 ) & 0x0F );
+ }
+ else
+ {
+ if( power < 2 )
+ {
+ power = 2;
+ }
+ if( power > 17 )
+ {
+ power = 17;
+ }
+ paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 2 ) & 0x0F );
+ }
+ }
+ else
+ {
+ if( power < -1 )
+ {
+ power = -1;
+ }
+ if( power > 14 )
+ {
+ power = 14;
+ }
+ paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power + 1 ) & 0x0F );
+ }
+ Write( REG_PACONFIG, paConfig );
+ Write( REG_PADAC, paDac );
+}
+
uint8_t SX1276MB1xAS::GetPaSelect( uint32_t channel )
{
if( channel > RF_MID_BAND_THRESH )
@@ -197,50 +259,47 @@
void SX1276MB1xAS::AntSwInit( void )
{
- antSwitch = 0;
+ this->AntSwitch = 0;
}
void SX1276MB1xAS::AntSwDeInit( void )
{
- antSwitch = 0;
+ this->AntSwitch = 0;
}
-void SX1276MB1xAS::SetAntSw( uint8_t rxTx )
+void SX1276MB1xAS::SetAntSw( uint8_t opMode )
{
- if( this->rxTx == rxTx )
+ switch( opMode )
{
- //no need to go further
- return;
- }
-
- this->rxTx = rxTx;
-
- if( rxTx != 0 )
- {
- antSwitch = 1;
- }
- else
- {
- antSwitch = 0;
+ case RFLR_OPMODE_TRANSMITTER:
+ this->AntSwitch = 1;
+ break;
+ case RFLR_OPMODE_RECEIVER:
+ case RFLR_OPMODE_RECEIVER_SINGLE:
+ case RFLR_OPMODE_CAD:
+ this->AntSwitch = 0;
+ break;
+ default:
+ this->AntSwitch = 0;
+ break;
}
}
bool SX1276MB1xAS::CheckRfFrequency( uint32_t frequency )
{
- //TODO: Implement check, currently all frequencies are supported
+ // Implement check. Currently all frequencies are supported
return true;
}
-
void SX1276MB1xAS::Reset( void )
{
- reset.output();
+ reset.output( );
reset = 0;
wait_ms( 1 );
- reset.input();
+ reset.input( );
wait_ms( 6 );
}
-
+
void SX1276MB1xAS::Write( uint8_t addr, uint8_t data )
{
Write( addr, &data, 1 );
--- a/sx1276/sx1276-hal.h Thu Nov 26 16:55:15 2015 +0000
+++ b/sx1276/sx1276-hal.h Mon Apr 24 09:26:23 2017 +0000
@@ -17,15 +17,16 @@
#include "sx1276.h"
/*!
- * \brief Radio hardware registers initialization definition
+ * @brief Radio hardware registers initialization definition
*
- * \remark Can be automatically generated by the SX1276 GUI (not yet implemented)
+ * @remark Can be automatically generated by the SX1276 GUI (not yet implemented)
*/
#define RADIO_INIT_REGISTERS_VALUE \
{ \
{ 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 },\
@@ -49,29 +50,28 @@
/*!
* Antenna switch GPIO pins objects
*/
- DigitalInOut antSwitch;
-
- DigitalIn fake;
-
+ DigitalInOut AntSwitch;
+ DigitalIn Fake;
+
private:
static const RadioRegisters_t RadioRegsInit[];
-
+
public:
SX1276MB1xAS( RadioEvents_t *events,
PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset,
PinName dio0, PinName dio1, PinName dio2, PinName dio3, PinName dio4, PinName dio5,
PinName antSwitch );
-
+
SX1276MB1xAS( RadioEvents_t *events );
-
+
virtual ~SX1276MB1xAS( ) { };
-
- protected:
+
+protected:
/*!
* @brief Initializes the radio I/Os pins interface
*/
virtual void IoInit( void );
-
+
/*!
* @brief Initializes the radio registers
*/
@@ -81,7 +81,7 @@
* @brief Initializes the radio SPI
*/
virtual void SpiInit( void );
-
+
/*!
* @brief Initializes DIO IRQ handlers
*
@@ -97,6 +97,13 @@
virtual void IoDeInit( void );
/*!
+ * \brief Sets the radio output power.
+ *
+ * @param [IN] power Sets the RF output power
+ */
+ virtual void SetRfTxPower( int8_t power );
+
+ /*!
* @brief Gets the board PA selection configuration
*
* @param [IN] channel Channel frequency in Hz
@@ -119,25 +126,25 @@
/*!
* @brief De-initializes the RF Switch I/Os pins interface
*
- * \remark Needed to decrease the power consumption in MCU lowpower modes
+ * @remark Needed to decrease the power consumption in MCU lowpower modes
*/
virtual void AntSwDeInit( void );
/*!
* @brief Controls the antena switch if necessary.
*
- * \remark see errata note
+ * @remark see errata note
*
- * @param [IN] rxTx [1: Tx, 0: Rx]
+ * @param [IN] opMode Current radio operating mode
*/
- virtual void SetAntSw( uint8_t rxTx );
-
- public:
+ virtual void SetAntSw( uint8_t opMode );
+
+public:
/*!
* @brief Detect the board connected by reading the value of the antenna switch pin
*/
- virtual uint8_t DetectBoardType( void );
-
+ virtual uint8_t DetectBoardType( void );
+
/*!
* @brief Checks if the given RF frequency is supported by the hardware
*
@@ -145,15 +152,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
*
@@ -161,7 +168,7 @@
* @retval data Register value
*/
virtual uint8_t Read ( uint8_t addr ) ;
-
+
/*!
* @brief Writes multiple radio registers starting at address
*
@@ -170,7 +177,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
*
@@ -179,7 +186,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 SX1276 FIFO
*
@@ -195,7 +202,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 SX1276
*/
--- a/sx1276/sx1276.cpp Thu Nov 26 16:55:15 2015 +0000
+++ b/sx1276/sx1276.cpp Mon Apr 24 09:26:23 2017 +0000
@@ -15,8 +15,8 @@
#include "sx1276.h"
const FskBandwidth_t SX1276::FskBandwidths[] =
-{
- { 2600 , 0x17 },
+{
+ { 2600 , 0x17 },
{ 3100 , 0x0F },
{ 3900 , 0x07 },
{ 5200 , 0x16 },
@@ -37,7 +37,7 @@
{ 166700, 0x11 },
{ 200000, 0x09 },
{ 250000, 0x01 },
- { 300000, 0x00 }, // Invalid Badwidth
+ { 300000, 0x00 }, // Invalid Bandwidth
};
@@ -52,12 +52,10 @@
isRadioActive( false )
{
wait_ms( 10 );
- this->rxTx = 0;
- this->rxBuffer = new uint8_t[RX_BUFFER_SIZE];
- previousOpMode = RF_OPMODE_STANDBY;
-
+ this->rxtxBuffer = new uint8_t[RX_BUFFER_SIZE];
+
this->RadioEvents = events;
-
+
this->dioIrq = new DioIrqHandler[6];
this->dioIrq[0] = &SX1276::OnDio0Irq;
@@ -66,13 +64,13 @@
this->dioIrq[3] = &SX1276::OnDio3Irq;
this->dioIrq[4] = &SX1276::OnDio4Irq;
this->dioIrq[5] = NULL;
-
+
this->settings.State = RF_IDLE;
}
SX1276::~SX1276( )
{
- delete this->rxBuffer;
+ delete this->rxtxBuffer;
delete this->dioIrq;
}
@@ -98,19 +96,19 @@
bool SX1276::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 +122,7 @@
uint32_t rnd = 0;
/*
- * Radio setup for random number generation
+ * Radio setup for random number generation
*/
// Set LoRa modem ON
SetModem( MODEM_LORA );
@@ -182,7 +180,7 @@
// Sets a Frequency in HF band
SetChannel( 868000000 );
- // Launch Rx chain calibration for HF band
+ // Launch Rx chain calibration for HF band
Write ( REG_IMAGECAL, ( Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_MASK ) | RF_IMAGECAL_IMAGECAL_START );
while( ( Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_RUNNING ) == RF_IMAGECAL_IMAGECAL_RUNNING )
{
@@ -237,7 +235,8 @@
this->settings.Fsk.IqInverted = iqInverted;
this->settings.Fsk.RxContinuous = rxContinuous;
this->settings.Fsk.PreambleLen = preambleLen;
-
+ this->settings.Fsk.RxSingleTimeout = symbTimeout * ( ( 1.0 / ( double )datarate ) * 8.0 ) * 1e3;
+
datarate = ( uint16_t )( ( double )XTAL_FREQ / ( double )datarate );
Write( REG_BITRATEMSB, ( uint8_t )( datarate >> 8 ) );
Write( REG_BITRATELSB, ( uint8_t )( datarate & 0xFF ) );
@@ -247,18 +246,23 @@
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_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 ) );
+ Write( REG_PACKETCONFIG2, ( Read( REG_PACKETCONFIG2 ) | RF_PACKETCONFIG2_DATAMODE_PACKET ) );
}
break;
case MODEM_LORA:
@@ -289,7 +293,7 @@
{
datarate = 6;
}
-
+
if( ( ( bandwidth == 7 ) && ( ( datarate == 11 ) || ( datarate == 12 ) ) ) ||
( ( bandwidth == 8 ) && ( datarate == 12 ) ) )
{
@@ -300,14 +304,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 ) |
- ( bandwidth << 4 ) | ( coderate << 1 ) |
+ ( bandwidth << 4 ) | ( coderate << 1 ) |
fixLen );
-
+
Write( REG_LR_MODEMCONFIG2,
( Read( REG_LR_MODEMCONFIG2 ) &
RFLR_MODEMCONFIG2_SF_MASK &
@@ -316,13 +320,13 @@
( datarate << 4 ) | ( crcOn << 2 ) |
( ( symbTimeout >> 8 ) & ~RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK ) );
- Write( REG_LR_MODEMCONFIG3,
+ Write( REG_LR_MODEMCONFIG3,
( Read( REG_LR_MODEMCONFIG3 ) &
RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK ) |
( this->settings.LoRa.LowDatarateOptimize << 3 ) );
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 ) );
@@ -337,9 +341,9 @@
Write( REG_LR_HOPPERIOD, this->settings.LoRa.HopPeriod );
}
- if( ( bandwidth == 9 ) && ( RF_MID_BAND_THRESH ) )
+ if( ( bandwidth == 9 ) && ( this->settings.Channel > RF_MID_BAND_THRESH ) )
{
- // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
+ // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
Write( REG_LR_TEST36, 0x02 );
Write( REG_LR_TEST3A, 0x64 );
}
@@ -354,14 +358,14 @@
// ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
Write( REG_LR_TEST36, 0x03 );
}
-
+
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
@@ -370,7 +374,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 );
}
}
@@ -378,72 +382,15 @@
}
}
-void SX1276::SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
+void SX1276::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 );
-
- paConfig = ( paConfig & RF_PACONFIG_PASELECT_MASK ) | GetPaSelect( this->settings.Channel );
- paConfig = ( paConfig & RF_PACONFIG_MAX_POWER_MASK ) | 0x70;
- if( ( paConfig & RF_PACONFIG_PASELECT_PABOOST ) == RF_PACONFIG_PASELECT_PABOOST )
- {
- if( power > 17 )
- {
- paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_ON;
- }
- else
- {
- paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_OFF;
- }
- if( ( paDac & RF_PADAC_20DBM_ON ) == RF_PADAC_20DBM_ON )
- {
- if( power < 5 )
- {
- power = 5;
- }
- if( power > 20 )
- {
- power = 20;
- }
- paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 5 ) & 0x0F );
- }
- else
- {
- if( power < 2 )
- {
- power = 2;
- }
- if( power > 17 )
- {
- power = 17;
- }
- paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 2 ) & 0x0F );
- }
- }
- else
- {
- if( power < -1 )
- {
- power = -1;
- }
- if( power > 14 )
- {
- power = 14;
- }
- paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power + 1 ) & 0x0F );
- }
- Write( REG_PACONFIG, paConfig );
- Write( REG_PADAC, paDac );
+ SetRfTxPower( power );
switch( modem )
{
@@ -458,7 +405,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 ) );
@@ -471,12 +418,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 ) );
-
+ Write( REG_PACKETCONFIG2, ( Read( REG_PACKETCONFIG2 ) | RF_PACKETCONFIG2_DATAMODE_PACKET ) );
}
break;
case MODEM_LORA:
@@ -523,12 +470,12 @@
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 ) |
- ( bandwidth << 4 ) | ( coderate << 1 ) |
+ ( bandwidth << 4 ) | ( coderate << 1 ) |
fixLen );
Write( REG_LR_MODEMCONFIG2,
@@ -537,21 +484,21 @@
RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK ) |
( datarate << 4 ) | ( crcOn << 2 ) );
- Write( REG_LR_MODEMCONFIG3,
+ Write( REG_LR_MODEMCONFIG3,
( Read( REG_LR_MODEMCONFIG3 ) &
RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK ) |
( this->settings.LoRa.LowDatarateOptimize << 3 ) );
-
+
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
@@ -560,7 +507,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 );
}
}
@@ -568,7 +515,7 @@
}
}
-double SX1276::TimeOnAir( RadioModems_t modem, uint8_t pktLen )
+uint32_t SX1276::TimeOnAir( RadioModems_t modem, uint8_t pktLen )
{
uint32_t airTime = 0;
@@ -582,7 +529,7 @@
( ( ( Read( REG_PACKETCONFIG1 ) & ~RF_PACKETCONFIG1_ADDRSFILTERING_MASK ) != 0x00 ) ? 1.0 : 0 ) +
pktLen +
( ( this->settings.Fsk.CrcOn == 0x01 ) ? 2.0 : 0 ) ) /
- this->settings.Fsk.Datarate ) * 1e6 );
+ this->settings.Fsk.Datarate ) * 1e3 );
}
break;
case MODEM_LORA:
@@ -632,15 +579,15 @@
double tmp = ceil( ( 8 * pktLen - 4 * this->settings.LoRa.Datarate +
28 + 16 * this->settings.LoRa.CrcOn -
( this->settings.LoRa.FixLen ? 20 : 0 ) ) /
- ( double )( 4 * this->settings.LoRa.Datarate -
- ( ( this->settings.LoRa.LowDatarateOptimize > 0 ) ? 2 : 0 ) ) ) *
+ ( double )( 4 * ( this->settings.LoRa.Datarate -
+ ( ( this->settings.LoRa.LowDatarateOptimize > 0 ) ? 2 : 0 ) ) ) ) *
( 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 );
+ // return ms secs
+ airTime = floor( tOnAir * 1e3 + 0.999 );
}
break;
}
@@ -665,14 +612,15 @@
else
{
Write( REG_PAYLOADLENGTH, size );
- }
-
+ }
+
if( ( size > 0 ) && ( size <= 64 ) )
{
this->settings.FskPacketHandler.ChunkSize = size;
}
else
{
+ memcpy( rxtxBuffer, buffer, size );
this->settings.FskPacketHandler.ChunkSize = 32;
}
@@ -693,14 +641,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 );
@@ -722,7 +670,7 @@
void SX1276::Sleep( void )
{
- txTimeoutTimer.detach( );
+ txTimeoutTimer.detach( );
rxTimeoutTimer.detach( );
SetOpMode( RF_OPMODE_SLEEP );
@@ -731,7 +679,7 @@
void SX1276::Standby( void )
{
- txTimeoutTimer.detach( );
+ txTimeoutTimer.detach( );
rxTimeoutTimer.detach( );
SetOpMode( RF_OPMODE_STANDBY );
@@ -741,13 +689,13 @@
void SX1276::Rx( uint32_t timeout )
{
bool rxContinuous = false;
-
+
switch( this->settings.Modem )
{
case MODEM_FSK:
{
rxContinuous = this->settings.Fsk.RxContinuous;
-
+
// DIO0=PayloadReady
// DIO1=FifoLevel
// DIO2=SyncAddr
@@ -755,17 +703,21 @@
// DIO4=Preamble
// DIO5=ModeReady
Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RF_DIOMAPPING1_DIO0_MASK &
+ 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;
@@ -783,8 +735,7 @@
{
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 );
- }
-
+ }
// ERRATA 2.3 - Receiver Spurious Reception of a LoRa Signal
if( this->settings.LoRa.Bandwidth < 9 )
@@ -834,7 +785,7 @@
}
rxContinuous = this->settings.LoRa.RxContinuous;
-
+
if( this->settings.LoRa.FreqHopOn == true )
{
Write( REG_LR_IRQFLAGSMASK, //RFLR_IRQFLAGS_RXTIMEOUT |
@@ -845,7 +796,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 );
}
@@ -859,7 +810,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 );
}
@@ -869,25 +820,22 @@
break;
}
- memset( rxBuffer, 0, ( size_t )RX_BUFFER_SIZE );
+ memset( rxtxBuffer, 0, ( size_t )RX_BUFFER_SIZE );
this->settings.State = RF_RX_RUNNING;
if( timeout != 0 )
{
- rxTimeoutTimer.attach_us( this, &SX1276::OnTimeoutIrq, timeout );
+ rxTimeoutTimer.attach_us( mbed::callback( this, &SX1276::OnTimeoutIrq ), timeout * 1e3 );
}
if( this->settings.Modem == MODEM_FSK )
{
SetOpMode( RF_OPMODE_RECEIVER );
-
+
if( rxContinuous == false )
{
- rxTimeoutSyncWord.attach_us( this, &SX1276::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( mbed::callback( this, &SX1276::OnTimeoutIrq ),
+ this->settings.Fsk.RxSingleTimeout * 1e3 );
}
}
else
@@ -911,13 +859,15 @@
case MODEM_FSK:
{
// DIO0=PacketSent
- // DIO1=FifoLevel
+ // DIO1=FifoEmpty
// DIO2=FifoFull
// DIO3=FifoEmpty
// DIO4=LowBat
// DIO5=ModeReady
Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RF_DIOMAPPING1_DIO0_MASK &
- RF_DIOMAPPING1_DIO2_MASK ) );
+ 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 ) );
@@ -936,7 +886,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 );
}
@@ -959,7 +909,7 @@
}
this->settings.State = RF_TX_RUNNING;
- txTimeoutTimer.attach_us( this, &SX1276::OnTimeoutIrq, timeout );
+ txTimeoutTimer.attach_us( mbed::callback( this, &SX1276::OnTimeoutIrq ), timeout * 1e3 );
SetOpMode( RF_OPMODE_TRANSMITTER );
}
@@ -969,7 +919,7 @@
{
case MODEM_FSK:
{
-
+
}
break;
case MODEM_LORA:
@@ -981,12 +931,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 );
-
+ Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO3_MASK ) | RFLR_DIOMAPPING1_DIO3_00 );
+
this->settings.State = RF_CAD;
SetOpMode( RFLR_OPMODE_CAD );
}
@@ -996,6 +946,24 @@
}
}
+void SX1276::SetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time )
+{
+ uint32_t timeout = ( uint32_t )( time * 1e6 );
+
+ SetChannel( freq );
+
+ SetTxConfig( MODEM_FSK, power, 0, 0, 4800, 0, 5, false, false, 0, 0, 0, timeout );
+
+ Write( REG_PACKETCONFIG2, ( Read( REG_PACKETCONFIG2 ) & RF_PACKETCONFIG2_DATAMODE_MASK ) );
+ // Disable radio interrupts
+ Write( REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_11 | RF_DIOMAPPING1_DIO1_11 );
+ Write( REG_DIOMAPPING2, RF_DIOMAPPING2_DIO4_10 | RF_DIOMAPPING2_DIO5_10 );
+
+ this->settings.State = RF_TX_RUNNING;
+ txTimeoutTimer.attach_us( mbed::callback( this, &SX1276::OnTimeoutIrq ), timeout );
+ SetOpMode( RF_OPMODE_TRANSMITTER );
+}
+
int16_t SX1276::GetRssi( RadioModems_t modem )
{
int16_t rssi = 0;
@@ -1024,31 +992,29 @@
void SX1276::SetOpMode( uint8_t opMode )
{
- if( opMode != previousOpMode )
+ if( opMode == RF_OPMODE_SLEEP )
{
- previousOpMode = opMode;
- if( opMode == RF_OPMODE_SLEEP )
- {
- SetAntSwLowPower( true );
- }
- else
- {
- SetAntSwLowPower( false );
- if( opMode == RF_OPMODE_TRANSMITTER )
- {
- SetAntSw( 1 );
- }
- else
- {
- SetAntSw( 0 );
- }
- }
- Write( REG_OPMODE, ( Read( REG_OPMODE ) & RF_OPMODE_MASK ) | opMode );
+ SetAntSwLowPower( true );
}
+ else
+ {
+ SetAntSwLowPower( false );
+ SetAntSw( opMode );
+ }
+ Write( REG_OPMODE, ( Read( REG_OPMODE ) & RF_OPMODE_MASK ) | opMode );
}
void SX1276::SetModem( RadioModems_t modem )
{
+ if( ( Read( REG_OPMODE ) & RFLR_OPMODE_LONGRANGEMODE_ON ) != 0 )
+ {
+ this->settings.Modem = MODEM_LORA;
+ }
+ else
+ {
+ this->settings.Modem = MODEM_FSK;
+ }
+
if( this->settings.Modem == modem )
{
return;
@@ -1059,14 +1025,14 @@
{
default:
case MODEM_FSK:
- SetOpMode( RF_OPMODE_SLEEP );
+ Sleep( );
Write( REG_OPMODE, ( Read( REG_OPMODE ) & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_OFF );
-
+
Write( REG_DIOMAPPING1, 0x00 );
Write( REG_DIOMAPPING2, 0x30 ); // DIO5=ModeReady
break;
case MODEM_LORA:
- SetOpMode( RF_OPMODE_SLEEP );
+ Sleep( );
Write( REG_OPMODE, ( Read( REG_OPMODE ) & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_ON );
Write( REG_DIOMAPPING1, 0x00 );
@@ -1093,6 +1059,22 @@
}
}
+void SX1276::SetPublicNetwork( bool enable )
+{
+ SetModem( MODEM_LORA );
+ this->settings.LoRa.PublicNetwork = enable;
+ if( enable == true )
+ {
+ // Change LoRa modem SyncWord
+ Write( REG_LR_SYNCWORD, LORA_MAC_PUBLIC_SYNCWORD );
+ }
+ else
+ {
+ // Change LoRa modem SyncWord
+ Write( REG_LR_SYNCWORD, LORA_MAC_PRIVATE_SYNCWORD );
+ }
+}
+
void SX1276::OnTimeoutIrq( void )
{
switch( this->settings.State )
@@ -1106,7 +1088,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 );
@@ -1115,6 +1097,8 @@
{
// Continuous mode restart Rx chain
Write( REG_RXCONFIG, Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
+ rxTimeoutSyncWord.attach_us( mbed::callback( this, &SX1276::OnTimeoutIrq ),
+ this->settings.Fsk.RxSingleTimeout * 1e3 );
}
else
{
@@ -1128,6 +1112,31 @@
}
break;
case RF_TX_RUNNING:
+ // Tx timeout shouldn't happen.
+ // But it has been observed that when it happens it is a result of a corrupted SPI transfer
+ // it depends on the platform design.
+ //
+ // The workaround is to put the radio in a known state. Thus, we re-initialize it.
+
+ // BEGIN WORKAROUND
+
+ // Reset the radio
+ Reset( );
+
+ // Calibrate Rx chain
+ RxChainCalibration( );
+
+ // Initialize radio default values
+ SetOpMode( RF_OPMODE_SLEEP );
+
+ RadioRegistersInit( );
+
+ SetModem( MODEM_FSK );
+
+ // Restore previous network type setting.
+ SetPublicNetwork( this->settings.LoRa.PublicNetwork );
+ // END WORKAROUND
+
this->settings.State = RF_IDLE;
if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->TxTimeout != NULL ) )
{
@@ -1144,7 +1153,7 @@
volatile uint8_t irqFlags = 0;
switch( this->settings.State )
- {
+ {
case RF_RX_RUNNING:
//TimerStop( &RxTimeoutTimer );
// RxDone interrupt
@@ -1157,27 +1166,26 @@
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, &SX1276::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( mbed::callback( this, &SX1276::OnTimeoutIrq ),
+ this->settings.Fsk.RxSingleTimeout * 1e3 );
}
- rxTimeoutTimer.detach( );
-
+
if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxError != NULL ) )
{
this->RadioEvents->RxError( );
@@ -1189,7 +1197,7 @@
break;
}
}
-
+
// Read received packet size
if( ( this->settings.FskPacketHandler.Size == 0 ) && ( this->settings.FskPacketHandler.NbBytes == 0 ) )
{
@@ -1201,35 +1209,34 @@
{
this->settings.FskPacketHandler.Size = Read( REG_PAYLOADLENGTH );
}
- ReadFifo( rxBuffer + this->settings.FskPacketHandler.NbBytes, this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
+ ReadFifo( rxtxBuffer + this->settings.FskPacketHandler.NbBytes, this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
this->settings.FskPacketHandler.NbBytes += ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
}
else
{
- ReadFifo( rxBuffer + this->settings.FskPacketHandler.NbBytes, this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
+ ReadFifo( rxtxBuffer + this->settings.FskPacketHandler.NbBytes, this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
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, &SX1276::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( mbed::callback( this, &SX1276::OnTimeoutIrq ),
+ this->settings.Fsk.RxSingleTimeout * 1e3 );
}
- rxTimeoutTimer.detach( );
if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxDone != NULL ) )
{
- this->RadioEvents->RxDone( rxBuffer, 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;
@@ -1289,7 +1296,7 @@
}
}
else
- {
+ {
if( this->settings.Channel > RF_MID_BAND_THRESH )
{
this->settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_HF + rssi + ( rssi >> 4 );
@@ -1301,8 +1308,8 @@
}
this->settings.LoRaPacketHandler.Size = Read( REG_LR_RXNBBYTES );
- ReadFifo( rxBuffer, this->settings.LoRaPacketHandler.Size );
-
+ ReadFifo( rxtxBuffer, this->settings.LoRaPacketHandler.Size );
+
if( this->settings.LoRa.RxContinuous == false )
{
this->settings.State = RF_IDLE;
@@ -1311,7 +1318,7 @@
if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxDone != NULL ) )
{
- this->RadioEvents->RxDone( rxBuffer, this->settings.LoRaPacketHandler.Size, this->settings.LoRaPacketHandler.RssiValue, this->settings.LoRaPacketHandler.SnrValue );
+ this->RadioEvents->RxDone( rxtxBuffer, this->settings.LoRaPacketHandler.Size, this->settings.LoRaPacketHandler.RssiValue, this->settings.LoRaPacketHandler.SnrValue );
}
}
break;
@@ -1320,7 +1327,7 @@
}
break;
case RF_TX_RUNNING:
- txTimeoutTimer.detach( );
+ txTimeoutTimer.detach( );
// TxDone interrupt
switch( this->settings.Modem )
{
@@ -1334,7 +1341,7 @@
if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->TxDone != NULL ) )
{
this->RadioEvents->TxDone( );
- }
+ }
break;
}
break;
@@ -1346,7 +1353,7 @@
void SX1276::OnDio1Irq( void )
{
switch( this->settings.State )
- {
+ {
case RF_RX_RUNNING:
switch( this->settings.Modem )
{
@@ -1367,18 +1374,21 @@
if( ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes ) > this->settings.FskPacketHandler.FifoThresh )
{
- ReadFifo( ( rxBuffer + this->settings.FskPacketHandler.NbBytes ), this->settings.FskPacketHandler.FifoThresh );
+ ReadFifo( ( rxtxBuffer + this->settings.FskPacketHandler.NbBytes ), this->settings.FskPacketHandler.FifoThresh );
this->settings.FskPacketHandler.NbBytes += this->settings.FskPacketHandler.FifoThresh;
}
else
{
- ReadFifo( ( rxBuffer + this->settings.FskPacketHandler.NbBytes ), this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
+ ReadFifo( ( rxtxBuffer + this->settings.FskPacketHandler.NbBytes ), this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
this->settings.FskPacketHandler.NbBytes += ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
}
break;
case MODEM_LORA:
// Sync time out
rxTimeoutTimer.detach( );
+ // Clear Irq
+ Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXTIMEOUT );
+
this->settings.State = RF_IDLE;
if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxTimeout != NULL ) )
{
@@ -1393,16 +1403,16 @@
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( ( rxBuffer + 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( rxBuffer + this->settings.FskPacketHandler.NbBytes, this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
+ WriteFifo( rxtxBuffer + this->settings.FskPacketHandler.NbBytes, this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
this->settings.FskPacketHandler.NbBytes += this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes;
}
break;
@@ -1420,17 +1430,23 @@
void SX1276::OnDio2Irq( void )
{
switch( this->settings.State )
- {
+ {
case RF_RX_RUNNING:
switch( this->settings.Modem )
{
case MODEM_FSK:
+ // Checks if DIO4 is connected. If it is not PreambleDtected is set to true.
+ if( this->dioIrq[4] == NULL )
+ {
+ this->settings.FskPacketHandler.PreambleDetected = true;
+ }
+
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 ) |
@@ -1444,7 +1460,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 ) );
@@ -1465,7 +1481,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 ) );
@@ -1498,7 +1514,7 @@
}
}
else
- {
+ {
// Clear Irq
Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDONE );
if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->CadDone != NULL ) )
@@ -1521,7 +1537,7 @@
if( this->settings.FskPacketHandler.PreambleDetected == false )
{
this->settings.FskPacketHandler.PreambleDetected = true;
- }
+ }
}
break;
case MODEM_LORA:
--- a/sx1276/sx1276.h Thu Nov 26 16:55:15 2015 +0000
+++ b/sx1276/sx1276.h Mon Apr 24 09:26:23 2017 +0000
@@ -21,9 +21,20 @@
#include "./typedefs/typedefs.h"
/*!
- * Radio wakeup time from SLEEP mode
+ * Radio wake-up time from sleep
+ */
+#define RADIO_WAKEUP_TIME 1 // [ms]
+
+/*!
+ * Sync word for Private LoRa networks
*/
-#define RADIO_WAKEUP_TIME 1000 // [us]
+#define LORA_MAC_PRIVATE_SYNCWORD 0x12
+
+/*!
+ * Sync word for Public LoRa networks
+ */
+#define LORA_MAC_PUBLIC_SYNCWORD 0x34
+
/*!
* SX1276 definitions
@@ -67,35 +78,28 @@
InterruptIn dio3;
InterruptIn dio4;
DigitalIn dio5;
-
+
bool isRadioActive;
-
+
uint8_t boardConnected; //1 = SX1276MB1LAS; 0 = SX1276MB1MAS
-
- uint8_t *rxBuffer;
-
- uint8_t previousOpMode;
-
+
+ uint8_t *rxtxBuffer;
+
/*!
* 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[] ;
+
+ static const FskBandwidth_t FskBandwidths[];
protected:
/*!
@@ -108,7 +112,7 @@
public:
SX1276( RadioEvents_t *events,
PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset,
- PinName dio0, PinName dio1, PinName dio2, PinName dio3, PinName dio4, PinName dio5 );
+ PinName dio0, PinName dio1, PinName dio2, PinName dio3, PinName dio4, PinName dio5 );
SX1276( RadioEvents_t *events );
virtual ~SX1276( );
@@ -127,21 +131,18 @@
* @param status Radio status. [RF_IDLE, RX_RUNNING, TX_RUNNING]
*/
virtual RadioState GetStatus( void );
-
/*!
* @brief Configures the SX1276 with the given modem
*
* @param [IN] modem Modem to be used [0: FSK, 1: LoRa]
*/
virtual void SetModem( RadioModems_t modem );
-
/*!
* @brief Sets the channel frequency
*
* @param [IN] freq Channel RF frequency
*/
virtual void SetChannel( uint32_t freq );
-
/*!
* @brief Sets the channels configuration
*
@@ -152,7 +153,6 @@
* @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
*
@@ -164,7 +164,6 @@
* @retval randomValue 32 bits random value
*/
virtual uint32_t Random( void );
-
/*!
* @brief Sets the reception parameters
*
@@ -186,8 +185,8 @@
* @param [IN] preambleLen Sets the Preamble length ( LoRa only )
* FSK : N/A ( set to 0 )
* LoRa: Length in symbols ( the hardware adds 4 more symbols )
- * @param [IN] symbTimeout Sets the RxSingle timeout value ( LoRa only )
- * FSK : N/A ( set to 0 )
+ * @param [IN] symbTimeout Sets the RxSingle timeout value
+ * FSK : timeout number of bytes
* LoRa: timeout in symbols
* @param [IN] fixLen Fixed length packets [0: variable, 1: fixed]
* @param [IN] payloadLen Sets payload length when fixed lenght is used
@@ -207,7 +206,6 @@
uint8_t payloadLen,
bool crcOn, bool freqHopOn, uint8_t hopPeriod,
bool iqInverted, bool rxContinuous );
-
/*!
* @brief Sets the transmission parameters
*
@@ -235,14 +233,20 @@
* @param [IN] iqInverted Inverts IQ signals ( LoRa only )
* FSK : N/A ( set to 0 )
* LoRa: [0: not inverted, 1: inverted]
- * @param [IN] timeout Transmission timeout [us]
+ * @param [IN] timeout Transmission timeout [ms]
*/
virtual void 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,
uint8_t hopPeriod, bool iqInverted, uint32_t timeout );
-
+ /*!
+ * @brief Checks if the given RF frequency is supported by the hardware
+ *
+ * @param [IN] frequency RF frequency to be checked
+ * @retval isSupported [true: supported, false: unsupported]
+ */
+ virtual bool CheckRfFrequency( uint32_t frequency ) = 0;
/*!
* @brief Computes the packet time on air for the given payload
*
@@ -253,8 +257,7 @@
*
* @retval airTime Computed airTime for the given packet payload length
*/
- virtual double TimeOnAir ( RadioModems_t modem, uint8_t pktLen );
-
+ virtual uint32_t 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
@@ -263,43 +266,44 @@
* @param [IN]: size Buffer size
*/
virtual void Send( uint8_t *buffer, uint8_t size );
-
/*!
* @brief Sets the radio in sleep mode
*/
virtual void Sleep( void );
-
/*!
* @brief Sets the radio in standby mode
*/
virtual void Standby( void );
-
+ /*!
+ * @brief Sets the radio in CAD mode
+ */
+ virtual void StartCad( void );
/*!
* @brief Sets the radio in reception mode for the given time
- * @param [IN] timeout Reception timeout [us]
+ * @param [IN] timeout Reception timeout [ms]
* [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]
+ * @param [IN] timeout Transmission timeout [ms]
* [0: continuous, others timeout]
*/
virtual void Tx( uint32_t timeout );
-
/*!
- * @brief Start a Channel Activity Detection
+ * @brief Sets the radio in continuous wave transmission mode
+ *
+ * @param [IN]: freq Channel RF frequency
+ * @param [IN]: power Sets the output power [dBm]
+ * @param [IN]: time Transmission mode timeout [s]
*/
- virtual void StartCad( void );
-
+ virtual void SetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time );
/*!
* @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
*
@@ -307,7 +311,6 @@
* @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
*
@@ -315,7 +318,6 @@
* @retval data Register value
*/
virtual uint8_t Read ( uint8_t addr ) = 0;
-
/*!
* @brief Writes multiple radio registers starting at address
*
@@ -324,7 +326,6 @@
* @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
*
@@ -333,7 +334,6 @@
* @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 SX1276 FIFO
*
@@ -341,7 +341,6 @@
* @param [IN] size Number of bytes to be written to the FIFO
*/
virtual void WriteFifo( uint8_t *buffer, uint8_t size ) = 0;
-
/*!
* @brief Reads the contents of the SX1276 FIFO
*
@@ -353,7 +352,7 @@
* @brief Resets the SX1276
*/
virtual void Reset( void ) = 0;
-
+
/*!
* @brief Sets the maximum payload length.
*
@@ -361,11 +360,20 @@
* @param [IN] max Maximum payload length in bytes
*/
virtual void SetMaxPayloadLength( RadioModems_t modem, uint8_t max );
-
+
+ /*!
+ * \brief Sets the network to public or private. Updates the sync byte.
+ *
+ * \remark Applies to LoRa modem only
+ *
+ * \param [IN] enable if true, it enables a public network
+ */
+ virtual void SetPublicNetwork( bool enable );
+
//-------------------------------------------------------------------------
// Board relative functions
//-------------------------------------------------------------------------
-
+
protected:
/*!
* @brief Initializes the radio I/Os pins interface
@@ -381,7 +389,7 @@
* @brief Initializes the radio SPI
*/
virtual void SpiInit( void ) = 0;
-
+
/*!
* @brief Initializes DIO IRQ handlers
*
@@ -397,6 +405,13 @@
virtual void IoDeInit( void ) = 0;
/*!
+ * @brief Sets the radio output power.
+ *
+ * @param [IN] power Sets the RF output power
+ */
+ virtual void SetRfTxPower( int8_t power ) = 0;
+
+ /*!
* @brief Gets the board PA selection configuration
*
* @param [IN] channel Channel frequency in Hz
@@ -424,21 +439,13 @@
virtual void AntSwDeInit( void ) = 0;
/*!
- * @brief Controls the antena switch if necessary.
+ * @brief Controls the antenna switch if necessary.
*
* \remark see errata note
*
- * @param [IN] rxTx [1: Tx, 0: Rx]
+ * @param [IN] opMode Current radio operating mode
*/
- virtual void SetAntSw( uint8_t rxTx ) = 0;
-
- /*!
- * @brief Checks if the given RF frequency is supported by the hardware
- *
- * @param [IN] frequency RF frequency to be checked
- * @retval isSupported [true: supported, false: unsupported]
- */
- virtual bool CheckRfFrequency( uint32_t frequency ) = 0;
+ virtual void SetAntSw( uint8_t opMode ) = 0;
protected:
/*!
@@ -486,7 +493,7 @@
* @brief Tx & Rx timeout timer callback
*/
virtual void OnTimeoutIrq( void );
-
+
/*!
* Returns the known FSK bandwidth registers value
*
