Commit 8c2393cd5c71f599cac30a250dcd0b6c35930153

Authored by rcavalie
1 parent 0ae07db2

travail reception des paquets

emetteur/emetteur.bin
No preview for this file type
emetteur/emetteur.cpp
1 1 ////////////////////////////////////////////////////////////////////////////////
  2 +/*EMETTEUR LoRa
  3 +par : Robin Cavalieri
  4 + IMA5SC
  5 +PFE 2018 */
  6 +////////////////////////////////////////////////////////////////////////////////
2 7 //Headers
3 8 #include "mbed.h"
4 9 #include "main.h"
... ... @@ -34,9 +39,6 @@ typedef enum
34 39 {
35 40 LOWPOWER = 0,
36 41 IDLE,
37   - RX,
38   - RX_TIMEOUT,
39   - RX_ERROR,
40 42 TX,
41 43 TX_TIMEOUT,
42 44 CAD,
... ... @@ -60,7 +62,7 @@ void TrameCreation()
60 62 /*
61 63 [1...] : ID de l'emetteur
62 64 [...] : ID du recepteur cible
63   - [...] : Température communiquée
  65 + [...] : Température communiquée ici 20 pour l'exemple
64 66 */
65 67 //Converti en ASCII
66 68 testMsg[0] = 0x46; //emetteur F
... ... @@ -77,36 +79,7 @@ void TrameCreation()
77 79 testMsg[10] = 0x43; //recepteur C
78 80 //
79 81 testMsg[11] = 0x32; //temperature 2 dizaines
80   - testMsg[12] = 0x30; //temperature 0 unités
81   -}
82   -////////////////////////////////////////////////////////////////////////////////
83   -
84   -////////////////////////////////////////////////////////////////////////////////
85   -//Fonctions utiles
86   -
87   -//Debug pour savoir si le message a été transmis
88   -void OnTxDone( void )
89   -{
90   - Radio.SetChannel( HoppingFrequencies[0] );
91   - Radio.Sleep( );
92   - State = TX;
93   - debug_if( DEBUG_MESSAGE, "\nEnvoye \n\r" );
94   -}
95   -
96   -//Time out de transmission. Échec de l'envoi
97   -void OnTxTimeout( void )
98   -{
99   - Radio.SetChannel(HoppingFrequencies[0]);
100   - Radio.Sleep( );
101   - State = TX_TIMEOUT;
102   - debug_if( DEBUG_MESSAGE, "Echec de l'envoi \n\r");
103   -}
104   -
105   -//Modification du canal d'emission
106   -void OnFhssChangeChannel( uint8_t channelIndex )
107   -{
108   - Radio.SetChannel(HoppingFrequencies[channelIndex]);
109   - debug_if(DEBUG_MESSAGE, "F%d-", channelIndex);
  82 + testMsg[12] = 0x31; //temperature 0 unités
110 83 }
111 84 ////////////////////////////////////////////////////////////////////////////////
112 85  
... ... @@ -171,3 +144,32 @@ int main( void )
171 144 }
172 145 }
173 146 ////////////////////////////////////////////////////////////////////////////////
  147 +
  148 +////////////////////////////////////////////////////////////////////////////////
  149 +//Fonctions utiles
  150 +
  151 +//Debug pour savoir si le message a été transmis
  152 +void OnTxDone( void )
  153 +{
  154 + Radio.SetChannel( HoppingFrequencies[0] );
  155 + Radio.Sleep( );
  156 + State = TX;
  157 + debug_if( DEBUG_MESSAGE, "\nEnvoye \n\r" );
  158 +}
  159 +
  160 +//Time out de transmission. Échec de l'envoi
  161 +void OnTxTimeout( void )
  162 +{
  163 + Radio.SetChannel(HoppingFrequencies[0]);
  164 + Radio.Sleep( );
  165 + State = TX_TIMEOUT;
  166 + debug_if( DEBUG_MESSAGE, "Echec de l'envoi \n\r");
  167 +}
  168 +
  169 +//Modification du canal d'emission
  170 +void OnFhssChangeChannel( uint8_t channelIndex )
  171 +{
  172 + Radio.SetChannel(HoppingFrequencies[channelIndex]);
  173 + debug_if(DEBUG_MESSAGE, "F%d-", channelIndex);
  174 +}
  175 +////////////////////////////////////////////////////////////////////////////////
... ...
recepteur/SX1276Lib/LICENSE.txt 0 → 100644
... ... @@ -0,0 +1,25 @@
  1 +--- Revised BSD License ---
  2 +Copyright (c) 2013, SEMTECH S.A.
  3 +All rights reserved.
  4 +
  5 +Redistribution and use in source and binary forms, with or without
  6 +modification, are permitted provided that the following conditions are met:
  7 + * Redistributions of source code must retain the above copyright
  8 + notice, this list of conditions and the following disclaimer.
  9 + * Redistributions in binary form must reproduce the above copyright
  10 + notice, this list of conditions and the following disclaimer in the
  11 + documentation and/or other materials provided with the distribution.
  12 + * Neither the name of the Semtech corporation nor the
  13 + names of its contributors may be used to endorse or promote products
  14 + derived from this software without specific prior written permission.
  15 +
  16 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  17 +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  18 +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19 +DISCLAIMED. IN NO EVENT SHALL SEMTECH S.A. BE LIABLE FOR ANY
  20 +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  21 +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  22 +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  23 +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24 +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  25 +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
0 26 \ No newline at end of file
... ...
recepteur/SX1276Lib/debug/debug.h 0 → 100644
... ... @@ -0,0 +1,61 @@
  1 +/* Copyright (c) 2012 mbed.org, MIT License
  2 + *
  3 + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
  4 + * and associated documentation files (the "Software"), to deal in the Software without restriction,
  5 + * including without limitation the rights to use, copy, modify, merge, publish, distribute,
  6 + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
  7 + * furnished to do so, subject to the following conditions:
  8 + *
  9 + * The above copyright notice and this permission notice shall be included in all copies or
  10 + * substantial portions of the Software.
  11 + *
  12 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
  13 + * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  14 + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  15 + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  16 + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  17 + */
  18 +
  19 +#ifndef DEBUG_H
  20 +#define DEBUG_H
  21 +
  22 +/** @file debug.h */
  23 +
  24 +#ifndef NDEBUG
  25 +
  26 +#include <stdarg.h>
  27 +#include <stdio.h>
  28 +
  29 +/** Output a debug message
  30 + *
  31 + * @param format printf-style format string, followed by variables
  32 + */
  33 +static inline void debug(const char *format, ...) {
  34 + va_list args;
  35 + va_start(args, format);
  36 + vfprintf(stderr, format, args);
  37 + va_end(args);
  38 +}
  39 +
  40 +/** Conditionally output a debug message
  41 + *
  42 + * @param condition output only if condition is true
  43 + * @param format printf-style format string, followed by variables
  44 + */
  45 +static inline void debug_if(bool condition, const char *format, ...) {
  46 + if(condition) {
  47 + va_list args;
  48 + va_start(args, format);
  49 + vfprintf(stderr, format, args);
  50 + va_end(args);
  51 + }
  52 +}
  53 +
  54 +#else
  55 +
  56 +static inline void debug(const char *format, ...) {}
  57 +static inline void debug(bool condition, const char *format, ...) {}
  58 +
  59 +#endif
  60 +
  61 +#endif
... ...
recepteur/SX1276Lib/enums/enums.h 0 → 100644
... ... @@ -0,0 +1,131 @@
  1 +/*
  2 + / _____) _ | |
  3 +( (____ _____ ____ _| |_ _____ ____| |__
  4 + \____ \| ___ | (_ _) ___ |/ ___) _ \
  5 + _____) ) ____| | | || |_| ____( (___| | | |
  6 +(______/|_____)_|_|_| \__)_____)\____)_| |_|
  7 + (C) 2014 Semtech
  8 +
  9 +Description: -
  10 +
  11 +License: Revised BSD License, see LICENSE.TXT file include in the project
  12 +
  13 +Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin
  14 +*/
  15 +#ifndef __ENUMS_H__
  16 +#define __ENUMS_H__
  17 +
  18 +/*!
  19 + * Radio driver internal state machine states definition
  20 + */
  21 +typedef enum RadioState
  22 +{
  23 + RF_IDLE = 0,
  24 + RF_RX_RUNNING,
  25 + RF_TX_RUNNING,
  26 + RF_CAD,
  27 +}RadioState_t;
  28 +
  29 +/*!
  30 + * Type of the modem. [LORA / FSK]
  31 + */
  32 +typedef enum ModemType
  33 +{
  34 + MODEM_FSK = 0,
  35 + MODEM_LORA
  36 +}RadioModems_t;
  37 +
  38 +/*!
  39 + * Type of the supported board. [SX1276MB1MAS / SX1276MB1LAS]
  40 + */
  41 +typedef enum BoardType
  42 +{
  43 + SX1276MB1MAS = 0,
  44 + SX1276MB1LAS,
  45 + UNKNOWN
  46 +}BoardType_t;
  47 +
  48 +/*!
  49 + * Radio FSK modem parameters
  50 + */
  51 +typedef struct
  52 +{
  53 + int8_t Power;
  54 + uint32_t Fdev;
  55 + uint32_t Bandwidth;
  56 + uint32_t BandwidthAfc;
  57 + uint32_t Datarate;
  58 + uint16_t PreambleLen;
  59 + bool FixLen;
  60 + uint8_t PayloadLen;
  61 + bool CrcOn;
  62 + bool IqInverted;
  63 + bool RxContinuous;
  64 + uint32_t TxTimeout;
  65 + uint32_t RxSingleTimeout;
  66 +}RadioFskSettings_t;
  67 +
  68 +/*!
  69 + * Radio FSK packet handler state
  70 + */
  71 +typedef struct
  72 +{
  73 + uint8_t PreambleDetected;
  74 + uint8_t SyncWordDetected;
  75 + int8_t RssiValue;
  76 + int32_t AfcValue;
  77 + uint8_t RxGain;
  78 + uint16_t Size;
  79 + uint16_t NbBytes;
  80 + uint8_t FifoThresh;
  81 + uint8_t ChunkSize;
  82 +}RadioFskPacketHandler_t;
  83 +
  84 +/*!
  85 + * Radio LoRa modem parameters
  86 + */
  87 +typedef struct
  88 +{
  89 + int8_t Power;
  90 + uint32_t Bandwidth;
  91 + uint32_t Datarate;
  92 + bool LowDatarateOptimize;
  93 + uint8_t Coderate;
  94 + uint16_t PreambleLen;
  95 + bool FixLen;
  96 + uint8_t PayloadLen;
  97 + bool CrcOn;
  98 + bool FreqHopOn;
  99 + uint8_t HopPeriod;
  100 + bool IqInverted;
  101 + bool RxContinuous;
  102 + uint32_t TxTimeout;
  103 + bool PublicNetwork;
  104 +}RadioLoRaSettings_t;
  105 +
  106 +/*!
  107 + * Radio LoRa packet handler state
  108 + */
  109 +typedef struct
  110 +{
  111 + int8_t SnrValue;
  112 + int8_t RssiValue;
  113 + uint8_t Size;
  114 +}RadioLoRaPacketHandler_t;
  115 +
  116 +/*!
  117 + * Radio Settings
  118 + */
  119 +typedef struct
  120 +{
  121 + RadioState State;
  122 + ModemType Modem;
  123 + uint32_t Channel;
  124 + RadioFskSettings_t Fsk;
  125 + RadioFskPacketHandler_t FskPacketHandler;
  126 + RadioLoRaSettings_t LoRa;
  127 + RadioLoRaPacketHandler_t LoRaPacketHandler;
  128 +}RadioSettings_t;
  129 +
  130 +
  131 +#endif //__ENUMS_H__
... ...
recepteur/SX1276Lib/radio/radio.cpp 0 → 100644
... ... @@ -0,0 +1,20 @@
  1 +/*
  2 + / _____) _ | |
  3 +( (____ _____ ____ _| |_ _____ ____| |__
  4 + \____ \| ___ | (_ _) ___ |/ ___) _ \
  5 + _____) ) ____| | | || |_| ____( (___| | | |
  6 +(______/|_____)_|_|_| \__)_____)\____)_| |_|
  7 + (C) 2014 Semtech
  8 +
  9 +Description: Interface for the radios, contains the main functions that a radio needs, and 5 callback functions
  10 +
  11 +License: Revised BSD License, see LICENSE.TXT file include in the project
  12 +
  13 +Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin
  14 +*/
  15 +#include "radio.h"
  16 +
  17 +Radio::Radio( RadioEvents_t *events )
  18 +{
  19 + this->RadioEvents = events;
  20 +}
... ...
recepteur/SX1276Lib/radio/radio.h 0 → 100644
... ... @@ -0,0 +1,337 @@
  1 +/*
  2 + / _____) _ | |
  3 +( (____ _____ ____ _| |_ _____ ____| |__
  4 + \____ \| ___ | (_ _) ___ |/ ___) _ \
  5 + _____) ) ____| | | || |_| ____( (___| | | |
  6 +(______/|_____)_|_|_| \__)_____)\____)_| |_|
  7 + (C) 2014 Semtech
  8 +
  9 +Description: Interface for the radios, contains the main functions that a radio needs, and 5 callback functions
  10 +
  11 +License: Revised BSD License, see LICENSE.TXT file include in the project
  12 +
  13 +Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin
  14 +*/
  15 +#ifndef __RADIO_H__
  16 +#define __RADIO_H__
  17 +
  18 +#include "mbed.h"
  19 +
  20 +#include "./enums/enums.h"
  21 +
  22 +/*!
  23 + * @brief Radio driver callback functions
  24 + */
  25 +typedef struct
  26 +{
  27 + /*!
  28 + * @brief Tx Done callback prototype.
  29 + */
  30 + void ( *TxDone )( void );
  31 + /*!
  32 + * @brief Tx Timeout callback prototype.
  33 + */
  34 + void ( *TxTimeout )( void );
  35 + /*!
  36 + * @brief Rx Done callback prototype.
  37 + *
  38 + * @param [IN] payload Received buffer pointer
  39 + * @param [IN] size Received buffer size
  40 + * @param [IN] rssi RSSI value computed while receiving the frame [dBm]
  41 + * @param [IN] snr Raw SNR value given by the radio hardware
  42 + * FSK : N/A ( set to 0 )
  43 + * LoRa: SNR value in dB
  44 + */
  45 + void ( *RxDone )( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr );
  46 + /*!
  47 + * @brief Rx Timeout callback prototype.
  48 + */
  49 + void ( *RxTimeout )( void );
  50 + /*!
  51 + * @brief Rx Error callback prototype.
  52 + */
  53 + void ( *RxError )( void );
  54 + /*!
  55 + * \brief FHSS Change Channel callback prototype.
  56 + *
  57 + * \param [IN] currentChannel Index number of the current channel
  58 + */
  59 + void ( *FhssChangeChannel )( uint8_t currentChannel );
  60 + /*!
  61 + * @brief CAD Done callback prototype.
  62 + *
  63 + * @param [IN] channelDetected Channel Activity detected during the CAD
  64 + */
  65 + void ( *CadDone ) ( bool channelActivityDetected );
  66 +}RadioEvents_t;
  67 +
  68 +/*!
  69 + * Interface for the radios, contains the main functions that a radio needs, and 5 callback functions
  70 + */
  71 +class Radio
  72 +{
  73 +protected:
  74 + RadioEvents_t* RadioEvents;
  75 +
  76 +public:
  77 + //-------------------------------------------------------------------------
  78 + // Constructor
  79 + //-------------------------------------------------------------------------
  80 + /*!
  81 + * @brief Constructor of the radio object, the parameters are the callback functions described in the header.
  82 + *
  83 + * @param [IN] events Structure containing the driver callback functions
  84 + */
  85 + Radio( RadioEvents_t *events );
  86 + virtual ~Radio( ) {};
  87 +
  88 + //-------------------------------------------------------------------------
  89 + // Pure virtual functions
  90 + //-------------------------------------------------------------------------
  91 + /*!
  92 + * @brief Initializes the radio
  93 + *
  94 + * @param [IN] events Structure containing the driver callback functions
  95 + */
  96 + virtual void Init( RadioEvents_t *events ) = 0;
  97 + /*!
  98 + * @brief Return current radio status
  99 + *
  100 + * @param status Radio status.[RF_IDLE, RF_RX_RUNNING, RF_TX_RUNNING]
  101 + */
  102 + virtual RadioState GetStatus( void ) = 0;
  103 + /*!
  104 + * @brief Configures the radio with the given modem
  105 + *
  106 + * @param [IN] modem Modem to be used [0: FSK, 1: LoRa]
  107 + */
  108 + virtual void SetModem( RadioModems_t modem ) = 0;
  109 + /*!
  110 + * @brief Sets the channel frequency
  111 + *
  112 + * @param [IN] freq Channel RF frequency
  113 + */
  114 + virtual void SetChannel( uint32_t freq ) = 0;
  115 + /*!
  116 + * @brief Sets the channels configuration
  117 + *
  118 + * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
  119 + * @param [IN] freq Channel RF frequency
  120 + * @param [IN] rssiThresh RSSI threshold
  121 + *
  122 + * @retval isFree [true: Channel is free, false: Channel is not free]
  123 + */
  124 + virtual bool IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh ) = 0;
  125 + /*!
  126 + * @brief Generates a 32 bits random value based on the RSSI readings
  127 + *
  128 + * \remark This function sets the radio in LoRa modem mode and disables
  129 + * all interrupts.
  130 + * After calling this function either Radio.SetRxConfig or
  131 + * Radio.SetTxConfig functions must be called.
  132 + *
  133 + * @retval randomValue 32 bits random value
  134 + */
  135 + virtual uint32_t Random( void )= 0;
  136 + /*!
  137 + * @brief Sets the reception parameters
  138 + *
  139 + * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
  140 + * @param [IN] bandwidth Sets the bandwidth
  141 + * FSK : >= 2600 and <= 250000 Hz
  142 + * LoRa: [0: 125 kHz, 1: 250 kHz,
  143 + * 2: 500 kHz, 3: Reserved]
  144 + * @param [IN] datarate Sets the Datarate
  145 + * FSK : 600..300000 bits/s
  146 + * LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
  147 + * 10: 1024, 11: 2048, 12: 4096 chips]
  148 + * @param [IN] coderate Sets the coding rate ( LoRa only )
  149 + * FSK : N/A ( set to 0 )
  150 + * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
  151 + * @param [IN] bandwidthAfc Sets the AFC Bandwidth ( FSK only )
  152 + * FSK : >= 2600 and <= 250000 Hz
  153 + * LoRa: N/A ( set to 0 )
  154 + * @param [IN] preambleLen Sets the Preamble length ( LoRa only )
  155 + * FSK : N/A ( set to 0 )
  156 + * LoRa: Length in symbols ( the hardware adds 4 more symbols )
  157 + * @param [IN] symbTimeout Sets the RxSingle timeout value
  158 + * FSK : timeout number of bytes
  159 + * LoRa: timeout in symbols
  160 + * @param [IN] fixLen Fixed length packets [0: variable, 1: fixed]
  161 + * @param [IN] payloadLen Sets payload length when fixed lenght is used
  162 + * @param [IN] crcOn Enables/Disables the CRC [0: OFF, 1: ON]
  163 + * @param [IN] freqHopOn Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only)
  164 + * @param [IN] hopPeriod Number of symbols bewteen each hop (LoRa only)
  165 + * @param [IN] iqInverted Inverts IQ signals ( LoRa only )
  166 + * FSK : N/A ( set to 0 )
  167 + * LoRa: [0: not inverted, 1: inverted]
  168 + * @param [IN] rxContinuous Sets the reception in continuous mode
  169 + * [false: single mode, true: continuous mode]
  170 + */
  171 + virtual void SetRxConfig ( RadioModems_t modem, uint32_t bandwidth,
  172 + uint32_t datarate, uint8_t coderate,
  173 + uint32_t bandwidthAfc, uint16_t preambleLen,
  174 + uint16_t symbTimeout, bool fixLen,
  175 + uint8_t payloadLen,
  176 + bool crcOn, bool freqHopOn, uint8_t hopPeriod,
  177 + bool iqInverted, bool rxContinuous ) = 0;
  178 + /*!
  179 + * @brief Sets the transmission parameters
  180 + *
  181 + * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
  182 + * @param [IN] power Sets the output power [dBm]
  183 + * @param [IN] fdev Sets the frequency deviation ( FSK only )
  184 + * FSK : [Hz]
  185 + * LoRa: 0
  186 + * @param [IN] bandwidth Sets the bandwidth ( LoRa only )
  187 + * FSK : 0
  188 + * LoRa: [0: 125 kHz, 1: 250 kHz,
  189 + * 2: 500 kHz, 3: Reserved]
  190 + * @param [IN] datarate Sets the Datarate
  191 + * FSK : 600..300000 bits/s
  192 + * LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
  193 + * 10: 1024, 11: 2048, 12: 4096 chips]
  194 + * @param [IN] coderate Sets the coding rate ( LoRa only )
  195 + * FSK : N/A ( set to 0 )
  196 + * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
  197 + * @param [IN] preambleLen Sets the preamble length
  198 + * @param [IN] fixLen Fixed length packets [0: variable, 1: fixed]
  199 + * @param [IN] crcOn Enables disables the CRC [0: OFF, 1: ON]
  200 + * @param [IN] freqHopOn Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only)
  201 + * @param [IN] hopPeriod Number of symbols bewteen each hop (LoRa only)
  202 + * @param [IN] iqInverted Inverts IQ signals ( LoRa only )
  203 + * FSK : N/A ( set to 0 )
  204 + * LoRa: [0: not inverted, 1: inverted]
  205 + * @param [IN] timeout Transmission timeout [us]
  206 + */
  207 + virtual void SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
  208 + uint32_t bandwidth, uint32_t datarate,
  209 + uint8_t coderate, uint16_t preambleLen,
  210 + bool fixLen, bool crcOn, bool freqHopOn,
  211 + uint8_t hopPeriod, bool iqInverted, uint32_t timeout ) = 0;
  212 + /*!
  213 + * @brief Checks if the given RF frequency is supported by the hardware
  214 + *
  215 + * @param [IN] frequency RF frequency to be checked
  216 + * @retval isSupported [true: supported, false: unsupported]
  217 + */
  218 + virtual bool CheckRfFrequency( uint32_t frequency ) = 0;
  219 + /*!
  220 + * @brief Computes the packet time on air for the given payload
  221 + *
  222 + * \Remark Can only be called once SetRxConfig or SetTxConfig have been called
  223 + *
  224 + * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
  225 + * @param [IN] pktLen Packet payload length
  226 + *
  227 + * @retval airTime Computed airTime for the given packet payload length
  228 + */
  229 + virtual uint32_t TimeOnAir ( RadioModems_t modem, uint8_t pktLen ) = 0;
  230 + /*!
  231 + * @brief Sends the buffer of size. Prepares the packet to be sent and sets
  232 + * the radio in transmission
  233 + *
  234 + * @param [IN]: buffer Buffer pointer
  235 + * @param [IN]: size Buffer size
  236 + */
  237 + virtual void Send( uint8_t *buffer, uint8_t size ) = 0;
  238 + /*!
  239 + * @brief Sets the radio in sleep mode
  240 + */
  241 + virtual void Sleep( void ) = 0;
  242 + /*!
  243 + * @brief Sets the radio in standby mode
  244 + */
  245 + virtual void Standby( void ) = 0;
  246 + /*!
  247 + * @brief Sets the radio in CAD mode
  248 + */
  249 + virtual void StartCad( void ) = 0;
  250 + /*!
  251 + * @brief Sets the radio in reception mode for the given time
  252 + * @param [IN] timeout Reception timeout [us]
  253 + * [0: continuous, others timeout]
  254 + */
  255 + virtual void Rx( uint32_t timeout ) = 0;
  256 + /*!
  257 + * @brief Sets the radio in transmission mode for the given time
  258 + * @param [IN] timeout Transmission timeout [us]
  259 + * [0: continuous, others timeout]
  260 + */
  261 + virtual void Tx( uint32_t timeout ) = 0;
  262 + /*!
  263 + * @brief Sets the radio in continuous wave transmission mode
  264 + *
  265 + * @param [IN]: freq Channel RF frequency
  266 + * @param [IN]: power Sets the output power [dBm]
  267 + * @param [IN]: time Transmission mode timeout [s]
  268 + */
  269 + virtual void SetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time ) = 0;
  270 + /*!
  271 + * @brief Reads the current RSSI value
  272 + *
  273 + * @retval rssiValue Current RSSI value in [dBm]
  274 + */
  275 + virtual int16_t GetRssi ( RadioModems_t modem ) = 0;
  276 + /*!
  277 + * @brief Writes the radio register at the specified address
  278 + *
  279 + * @param [IN]: addr Register address
  280 + * @param [IN]: data New register value
  281 + */
  282 + virtual void Write ( uint8_t addr, uint8_t data ) = 0;
  283 + /*!
  284 + * @brief Reads the radio register at the specified address
  285 + *
  286 + * @param [IN]: addr Register address
  287 + * @retval data Register value
  288 + */
  289 + virtual uint8_t Read ( uint8_t addr ) = 0;
  290 + /*!
  291 + * @brief Writes multiple radio registers starting at address
  292 + *
  293 + * @param [IN] addr First Radio register address
  294 + * @param [IN] buffer Buffer containing the new register's values
  295 + * @param [IN] size Number of registers to be written
  296 + */
  297 + virtual void Write( uint8_t addr, uint8_t *buffer, uint8_t size ) = 0;
  298 + /*!
  299 + * @brief Reads multiple radio registers starting at address
  300 + *
  301 + * @param [IN] addr First Radio register address
  302 + * @param [OUT] buffer Buffer where to copy the registers data
  303 + * @param [IN] size Number of registers to be read
  304 + */
  305 + virtual void Read ( uint8_t addr, uint8_t *buffer, uint8_t size ) = 0;
  306 + /*!
  307 + * @brief Writes the buffer contents to the Radio FIFO
  308 + *
  309 + * @param [IN] buffer Buffer containing data to be put on the FIFO.
  310 + * @param [IN] size Number of bytes to be written to the FIFO
  311 + */
  312 + virtual void WriteFifo( uint8_t *buffer, uint8_t size ) = 0;
  313 + /*!
  314 + * @brief Reads the contents of the Radio FIFO
  315 + *
  316 + * @param [OUT] buffer Buffer where to copy the FIFO read data.
  317 + * @param [IN] size Number of bytes to be read from the FIFO
  318 + */
  319 + virtual void ReadFifo( uint8_t *buffer, uint8_t size ) = 0;
  320 + /*!
  321 + * @brief Sets the maximum payload length.
  322 + *
  323 + * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
  324 + * @param [IN] max Maximum payload length in bytes
  325 + */
  326 + virtual void SetMaxPayloadLength( RadioModems_t modem, uint8_t max ) = 0;
  327 + /*!
  328 + * @brief Sets the network to public or private. Updates the sync byte.
  329 + *
  330 + * @remark Applies to LoRa modem only
  331 + *
  332 + * @param [IN] enable if true, it enables a public network
  333 + */
  334 + virtual void SetPublicNetwork( bool enable ) = 0;
  335 +};
  336 +
  337 +#endif // __RADIO_H__
... ...
recepteur/SX1276Lib/registers/sx1276Regs-Fsk.h 0 → 100644
... ... @@ -0,0 +1,1134 @@
  1 +/*
  2 + / _____) _ | |
  3 +( (____ _____ ____ _| |_ _____ ____| |__
  4 + \____ \| ___ | (_ _) ___ |/ ___) _ \
  5 + _____) ) ____| | | || |_| ____( (___| | | |
  6 +(______/|_____)_|_|_| \__)_____)\____)_| |_|
  7 + (C) 2014 Semtech
  8 +
  9 +Description: SX1276 FSK modem registers and bits definitions
  10 +
  11 +License: Revised BSD License, see LICENSE.TXT file include in the project
  12 +
  13 +Maintainer: Miguel Luis and Gregory Cristian
  14 +*/
  15 +#ifndef __SX1276_REGS_FSK_H__
  16 +#define __SX1276_REGS_FSK_H__
  17 +
  18 +/*!
  19 + * ============================================================================
  20 + * SX1276 Internal registers Address
  21 + * ============================================================================
  22 + */
  23 +#define REG_FIFO 0x00
  24 +// Common settings
  25 +#define REG_OPMODE 0x01
  26 +#define REG_BITRATEMSB 0x02
  27 +#define REG_BITRATELSB 0x03
  28 +#define REG_FDEVMSB 0x04
  29 +#define REG_FDEVLSB 0x05
  30 +#define REG_FRFMSB 0x06
  31 +#define REG_FRFMID 0x07
  32 +#define REG_FRFLSB 0x08
  33 +// Tx settings
  34 +#define REG_PACONFIG 0x09
  35 +#define REG_PARAMP 0x0A
  36 +#define REG_OCP 0x0B
  37 +// Rx settings
  38 +#define REG_LNA 0x0C
  39 +#define REG_RXCONFIG 0x0D
  40 +#define REG_RSSICONFIG 0x0E
  41 +#define REG_RSSICOLLISION 0x0F
  42 +#define REG_RSSITHRESH 0x10
  43 +#define REG_RSSIVALUE 0x11
  44 +#define REG_RXBW 0x12
  45 +#define REG_AFCBW 0x13
  46 +#define REG_OOKPEAK 0x14
  47 +#define REG_OOKFIX 0x15
  48 +#define REG_OOKAVG 0x16
  49 +#define REG_RES17 0x17
  50 +#define REG_RES18 0x18
  51 +#define REG_RES19 0x19
  52 +#define REG_AFCFEI 0x1A
  53 +#define REG_AFCMSB 0x1B
  54 +#define REG_AFCLSB 0x1C
  55 +#define REG_FEIMSB 0x1D
  56 +#define REG_FEILSB 0x1E
  57 +#define REG_PREAMBLEDETECT 0x1F
  58 +#define REG_RXTIMEOUT1 0x20
  59 +#define REG_RXTIMEOUT2 0x21
  60 +#define REG_RXTIMEOUT3 0x22
  61 +#define REG_RXDELAY 0x23
  62 +// Oscillator settings
  63 +#define REG_OSC 0x24
  64 +// Packet handler settings
  65 +#define REG_PREAMBLEMSB 0x25
  66 +#define REG_PREAMBLELSB 0x26
  67 +#define REG_SYNCCONFIG 0x27
  68 +#define REG_SYNCVALUE1 0x28
  69 +#define REG_SYNCVALUE2 0x29
  70 +#define REG_SYNCVALUE3 0x2A
  71 +#define REG_SYNCVALUE4 0x2B
  72 +#define REG_SYNCVALUE5 0x2C
  73 +#define REG_SYNCVALUE6 0x2D
  74 +#define REG_SYNCVALUE7 0x2E
  75 +#define REG_SYNCVALUE8 0x2F
  76 +#define REG_PACKETCONFIG1 0x30
  77 +#define REG_PACKETCONFIG2 0x31
  78 +#define REG_PAYLOADLENGTH 0x32
  79 +#define REG_NODEADRS 0x33
  80 +#define REG_BROADCASTADRS 0x34
  81 +#define REG_FIFOTHRESH 0x35
  82 +// SM settings
  83 +#define REG_SEQCONFIG1 0x36
  84 +#define REG_SEQCONFIG2 0x37
  85 +#define REG_TIMERRESOL 0x38
  86 +#define REG_TIMER1COEF 0x39
  87 +#define REG_TIMER2COEF 0x3A
  88 +// Service settings
  89 +#define REG_IMAGECAL 0x3B
  90 +#define REG_TEMP 0x3C
  91 +#define REG_LOWBAT 0x3D
  92 +// Status
  93 +#define REG_IRQFLAGS1 0x3E
  94 +#define REG_IRQFLAGS2 0x3F
  95 +// I/O settings
  96 +#define REG_DIOMAPPING1 0x40
  97 +#define REG_DIOMAPPING2 0x41
  98 +// Version
  99 +#define REG_VERSION 0x42
  100 +// Additional settings
  101 +#define REG_PLLHOP 0x44
  102 +#define REG_TCXO 0x4B
  103 +#define REG_PADAC 0x4D
  104 +#define REG_FORMERTEMP 0x5B
  105 +#define REG_BITRATEFRAC 0x5D
  106 +#define REG_AGCREF 0x61
  107 +#define REG_AGCTHRESH1 0x62
  108 +#define REG_AGCTHRESH2 0x63
  109 +#define REG_AGCTHRESH3 0x64
  110 +#define REG_PLL 0x70
  111 +
  112 +/*!
  113 + * ============================================================================
  114 + * SX1276 FSK bits control definition
  115 + * ============================================================================
  116 + */
  117 +
  118 +/*!
  119 + * RegFifo
  120 + */
  121 +
  122 +/*!
  123 + * RegOpMode
  124 + */
  125 +#define RF_OPMODE_LONGRANGEMODE_MASK 0x7F
  126 +#define RF_OPMODE_LONGRANGEMODE_OFF 0x00
  127 +#define RF_OPMODE_LONGRANGEMODE_ON 0x80
  128 +
  129 +#define RF_OPMODE_MODULATIONTYPE_MASK 0x9F
  130 +#define RF_OPMODE_MODULATIONTYPE_FSK 0x00 // Default
  131 +#define RF_OPMODE_MODULATIONTYPE_OOK 0x20
  132 +
  133 +#define RF_OPMODE_MODULATIONSHAPING_MASK 0xE7
  134 +#define RF_OPMODE_MODULATIONSHAPING_00 0x00 // Default
  135 +#define RF_OPMODE_MODULATIONSHAPING_01 0x08
  136 +#define RF_OPMODE_MODULATIONSHAPING_10 0x10
  137 +#define RF_OPMODE_MODULATIONSHAPING_11 0x18
  138 +
  139 +#define RF_OPMODE_MASK 0xF8
  140 +#define RF_OPMODE_SLEEP 0x00
  141 +#define RF_OPMODE_STANDBY 0x01 // Default
  142 +#define RF_OPMODE_SYNTHESIZER_TX 0x02
  143 +#define RF_OPMODE_TRANSMITTER 0x03
  144 +#define RF_OPMODE_SYNTHESIZER_RX 0x04
  145 +#define RF_OPMODE_RECEIVER 0x05
  146 +
  147 +/*!
  148 + * RegBitRate (bits/sec)
  149 + */
  150 +#define RF_BITRATEMSB_1200_BPS 0x68
  151 +#define RF_BITRATELSB_1200_BPS 0x2B
  152 +#define RF_BITRATEMSB_2400_BPS 0x34
  153 +#define RF_BITRATELSB_2400_BPS 0x15
  154 +#define RF_BITRATEMSB_4800_BPS 0x1A // Default
  155 +#define RF_BITRATELSB_4800_BPS 0x0B // Default
  156 +#define RF_BITRATEMSB_9600_BPS 0x0D
  157 +#define RF_BITRATELSB_9600_BPS 0x05
  158 +#define RF_BITRATEMSB_15000_BPS 0x08
  159 +#define RF_BITRATELSB_15000_BPS 0x55
  160 +#define RF_BITRATEMSB_19200_BPS 0x06
  161 +#define RF_BITRATELSB_19200_BPS 0x83
  162 +#define RF_BITRATEMSB_38400_BPS 0x03
  163 +#define RF_BITRATELSB_38400_BPS 0x41
  164 +#define RF_BITRATEMSB_76800_BPS 0x01
  165 +#define RF_BITRATELSB_76800_BPS 0xA1
  166 +#define RF_BITRATEMSB_153600_BPS 0x00
  167 +#define RF_BITRATELSB_153600_BPS 0xD0
  168 +#define RF_BITRATEMSB_57600_BPS 0x02
  169 +#define RF_BITRATELSB_57600_BPS 0x2C
  170 +#define RF_BITRATEMSB_115200_BPS 0x01
  171 +#define RF_BITRATELSB_115200_BPS 0x16
  172 +#define RF_BITRATEMSB_12500_BPS 0x0A
  173 +#define RF_BITRATELSB_12500_BPS 0x00
  174 +#define RF_BITRATEMSB_25000_BPS 0x05
  175 +#define RF_BITRATELSB_25000_BPS 0x00
  176 +#define RF_BITRATEMSB_50000_BPS 0x02
  177 +#define RF_BITRATELSB_50000_BPS 0x80
  178 +#define RF_BITRATEMSB_100000_BPS 0x01
  179 +#define RF_BITRATELSB_100000_BPS 0x40
  180 +#define RF_BITRATEMSB_150000_BPS 0x00
  181 +#define RF_BITRATELSB_150000_BPS 0xD5
  182 +#define RF_BITRATEMSB_200000_BPS 0x00
  183 +#define RF_BITRATELSB_200000_BPS 0xA0
  184 +#define RF_BITRATEMSB_250000_BPS 0x00
  185 +#define RF_BITRATELSB_250000_BPS 0x80
  186 +#define RF_BITRATEMSB_32768_BPS 0x03
  187 +#define RF_BITRATELSB_32768_BPS 0xD1
  188 +
  189 +/*!
  190 + * RegFdev (Hz)
  191 + */
  192 +#define RF_FDEVMSB_2000_HZ 0x00
  193 +#define RF_FDEVLSB_2000_HZ 0x21
  194 +#define RF_FDEVMSB_5000_HZ 0x00 // Default
  195 +#define RF_FDEVLSB_5000_HZ 0x52 // Default
  196 +#define RF_FDEVMSB_10000_HZ 0x00
  197 +#define RF_FDEVLSB_10000_HZ 0xA4
  198 +#define RF_FDEVMSB_15000_HZ 0x00
  199 +#define RF_FDEVLSB_15000_HZ 0xF6
  200 +#define RF_FDEVMSB_20000_HZ 0x01
  201 +#define RF_FDEVLSB_20000_HZ 0x48
  202 +#define RF_FDEVMSB_25000_HZ 0x01
  203 +#define RF_FDEVLSB_25000_HZ 0x9A
  204 +#define RF_FDEVMSB_30000_HZ 0x01
  205 +#define RF_FDEVLSB_30000_HZ 0xEC
  206 +#define RF_FDEVMSB_35000_HZ 0x02
  207 +#define RF_FDEVLSB_35000_HZ 0x3D
  208 +#define RF_FDEVMSB_40000_HZ 0x02
  209 +#define RF_FDEVLSB_40000_HZ 0x8F
  210 +#define RF_FDEVMSB_45000_HZ 0x02
  211 +#define RF_FDEVLSB_45000_HZ 0xE1
  212 +#define RF_FDEVMSB_50000_HZ 0x03
  213 +#define RF_FDEVLSB_50000_HZ 0x33
  214 +#define RF_FDEVMSB_55000_HZ 0x03
  215 +#define RF_FDEVLSB_55000_HZ 0x85
  216 +#define RF_FDEVMSB_60000_HZ 0x03
  217 +#define RF_FDEVLSB_60000_HZ 0xD7
  218 +#define RF_FDEVMSB_65000_HZ 0x04
  219 +#define RF_FDEVLSB_65000_HZ 0x29
  220 +#define RF_FDEVMSB_70000_HZ 0x04
  221 +#define RF_FDEVLSB_70000_HZ 0x7B
  222 +#define RF_FDEVMSB_75000_HZ 0x04
  223 +#define RF_FDEVLSB_75000_HZ 0xCD
  224 +#define RF_FDEVMSB_80000_HZ 0x05
  225 +#define RF_FDEVLSB_80000_HZ 0x1F
  226 +#define RF_FDEVMSB_85000_HZ 0x05
  227 +#define RF_FDEVLSB_85000_HZ 0x71
  228 +#define RF_FDEVMSB_90000_HZ 0x05
  229 +#define RF_FDEVLSB_90000_HZ 0xC3
  230 +#define RF_FDEVMSB_95000_HZ 0x06
  231 +#define RF_FDEVLSB_95000_HZ 0x14
  232 +#define RF_FDEVMSB_100000_HZ 0x06
  233 +#define RF_FDEVLSB_100000_HZ 0x66
  234 +#define RF_FDEVMSB_110000_HZ 0x07
  235 +#define RF_FDEVLSB_110000_HZ 0x0A
  236 +#define RF_FDEVMSB_120000_HZ 0x07
  237 +#define RF_FDEVLSB_120000_HZ 0xAE
  238 +#define RF_FDEVMSB_130000_HZ 0x08
  239 +#define RF_FDEVLSB_130000_HZ 0x52
  240 +#define RF_FDEVMSB_140000_HZ 0x08
  241 +#define RF_FDEVLSB_140000_HZ 0xF6
  242 +#define RF_FDEVMSB_150000_HZ 0x09
  243 +#define RF_FDEVLSB_150000_HZ 0x9A
  244 +#define RF_FDEVMSB_160000_HZ 0x0A
  245 +#define RF_FDEVLSB_160000_HZ 0x3D
  246 +#define RF_FDEVMSB_170000_HZ 0x0A
  247 +#define RF_FDEVLSB_170000_HZ 0xE1
  248 +#define RF_FDEVMSB_180000_HZ 0x0B
  249 +#define RF_FDEVLSB_180000_HZ 0x85
  250 +#define RF_FDEVMSB_190000_HZ 0x0C
  251 +#define RF_FDEVLSB_190000_HZ 0x29
  252 +#define RF_FDEVMSB_200000_HZ 0x0C
  253 +#define RF_FDEVLSB_200000_HZ 0xCD
  254 +
  255 +/*!
  256 + * RegFrf (MHz)
  257 + */
  258 +#define RF_FRFMSB_863_MHZ 0xD7
  259 +#define RF_FRFMID_863_MHZ 0xC0
  260 +#define RF_FRFLSB_863_MHZ 0x00
  261 +#define RF_FRFMSB_864_MHZ 0xD8
  262 +#define RF_FRFMID_864_MHZ 0x00
  263 +#define RF_FRFLSB_864_MHZ 0x00
  264 +#define RF_FRFMSB_865_MHZ 0xD8
  265 +#define RF_FRFMID_865_MHZ 0x40
  266 +#define RF_FRFLSB_865_MHZ 0x00
  267 +#define RF_FRFMSB_866_MHZ 0xD8
  268 +#define RF_FRFMID_866_MHZ 0x80
  269 +#define RF_FRFLSB_866_MHZ 0x00
  270 +#define RF_FRFMSB_867_MHZ 0xD8
  271 +#define RF_FRFMID_867_MHZ 0xC0
  272 +#define RF_FRFLSB_867_MHZ 0x00
  273 +#define RF_FRFMSB_868_MHZ 0xD9
  274 +#define RF_FRFMID_868_MHZ 0x00
  275 +#define RF_FRFLSB_868_MHZ 0x00
  276 +#define RF_FRFMSB_869_MHZ 0xD9
  277 +#define RF_FRFMID_869_MHZ 0x40
  278 +#define RF_FRFLSB_869_MHZ 0x00
  279 +#define RF_FRFMSB_870_MHZ 0xD9
  280 +#define RF_FRFMID_870_MHZ 0x80
  281 +#define RF_FRFLSB_870_MHZ 0x00
  282 +
  283 +#define RF_FRFMSB_902_MHZ 0xE1
  284 +#define RF_FRFMID_902_MHZ 0x80
  285 +#define RF_FRFLSB_902_MHZ 0x00
  286 +#define RF_FRFMSB_903_MHZ 0xE1
  287 +#define RF_FRFMID_903_MHZ 0xC0
  288 +#define RF_FRFLSB_903_MHZ 0x00
  289 +#define RF_FRFMSB_904_MHZ 0xE2
  290 +#define RF_FRFMID_904_MHZ 0x00
  291 +#define RF_FRFLSB_904_MHZ 0x00
  292 +#define RF_FRFMSB_905_MHZ 0xE2
  293 +#define RF_FRFMID_905_MHZ 0x40
  294 +#define RF_FRFLSB_905_MHZ 0x00
  295 +#define RF_FRFMSB_906_MHZ 0xE2
  296 +#define RF_FRFMID_906_MHZ 0x80
  297 +#define RF_FRFLSB_906_MHZ 0x00
  298 +#define RF_FRFMSB_907_MHZ 0xE2
  299 +#define RF_FRFMID_907_MHZ 0xC0
  300 +#define RF_FRFLSB_907_MHZ 0x00
  301 +#define RF_FRFMSB_908_MHZ 0xE3
  302 +#define RF_FRFMID_908_MHZ 0x00
  303 +#define RF_FRFLSB_908_MHZ 0x00
  304 +#define RF_FRFMSB_909_MHZ 0xE3
  305 +#define RF_FRFMID_909_MHZ 0x40
  306 +#define RF_FRFLSB_909_MHZ 0x00
  307 +#define RF_FRFMSB_910_MHZ 0xE3
  308 +#define RF_FRFMID_910_MHZ 0x80
  309 +#define RF_FRFLSB_910_MHZ 0x00
  310 +#define RF_FRFMSB_911_MHZ 0xE3
  311 +#define RF_FRFMID_911_MHZ 0xC0
  312 +#define RF_FRFLSB_911_MHZ 0x00
  313 +#define RF_FRFMSB_912_MHZ 0xE4
  314 +#define RF_FRFMID_912_MHZ 0x00
  315 +#define RF_FRFLSB_912_MHZ 0x00
  316 +#define RF_FRFMSB_913_MHZ 0xE4
  317 +#define RF_FRFMID_913_MHZ 0x40
  318 +#define RF_FRFLSB_913_MHZ 0x00
  319 +#define RF_FRFMSB_914_MHZ 0xE4
  320 +#define RF_FRFMID_914_MHZ 0x80
  321 +#define RF_FRFLSB_914_MHZ 0x00
  322 +#define RF_FRFMSB_915_MHZ 0xE4 // Default
  323 +#define RF_FRFMID_915_MHZ 0xC0 // Default
  324 +#define RF_FRFLSB_915_MHZ 0x00 // Default
  325 +#define RF_FRFMSB_916_MHZ 0xE5
  326 +#define RF_FRFMID_916_MHZ 0x00
  327 +#define RF_FRFLSB_916_MHZ 0x00
  328 +#define RF_FRFMSB_917_MHZ 0xE5
  329 +#define RF_FRFMID_917_MHZ 0x40
  330 +#define RF_FRFLSB_917_MHZ 0x00
  331 +#define RF_FRFMSB_918_MHZ 0xE5
  332 +#define RF_FRFMID_918_MHZ 0x80
  333 +#define RF_FRFLSB_918_MHZ 0x00
  334 +#define RF_FRFMSB_919_MHZ 0xE5
  335 +#define RF_FRFMID_919_MHZ 0xC0
  336 +#define RF_FRFLSB_919_MHZ 0x00
  337 +#define RF_FRFMSB_920_MHZ 0xE6
  338 +#define RF_FRFMID_920_MHZ 0x00
  339 +#define RF_FRFLSB_920_MHZ 0x00
  340 +#define RF_FRFMSB_921_MHZ 0xE6
  341 +#define RF_FRFMID_921_MHZ 0x40
  342 +#define RF_FRFLSB_921_MHZ 0x00
  343 +#define RF_FRFMSB_922_MHZ 0xE6
  344 +#define RF_FRFMID_922_MHZ 0x80
  345 +#define RF_FRFLSB_922_MHZ 0x00
  346 +#define RF_FRFMSB_923_MHZ 0xE6
  347 +#define RF_FRFMID_923_MHZ 0xC0
  348 +#define RF_FRFLSB_923_MHZ 0x00
  349 +#define RF_FRFMSB_924_MHZ 0xE7
  350 +#define RF_FRFMID_924_MHZ 0x00
  351 +#define RF_FRFLSB_924_MHZ 0x00
  352 +#define RF_FRFMSB_925_MHZ 0xE7
  353 +#define RF_FRFMID_925_MHZ 0x40
  354 +#define RF_FRFLSB_925_MHZ 0x00
  355 +#define RF_FRFMSB_926_MHZ 0xE7
  356 +#define RF_FRFMID_926_MHZ 0x80
  357 +#define RF_FRFLSB_926_MHZ 0x00
  358 +#define RF_FRFMSB_927_MHZ 0xE7
  359 +#define RF_FRFMID_927_MHZ 0xC0
  360 +#define RF_FRFLSB_927_MHZ 0x00
  361 +#define RF_FRFMSB_928_MHZ 0xE8
  362 +#define RF_FRFMID_928_MHZ 0x00
  363 +#define RF_FRFLSB_928_MHZ 0x00
  364 +
  365 +/*!
  366 + * RegPaConfig
  367 + */
  368 +#define RF_PACONFIG_PASELECT_MASK 0x7F
  369 +#define RF_PACONFIG_PASELECT_PABOOST 0x80
  370 +#define RF_PACONFIG_PASELECT_RFO 0x00 // Default
  371 +
  372 +#define RF_PACONFIG_MAX_POWER_MASK 0x8F
  373 +
  374 +#define RF_PACONFIG_OUTPUTPOWER_MASK 0xF0
  375 +
  376 +/*!
  377 + * RegPaRamp
  378 + */
  379 +#define RF_PARAMP_MODULATIONSHAPING_MASK 0x9F
  380 +#define RF_PARAMP_MODULATIONSHAPING_00 0x00 // Default
  381 +#define RF_PARAMP_MODULATIONSHAPING_01 0x20
  382 +#define RF_PARAMP_MODULATIONSHAPING_10 0x40
  383 +#define RF_PARAMP_MODULATIONSHAPING_11 0x60
  384 +
  385 +#define RF_PARAMP_LOWPNTXPLL_MASK 0xEF
  386 +#define RF_PARAMP_LOWPNTXPLL_OFF 0x10
  387 +#define RF_PARAMP_LOWPNTXPLL_ON 0x00 // Default
  388 +
  389 +#define RF_PARAMP_MASK 0xF0
  390 +#define RF_PARAMP_3400_US 0x00
  391 +#define RF_PARAMP_2000_US 0x01
  392 +#define RF_PARAMP_1000_US 0x02
  393 +#define RF_PARAMP_0500_US 0x03
  394 +#define RF_PARAMP_0250_US 0x04
  395 +#define RF_PARAMP_0125_US 0x05
  396 +#define RF_PARAMP_0100_US 0x06
  397 +#define RF_PARAMP_0062_US 0x07
  398 +#define RF_PARAMP_0050_US 0x08
  399 +#define RF_PARAMP_0040_US 0x09 // Default
  400 +#define RF_PARAMP_0031_US 0x0A
  401 +#define RF_PARAMP_0025_US 0x0B
  402 +#define RF_PARAMP_0020_US 0x0C
  403 +#define RF_PARAMP_0015_US 0x0D
  404 +#define RF_PARAMP_0012_US 0x0E
  405 +#define RF_PARAMP_0010_US 0x0F
  406 +
  407 +/*!
  408 + * RegOcp
  409 + */
  410 +#define RF_OCP_MASK 0xDF
  411 +#define RF_OCP_ON 0x20 // Default
  412 +#define RF_OCP_OFF 0x00
  413 +
  414 +#define RF_OCP_TRIM_MASK 0xE0
  415 +#define RF_OCP_TRIM_045_MA 0x00
  416 +#define RF_OCP_TRIM_050_MA 0x01
  417 +#define RF_OCP_TRIM_055_MA 0x02
  418 +#define RF_OCP_TRIM_060_MA 0x03
  419 +#define RF_OCP_TRIM_065_MA 0x04
  420 +#define RF_OCP_TRIM_070_MA 0x05
  421 +#define RF_OCP_TRIM_075_MA 0x06
  422 +#define RF_OCP_TRIM_080_MA 0x07
  423 +#define RF_OCP_TRIM_085_MA 0x08
  424 +#define RF_OCP_TRIM_090_MA 0x09
  425 +#define RF_OCP_TRIM_095_MA 0x0A
  426 +#define RF_OCP_TRIM_100_MA 0x0B // Default
  427 +#define RF_OCP_TRIM_105_MA 0x0C
  428 +#define RF_OCP_TRIM_110_MA 0x0D
  429 +#define RF_OCP_TRIM_115_MA 0x0E
  430 +#define RF_OCP_TRIM_120_MA 0x0F
  431 +#define RF_OCP_TRIM_130_MA 0x10
  432 +#define RF_OCP_TRIM_140_MA 0x11
  433 +#define RF_OCP_TRIM_150_MA 0x12
  434 +#define RF_OCP_TRIM_160_MA 0x13
  435 +#define RF_OCP_TRIM_170_MA 0x14
  436 +#define RF_OCP_TRIM_180_MA 0x15
  437 +#define RF_OCP_TRIM_190_MA 0x16
  438 +#define RF_OCP_TRIM_200_MA 0x17
  439 +#define RF_OCP_TRIM_210_MA 0x18
  440 +#define RF_OCP_TRIM_220_MA 0x19
  441 +#define RF_OCP_TRIM_230_MA 0x1A
  442 +#define RF_OCP_TRIM_240_MA 0x1B
  443 +
  444 +/*!
  445 + * RegLna
  446 + */
  447 +#define RF_LNA_GAIN_MASK 0x1F
  448 +#define RF_LNA_GAIN_G1 0x20 // Default
  449 +#define RF_LNA_GAIN_G2 0x40
  450 +#define RF_LNA_GAIN_G3 0x60
  451 +#define RF_LNA_GAIN_G4 0x80
  452 +#define RF_LNA_GAIN_G5 0xA0
  453 +#define RF_LNA_GAIN_G6 0xC0
  454 +
  455 +#define RF_LNA_BOOST_MASK 0xFC
  456 +#define RF_LNA_BOOST_OFF 0x00 // Default
  457 +#define RF_LNA_BOOST_ON 0x03
  458 +
  459 +/*!
  460 + * RegRxConfig
  461 + */
  462 +#define RF_RXCONFIG_RESTARTRXONCOLLISION_MASK 0x7F
  463 +#define RF_RXCONFIG_RESTARTRXONCOLLISION_ON 0x80
  464 +#define RF_RXCONFIG_RESTARTRXONCOLLISION_OFF 0x00 // Default
  465 +
  466 +#define RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK 0x40 // Write only
  467 +
  468 +#define RF_RXCONFIG_RESTARTRXWITHPLLLOCK 0x20 // Write only
  469 +
  470 +#define RF_RXCONFIG_AFCAUTO_MASK 0xEF
  471 +#define RF_RXCONFIG_AFCAUTO_ON 0x10
  472 +#define RF_RXCONFIG_AFCAUTO_OFF 0x00 // Default
  473 +
  474 +#define RF_RXCONFIG_AGCAUTO_MASK 0xF7
  475 +#define RF_RXCONFIG_AGCAUTO_ON 0x08 // Default
  476 +#define RF_RXCONFIG_AGCAUTO_OFF 0x00
  477 +
  478 +#define RF_RXCONFIG_RXTRIGER_MASK 0xF8
  479 +#define RF_RXCONFIG_RXTRIGER_OFF 0x00
  480 +#define RF_RXCONFIG_RXTRIGER_RSSI 0x01
  481 +#define RF_RXCONFIG_RXTRIGER_PREAMBLEDETECT 0x06 // Default
  482 +#define RF_RXCONFIG_RXTRIGER_RSSI_PREAMBLEDETECT 0x07
  483 +
  484 +/*!
  485 + * RegRssiConfig
  486 + */
  487 +#define RF_RSSICONFIG_OFFSET_MASK 0x07
  488 +#define RF_RSSICONFIG_OFFSET_P_00_DB 0x00 // Default
  489 +#define RF_RSSICONFIG_OFFSET_P_01_DB 0x08
  490 +#define RF_RSSICONFIG_OFFSET_P_02_DB 0x10
  491 +#define RF_RSSICONFIG_OFFSET_P_03_DB 0x18
  492 +#define RF_RSSICONFIG_OFFSET_P_04_DB 0x20
  493 +#define RF_RSSICONFIG_OFFSET_P_05_DB 0x28
  494 +#define RF_RSSICONFIG_OFFSET_P_06_DB 0x30
  495 +#define RF_RSSICONFIG_OFFSET_P_07_DB 0x38
  496 +#define RF_RSSICONFIG_OFFSET_P_08_DB 0x40
  497 +#define RF_RSSICONFIG_OFFSET_P_09_DB 0x48
  498 +#define RF_RSSICONFIG_OFFSET_P_10_DB 0x50
  499 +#define RF_RSSICONFIG_OFFSET_P_11_DB 0x58
  500 +#define RF_RSSICONFIG_OFFSET_P_12_DB 0x60
  501 +#define RF_RSSICONFIG_OFFSET_P_13_DB 0x68
  502 +#define RF_RSSICONFIG_OFFSET_P_14_DB 0x70
  503 +#define RF_RSSICONFIG_OFFSET_P_15_DB 0x78
  504 +#define RF_RSSICONFIG_OFFSET_M_16_DB 0x80
  505 +#define RF_RSSICONFIG_OFFSET_M_15_DB 0x88
  506 +#define RF_RSSICONFIG_OFFSET_M_14_DB 0x90
  507 +#define RF_RSSICONFIG_OFFSET_M_13_DB 0x98
  508 +#define RF_RSSICONFIG_OFFSET_M_12_DB 0xA0
  509 +#define RF_RSSICONFIG_OFFSET_M_11_DB 0xA8
  510 +#define RF_RSSICONFIG_OFFSET_M_10_DB 0xB0
  511 +#define RF_RSSICONFIG_OFFSET_M_09_DB 0xB8
  512 +#define RF_RSSICONFIG_OFFSET_M_08_DB 0xC0
  513 +#define RF_RSSICONFIG_OFFSET_M_07_DB 0xC8
  514 +#define RF_RSSICONFIG_OFFSET_M_06_DB 0xD0
  515 +#define RF_RSSICONFIG_OFFSET_M_05_DB 0xD8
  516 +#define RF_RSSICONFIG_OFFSET_M_04_DB 0xE0
  517 +#define RF_RSSICONFIG_OFFSET_M_03_DB 0xE8
  518 +#define RF_RSSICONFIG_OFFSET_M_02_DB 0xF0
  519 +#define RF_RSSICONFIG_OFFSET_M_01_DB 0xF8
  520 +
  521 +#define RF_RSSICONFIG_SMOOTHING_MASK 0xF8
  522 +#define RF_RSSICONFIG_SMOOTHING_2 0x00
  523 +#define RF_RSSICONFIG_SMOOTHING_4 0x01
  524 +#define RF_RSSICONFIG_SMOOTHING_8 0x02 // Default
  525 +#define RF_RSSICONFIG_SMOOTHING_16 0x03
  526 +#define RF_RSSICONFIG_SMOOTHING_32 0x04
  527 +#define RF_RSSICONFIG_SMOOTHING_64 0x05
  528 +#define RF_RSSICONFIG_SMOOTHING_128 0x06
  529 +#define RF_RSSICONFIG_SMOOTHING_256 0x07
  530 +
  531 +/*!
  532 + * RegRssiCollision
  533 + */
  534 +#define RF_RSSICOLISION_THRESHOLD 0x0A // Default
  535 +
  536 +/*!
  537 + * RegRssiThresh
  538 + */
  539 +#define RF_RSSITHRESH_THRESHOLD 0xFF // Default
  540 +
  541 +/*!
  542 + * RegRssiValue (Read Only)
  543 + */
  544 +
  545 +/*!
  546 + * RegRxBw
  547 + */
  548 +#define RF_RXBW_MANT_MASK 0xE7
  549 +#define RF_RXBW_MANT_16 0x00
  550 +#define RF_RXBW_MANT_20 0x08
  551 +#define RF_RXBW_MANT_24 0x10 // Default
  552 +
  553 +#define RF_RXBW_EXP_MASK 0xF8
  554 +#define RF_RXBW_EXP_0 0x00
  555 +#define RF_RXBW_EXP_1 0x01
  556 +#define RF_RXBW_EXP_2 0x02
  557 +#define RF_RXBW_EXP_3 0x03
  558 +#define RF_RXBW_EXP_4 0x04
  559 +#define RF_RXBW_EXP_5 0x05 // Default
  560 +#define RF_RXBW_EXP_6 0x06
  561 +#define RF_RXBW_EXP_7 0x07
  562 +
  563 +/*!
  564 + * RegAfcBw
  565 + */
  566 +#define RF_AFCBW_MANTAFC_MASK 0xE7
  567 +#define RF_AFCBW_MANTAFC_16 0x00
  568 +#define RF_AFCBW_MANTAFC_20 0x08 // Default
  569 +#define RF_AFCBW_MANTAFC_24 0x10
  570 +
  571 +#define RF_AFCBW_EXPAFC_MASK 0xF8
  572 +#define RF_AFCBW_EXPAFC_0 0x00
  573 +#define RF_AFCBW_EXPAFC_1 0x01
  574 +#define RF_AFCBW_EXPAFC_2 0x02
  575 +#define RF_AFCBW_EXPAFC_3 0x03 // Default
  576 +#define RF_AFCBW_EXPAFC_4 0x04
  577 +#define RF_AFCBW_EXPAFC_5 0x05
  578 +#define RF_AFCBW_EXPAFC_6 0x06
  579 +#define RF_AFCBW_EXPAFC_7 0x07
  580 +
  581 +/*!
  582 + * RegOokPeak
  583 + */
  584 +#define RF_OOKPEAK_BITSYNC_MASK 0xDF // Default
  585 +#define RF_OOKPEAK_BITSYNC_ON 0x20 // Default
  586 +#define RF_OOKPEAK_BITSYNC_OFF 0x00
  587 +
  588 +#define RF_OOKPEAK_OOKTHRESHTYPE_MASK 0xE7
  589 +#define RF_OOKPEAK_OOKTHRESHTYPE_FIXED 0x00
  590 +#define RF_OOKPEAK_OOKTHRESHTYPE_PEAK 0x08 // Default
  591 +#define RF_OOKPEAK_OOKTHRESHTYPE_AVERAGE 0x10
  592 +
  593 +#define RF_OOKPEAK_OOKPEAKTHRESHSTEP_MASK 0xF8
  594 +#define RF_OOKPEAK_OOKPEAKTHRESHSTEP_0_5_DB 0x00 // Default
  595 +#define RF_OOKPEAK_OOKPEAKTHRESHSTEP_1_0_DB 0x01
  596 +#define RF_OOKPEAK_OOKPEAKTHRESHSTEP_1_5_DB 0x02
  597 +#define RF_OOKPEAK_OOKPEAKTHRESHSTEP_2_0_DB 0x03
  598 +#define RF_OOKPEAK_OOKPEAKTHRESHSTEP_3_0_DB 0x04
  599 +#define RF_OOKPEAK_OOKPEAKTHRESHSTEP_4_0_DB 0x05
  600 +#define RF_OOKPEAK_OOKPEAKTHRESHSTEP_5_0_DB 0x06
  601 +#define RF_OOKPEAK_OOKPEAKTHRESHSTEP_6_0_DB 0x07
  602 +
  603 +/*!
  604 + * RegOokFix
  605 + */
  606 +#define RF_OOKFIX_OOKFIXEDTHRESHOLD 0x0C // Default
  607 +
  608 +/*!
  609 + * RegOokAvg
  610 + */
  611 +#define RF_OOKAVG_OOKPEAKTHRESHDEC_MASK 0x1F
  612 +#define RF_OOKAVG_OOKPEAKTHRESHDEC_000 0x00 // Default
  613 +#define RF_OOKAVG_OOKPEAKTHRESHDEC_001 0x20
  614 +#define RF_OOKAVG_OOKPEAKTHRESHDEC_010 0x40
  615 +#define RF_OOKAVG_OOKPEAKTHRESHDEC_011 0x60
  616 +#define RF_OOKAVG_OOKPEAKTHRESHDEC_100 0x80
  617 +#define RF_OOKAVG_OOKPEAKTHRESHDEC_101 0xA0
  618 +#define RF_OOKAVG_OOKPEAKTHRESHDEC_110 0xC0
  619 +#define RF_OOKAVG_OOKPEAKTHRESHDEC_111 0xE0
  620 +
  621 +#define RF_OOKAVG_AVERAGEOFFSET_MASK 0xF3
  622 +#define RF_OOKAVG_AVERAGEOFFSET_0_DB 0x00 // Default
  623 +#define RF_OOKAVG_AVERAGEOFFSET_2_DB 0x04
  624 +#define RF_OOKAVG_AVERAGEOFFSET_4_DB 0x08
  625 +#define RF_OOKAVG_AVERAGEOFFSET_6_DB 0x0C
  626 +
  627 +#define RF_OOKAVG_OOKAVERAGETHRESHFILT_MASK 0xFC
  628 +#define RF_OOKAVG_OOKAVERAGETHRESHFILT_00 0x00
  629 +#define RF_OOKAVG_OOKAVERAGETHRESHFILT_01 0x01
  630 +#define RF_OOKAVG_OOKAVERAGETHRESHFILT_10 0x02 // Default
  631 +#define RF_OOKAVG_OOKAVERAGETHRESHFILT_11 0x03
  632 +
  633 +/*!
  634 + * RegAfcFei
  635 + */
  636 +#define RF_AFCFEI_AGCSTART 0x10
  637 +
  638 +#define RF_AFCFEI_AFCCLEAR 0x02
  639 +
  640 +#define RF_AFCFEI_AFCAUTOCLEAR_MASK 0xFE
  641 +#define RF_AFCFEI_AFCAUTOCLEAR_ON 0x01
  642 +#define RF_AFCFEI_AFCAUTOCLEAR_OFF 0x00 // Default
  643 +
  644 +/*!
  645 + * RegAfcMsb (Read Only)
  646 + */
  647 +
  648 +/*!
  649 + * RegAfcLsb (Read Only)
  650 + */
  651 +
  652 +/*!
  653 + * RegFeiMsb (Read Only)
  654 + */
  655 +
  656 +/*!
  657 + * RegFeiLsb (Read Only)
  658 + */
  659 +
  660 +/*!
  661 + * RegPreambleDetect
  662 + */
  663 +#define RF_PREAMBLEDETECT_DETECTOR_MASK 0x7F
  664 +#define RF_PREAMBLEDETECT_DETECTOR_ON 0x80 // Default
  665 +#define RF_PREAMBLEDETECT_DETECTOR_OFF 0x00
  666 +
  667 +#define RF_PREAMBLEDETECT_DETECTORSIZE_MASK 0x9F
  668 +#define RF_PREAMBLEDETECT_DETECTORSIZE_1 0x00
  669 +#define RF_PREAMBLEDETECT_DETECTORSIZE_2 0x20 // Default
  670 +#define RF_PREAMBLEDETECT_DETECTORSIZE_3 0x40
  671 +#define RF_PREAMBLEDETECT_DETECTORSIZE_4 0x60
  672 +
  673 +#define RF_PREAMBLEDETECT_DETECTORTOL_MASK 0xE0
  674 +#define RF_PREAMBLEDETECT_DETECTORTOL_0 0x00
  675 +#define RF_PREAMBLEDETECT_DETECTORTOL_1 0x01
  676 +#define RF_PREAMBLEDETECT_DETECTORTOL_2 0x02
  677 +#define RF_PREAMBLEDETECT_DETECTORTOL_3 0x03
  678 +#define RF_PREAMBLEDETECT_DETECTORTOL_4 0x04
  679 +#define RF_PREAMBLEDETECT_DETECTORTOL_5 0x05
  680 +#define RF_PREAMBLEDETECT_DETECTORTOL_6 0x06
  681 +#define RF_PREAMBLEDETECT_DETECTORTOL_7 0x07
  682 +#define RF_PREAMBLEDETECT_DETECTORTOL_8 0x08
  683 +#define RF_PREAMBLEDETECT_DETECTORTOL_9 0x09
  684 +#define RF_PREAMBLEDETECT_DETECTORTOL_10 0x0A // Default
  685 +#define RF_PREAMBLEDETECT_DETECTORTOL_11 0x0B
  686 +#define RF_PREAMBLEDETECT_DETECTORTOL_12 0x0C
  687 +#define RF_PREAMBLEDETECT_DETECTORTOL_13 0x0D
  688 +#define RF_PREAMBLEDETECT_DETECTORTOL_14 0x0E
  689 +#define RF_PREAMBLEDETECT_DETECTORTOL_15 0x0F
  690 +#define RF_PREAMBLEDETECT_DETECTORTOL_16 0x10
  691 +#define RF_PREAMBLEDETECT_DETECTORTOL_17 0x11
  692 +#define RF_PREAMBLEDETECT_DETECTORTOL_18 0x12
  693 +#define RF_PREAMBLEDETECT_DETECTORTOL_19 0x13
  694 +#define RF_PREAMBLEDETECT_DETECTORTOL_20 0x14
  695 +#define RF_PREAMBLEDETECT_DETECTORTOL_21 0x15
  696 +#define RF_PREAMBLEDETECT_DETECTORTOL_22 0x16
  697 +#define RF_PREAMBLEDETECT_DETECTORTOL_23 0x17
  698 +#define RF_PREAMBLEDETECT_DETECTORTOL_24 0x18
  699 +#define RF_PREAMBLEDETECT_DETECTORTOL_25 0x19
  700 +#define RF_PREAMBLEDETECT_DETECTORTOL_26 0x1A
  701 +#define RF_PREAMBLEDETECT_DETECTORTOL_27 0x1B
  702 +#define RF_PREAMBLEDETECT_DETECTORTOL_28 0x1C
  703 +#define RF_PREAMBLEDETECT_DETECTORTOL_29 0x1D
  704 +#define RF_PREAMBLEDETECT_DETECTORTOL_30 0x1E
  705 +#define RF_PREAMBLEDETECT_DETECTORTOL_31 0x1F
  706 +
  707 +/*!
  708 + * RegRxTimeout1
  709 + */
  710 +#define RF_RXTIMEOUT1_TIMEOUTRXRSSI 0x00 // Default
  711 +
  712 +/*!
  713 + * RegRxTimeout2
  714 + */
  715 +#define RF_RXTIMEOUT2_TIMEOUTRXPREAMBLE 0x00 // Default
  716 +
  717 +/*!
  718 + * RegRxTimeout3
  719 + */
  720 +#define RF_RXTIMEOUT3_TIMEOUTSIGNALSYNC 0x00 // Default
  721 +
  722 +/*!
  723 + * RegRxDelay
  724 + */
  725 +#define RF_RXDELAY_INTERPACKETRXDELAY 0x00 // Default
  726 +
  727 +/*!
  728 + * RegOsc
  729 + */
  730 +#define RF_OSC_RCCALSTART 0x08
  731 +
  732 +#define RF_OSC_CLKOUT_MASK 0xF8
  733 +#define RF_OSC_CLKOUT_32_MHZ 0x00
  734 +#define RF_OSC_CLKOUT_16_MHZ 0x01
  735 +#define RF_OSC_CLKOUT_8_MHZ 0x02
  736 +#define RF_OSC_CLKOUT_4_MHZ 0x03
  737 +#define RF_OSC_CLKOUT_2_MHZ 0x04
  738 +#define RF_OSC_CLKOUT_1_MHZ 0x05 // Default
  739 +#define RF_OSC_CLKOUT_RC 0x06
  740 +#define RF_OSC_CLKOUT_OFF 0x07
  741 +
  742 +/*!
  743 + * RegPreambleMsb/RegPreambleLsb
  744 + */
  745 +#define RF_PREAMBLEMSB_SIZE 0x00 // Default
  746 +#define RF_PREAMBLELSB_SIZE 0x03 // Default
  747 +
  748 +/*!
  749 + * RegSyncConfig
  750 + */
  751 +#define RF_SYNCCONFIG_AUTORESTARTRXMODE_MASK 0x3F
  752 +#define RF_SYNCCONFIG_AUTORESTARTRXMODE_WAITPLL_ON 0x80 // Default
  753 +#define RF_SYNCCONFIG_AUTORESTARTRXMODE_WAITPLL_OFF 0x40
  754 +#define RF_SYNCCONFIG_AUTORESTARTRXMODE_OFF 0x00
  755 +
  756 +
  757 +#define RF_SYNCCONFIG_PREAMBLEPOLARITY_MASK 0xDF
  758 +#define RF_SYNCCONFIG_PREAMBLEPOLARITY_55 0x20
  759 +#define RF_SYNCCONFIG_PREAMBLEPOLARITY_AA 0x00 // Default
  760 +
  761 +#define RF_SYNCCONFIG_SYNC_MASK 0xEF
  762 +#define RF_SYNCCONFIG_SYNC_ON 0x10 // Default
  763 +#define RF_SYNCCONFIG_SYNC_OFF 0x00
  764 +
  765 +
  766 +#define RF_SYNCCONFIG_SYNCSIZE_MASK 0xF8
  767 +#define RF_SYNCCONFIG_SYNCSIZE_1 0x00
  768 +#define RF_SYNCCONFIG_SYNCSIZE_2 0x01
  769 +#define RF_SYNCCONFIG_SYNCSIZE_3 0x02
  770 +#define RF_SYNCCONFIG_SYNCSIZE_4 0x03 // Default
  771 +#define RF_SYNCCONFIG_SYNCSIZE_5 0x04
  772 +#define RF_SYNCCONFIG_SYNCSIZE_6 0x05
  773 +#define RF_SYNCCONFIG_SYNCSIZE_7 0x06
  774 +#define RF_SYNCCONFIG_SYNCSIZE_8 0x07
  775 +
  776 +/*!
  777 + * RegSyncValue1-8
  778 + */
  779 +#define RF_SYNCVALUE1_SYNCVALUE 0x01 // Default
  780 +#define RF_SYNCVALUE2_SYNCVALUE 0x01 // Default
  781 +#define RF_SYNCVALUE3_SYNCVALUE 0x01 // Default
  782 +#define RF_SYNCVALUE4_SYNCVALUE 0x01 // Default
  783 +#define RF_SYNCVALUE5_SYNCVALUE 0x01 // Default
  784 +#define RF_SYNCVALUE6_SYNCVALUE 0x01 // Default
  785 +#define RF_SYNCVALUE7_SYNCVALUE 0x01 // Default
  786 +#define RF_SYNCVALUE8_SYNCVALUE 0x01 // Default
  787 +
  788 +/*!
  789 + * RegPacketConfig1
  790 + */
  791 +#define RF_PACKETCONFIG1_PACKETFORMAT_MASK 0x7F
  792 +#define RF_PACKETCONFIG1_PACKETFORMAT_FIXED 0x00
  793 +#define RF_PACKETCONFIG1_PACKETFORMAT_VARIABLE 0x80 // Default
  794 +
  795 +#define RF_PACKETCONFIG1_DCFREE_MASK 0x9F
  796 +#define RF_PACKETCONFIG1_DCFREE_OFF 0x00 // Default
  797 +#define RF_PACKETCONFIG1_DCFREE_MANCHESTER 0x20
  798 +#define RF_PACKETCONFIG1_DCFREE_WHITENING 0x40
  799 +
  800 +#define RF_PACKETCONFIG1_CRC_MASK 0xEF
  801 +#define RF_PACKETCONFIG1_CRC_ON 0x10 // Default
  802 +#define RF_PACKETCONFIG1_CRC_OFF 0x00
  803 +
  804 +#define RF_PACKETCONFIG1_CRCAUTOCLEAR_MASK 0xF7
  805 +#define RF_PACKETCONFIG1_CRCAUTOCLEAR_ON 0x00 // Default
  806 +#define RF_PACKETCONFIG1_CRCAUTOCLEAR_OFF 0x08
  807 +
  808 +#define RF_PACKETCONFIG1_ADDRSFILTERING_MASK 0xF9
  809 +#define RF_PACKETCONFIG1_ADDRSFILTERING_OFF 0x00 // Default
  810 +#define RF_PACKETCONFIG1_ADDRSFILTERING_NODE 0x02
  811 +#define RF_PACKETCONFIG1_ADDRSFILTERING_NODEBROADCAST 0x04
  812 +
  813 +#define RF_PACKETCONFIG1_CRCWHITENINGTYPE_MASK 0xFE
  814 +#define RF_PACKETCONFIG1_CRCWHITENINGTYPE_CCITT 0x00 // Default
  815 +#define RF_PACKETCONFIG1_CRCWHITENINGTYPE_IBM 0x01
  816 +
  817 +/*!
  818 + * RegPacketConfig2
  819 + */
  820 +
  821 +#define RF_PACKETCONFIG2_WMBUS_CRC_ENABLE_MASK 0x7F
  822 +#define RF_PACKETCONFIG2_WMBUS_CRC_ENABLE 0x80
  823 +#define RF_PACKETCONFIG2_WMBUS_CRC_DISABLE 0x00 // Default
  824 +
  825 +#define RF_PACKETCONFIG2_DATAMODE_MASK 0xBF
  826 +#define RF_PACKETCONFIG2_DATAMODE_CONTINUOUS 0x00
  827 +#define RF_PACKETCONFIG2_DATAMODE_PACKET 0x40 // Default
  828 +
  829 +#define RF_PACKETCONFIG2_IOHOME_MASK 0xDF
  830 +#define RF_PACKETCONFIG2_IOHOME_ON 0x20
  831 +#define RF_PACKETCONFIG2_IOHOME_OFF 0x00 // Default
  832 +
  833 +#define RF_PACKETCONFIG2_BEACON_MASK 0xF7
  834 +#define RF_PACKETCONFIG2_BEACON_ON 0x08
  835 +#define RF_PACKETCONFIG2_BEACON_OFF 0x00 // Default
  836 +
  837 +#define RF_PACKETCONFIG2_PAYLOADLENGTH_MSB_MASK 0xF8
  838 +
  839 +/*!
  840 + * RegPayloadLength
  841 + */
  842 +#define RF_PAYLOADLENGTH_LENGTH 0x40 // Default
  843 +
  844 +/*!
  845 + * RegNodeAdrs
  846 + */
  847 +#define RF_NODEADDRESS_ADDRESS 0x00
  848 +
  849 +/*!
  850 + * RegBroadcastAdrs
  851 + */
  852 +#define RF_BROADCASTADDRESS_ADDRESS 0x00
  853 +
  854 +/*!
  855 + * RegFifoThresh
  856 + */
  857 +#define RF_FIFOTHRESH_TXSTARTCONDITION_MASK 0x7F
  858 +#define RF_FIFOTHRESH_TXSTARTCONDITION_FIFOTHRESH 0x00 // Default
  859 +#define RF_FIFOTHRESH_TXSTARTCONDITION_FIFONOTEMPTY 0x80
  860 +
  861 +#define RF_FIFOTHRESH_FIFOTHRESHOLD_MASK 0xC0
  862 +#define RF_FIFOTHRESH_FIFOTHRESHOLD_THRESHOLD 0x0F // Default
  863 +
  864 +/*!
  865 + * RegSeqConfig1
  866 + */
  867 +#define RF_SEQCONFIG1_SEQUENCER_START 0x80
  868 +
  869 +#define RF_SEQCONFIG1_SEQUENCER_STOP 0x40
  870 +
  871 +#define RF_SEQCONFIG1_IDLEMODE_MASK 0xDF
  872 +#define RF_SEQCONFIG1_IDLEMODE_SLEEP 0x20
  873 +#define RF_SEQCONFIG1_IDLEMODE_STANDBY 0x00 // Default
  874 +
  875 +#define RF_SEQCONFIG1_FROMSTART_MASK 0xE7
  876 +#define RF_SEQCONFIG1_FROMSTART_TOLPS 0x00 // Default
  877 +#define RF_SEQCONFIG1_FROMSTART_TORX 0x08
  878 +#define RF_SEQCONFIG1_FROMSTART_TOTX 0x10
  879 +#define RF_SEQCONFIG1_FROMSTART_TOTX_ONFIFOLEVEL 0x18
  880 +
  881 +#define RF_SEQCONFIG1_LPS_MASK 0xFB
  882 +#define RF_SEQCONFIG1_LPS_SEQUENCER_OFF 0x00 // Default
  883 +#define RF_SEQCONFIG1_LPS_IDLE 0x04
  884 +
  885 +#define RF_SEQCONFIG1_FROMIDLE_MASK 0xFD
  886 +#define RF_SEQCONFIG1_FROMIDLE_TOTX 0x00 // Default
  887 +#define RF_SEQCONFIG1_FROMIDLE_TORX 0x02
  888 +
  889 +#define RF_SEQCONFIG1_FROMTX_MASK 0xFE
  890 +#define RF_SEQCONFIG1_FROMTX_TOLPS 0x00 // Default
  891 +#define RF_SEQCONFIG1_FROMTX_TORX 0x01
  892 +
  893 +/*!
  894 + * RegSeqConfig2
  895 + */
  896 +#define RF_SEQCONFIG2_FROMRX_MASK 0x1F
  897 +#define RF_SEQCONFIG2_FROMRX_TOUNUSED_000 0x00 // Default
  898 +#define RF_SEQCONFIG2_FROMRX_TORXPKT_ONPLDRDY 0x20
  899 +#define RF_SEQCONFIG2_FROMRX_TOLPS_ONPLDRDY 0x40
  900 +#define RF_SEQCONFIG2_FROMRX_TORXPKT_ONCRCOK 0x60
  901 +#define RF_SEQCONFIG2_FROMRX_TOSEQUENCEROFF_ONRSSI 0x80
  902 +#define RF_SEQCONFIG2_FROMRX_TOSEQUENCEROFF_ONSYNC 0xA0
  903 +#define RF_SEQCONFIG2_FROMRX_TOSEQUENCEROFF_ONPREAMBLE 0xC0
  904 +#define RF_SEQCONFIG2_FROMRX_TOUNUSED_111 0xE0
  905 +
  906 +#define RF_SEQCONFIG2_FROMRXTIMEOUT_MASK 0xE7
  907 +#define RF_SEQCONFIG2_FROMRXTIMEOUT_TORXRESTART 0x00 // Default
  908 +#define RF_SEQCONFIG2_FROMRXTIMEOUT_TOTX 0x08
  909 +#define RF_SEQCONFIG2_FROMRXTIMEOUT_TOLPS 0x10
  910 +#define RF_SEQCONFIG2_FROMRXTIMEOUT_TOSEQUENCEROFF 0x18
  911 +
  912 +#define RF_SEQCONFIG2_FROMRXPKT_MASK 0xF8
  913 +#define RF_SEQCONFIG2_FROMRXPKT_TOSEQUENCEROFF 0x00 // Default
  914 +#define RF_SEQCONFIG2_FROMRXPKT_TOTX_ONFIFOEMPTY 0x01
  915 +#define RF_SEQCONFIG2_FROMRXPKT_TOLPS 0x02
  916 +#define RF_SEQCONFIG2_FROMRXPKT_TOSYNTHESIZERRX 0x03
  917 +#define RF_SEQCONFIG2_FROMRXPKT_TORX 0x04
  918 +
  919 +/*!
  920 + * RegTimerResol
  921 + */
  922 +#define RF_TIMERRESOL_TIMER1RESOL_MASK 0xF3
  923 +#define RF_TIMERRESOL_TIMER1RESOL_OFF 0x00 // Default
  924 +#define RF_TIMERRESOL_TIMER1RESOL_000064_US 0x04
  925 +#define RF_TIMERRESOL_TIMER1RESOL_004100_US 0x08
  926 +#define RF_TIMERRESOL_TIMER1RESOL_262000_US 0x0C
  927 +
  928 +#define RF_TIMERRESOL_TIMER2RESOL_MASK 0xFC
  929 +#define RF_TIMERRESOL_TIMER2RESOL_OFF 0x00 // Default
  930 +#define RF_TIMERRESOL_TIMER2RESOL_000064_US 0x01
  931 +#define RF_TIMERRESOL_TIMER2RESOL_004100_US 0x02
  932 +#define RF_TIMERRESOL_TIMER2RESOL_262000_US 0x03
  933 +
  934 +/*!
  935 + * RegTimer1Coef
  936 + */
  937 +#define RF_TIMER1COEF_TIMER1COEFFICIENT 0xF5 // Default
  938 +
  939 +/*!
  940 + * RegTimer2Coef
  941 + */
  942 +#define RF_TIMER2COEF_TIMER2COEFFICIENT 0x20 // Default
  943 +
  944 +/*!
  945 + * RegImageCal
  946 + */
  947 +#define RF_IMAGECAL_AUTOIMAGECAL_MASK 0x7F
  948 +#define RF_IMAGECAL_AUTOIMAGECAL_ON 0x80
  949 +#define RF_IMAGECAL_AUTOIMAGECAL_OFF 0x00 // Default
  950 +
  951 +#define RF_IMAGECAL_IMAGECAL_MASK 0xBF
  952 +#define RF_IMAGECAL_IMAGECAL_START 0x40
  953 +
  954 +#define RF_IMAGECAL_IMAGECAL_RUNNING 0x20
  955 +#define RF_IMAGECAL_IMAGECAL_DONE 0x00 // Default
  956 +
  957 +#define RF_IMAGECAL_TEMPCHANGE_HIGHER 0x08
  958 +#define RF_IMAGECAL_TEMPCHANGE_LOWER 0x00
  959 +
  960 +#define RF_IMAGECAL_TEMPTHRESHOLD_MASK 0xF9
  961 +#define RF_IMAGECAL_TEMPTHRESHOLD_05 0x00
  962 +#define RF_IMAGECAL_TEMPTHRESHOLD_10 0x02 // Default
  963 +#define RF_IMAGECAL_TEMPTHRESHOLD_15 0x04
  964 +#define RF_IMAGECAL_TEMPTHRESHOLD_20 0x06
  965 +
  966 +#define RF_IMAGECAL_TEMPMONITOR_MASK 0xFE
  967 +#define RF_IMAGECAL_TEMPMONITOR_ON 0x00 // Default
  968 +#define RF_IMAGECAL_TEMPMONITOR_OFF 0x01
  969 +
  970 +/*!
  971 + * RegTemp (Read Only)
  972 + */
  973 +
  974 +/*!
  975 + * RegLowBat
  976 + */
  977 +#define RF_LOWBAT_MASK 0xF7
  978 +#define RF_LOWBAT_ON 0x08
  979 +#define RF_LOWBAT_OFF 0x00 // Default
  980 +
  981 +#define RF_LOWBAT_TRIM_MASK 0xF8
  982 +#define RF_LOWBAT_TRIM_1695 0x00
  983 +#define RF_LOWBAT_TRIM_1764 0x01
  984 +#define RF_LOWBAT_TRIM_1835 0x02 // Default
  985 +#define RF_LOWBAT_TRIM_1905 0x03
  986 +#define RF_LOWBAT_TRIM_1976 0x04
  987 +#define RF_LOWBAT_TRIM_2045 0x05
  988 +#define RF_LOWBAT_TRIM_2116 0x06
  989 +#define RF_LOWBAT_TRIM_2185 0x07
  990 +
  991 +/*!
  992 + * RegIrqFlags1
  993 + */
  994 +#define RF_IRQFLAGS1_MODEREADY 0x80
  995 +
  996 +#define RF_IRQFLAGS1_RXREADY 0x40
  997 +
  998 +#define RF_IRQFLAGS1_TXREADY 0x20
  999 +
  1000 +#define RF_IRQFLAGS1_PLLLOCK 0x10
  1001 +
  1002 +#define RF_IRQFLAGS1_RSSI 0x08
  1003 +
  1004 +#define RF_IRQFLAGS1_TIMEOUT 0x04
  1005 +
  1006 +#define RF_IRQFLAGS1_PREAMBLEDETECT 0x02
  1007 +
  1008 +#define RF_IRQFLAGS1_SYNCADDRESSMATCH 0x01
  1009 +
  1010 +/*!
  1011 + * RegIrqFlags2
  1012 + */
  1013 +#define RF_IRQFLAGS2_FIFOFULL 0x80
  1014 +
  1015 +#define RF_IRQFLAGS2_FIFOEMPTY 0x40
  1016 +
  1017 +#define RF_IRQFLAGS2_FIFOLEVEL 0x20
  1018 +
  1019 +#define RF_IRQFLAGS2_FIFOOVERRUN 0x10
  1020 +
  1021 +#define RF_IRQFLAGS2_PACKETSENT 0x08
  1022 +
  1023 +#define RF_IRQFLAGS2_PAYLOADREADY 0x04
  1024 +
  1025 +#define RF_IRQFLAGS2_CRCOK 0x02
  1026 +
  1027 +#define RF_IRQFLAGS2_LOWBAT 0x01
  1028 +
  1029 +/*!
  1030 + * RegDioMapping1
  1031 + */
  1032 +#define RF_DIOMAPPING1_DIO0_MASK 0x3F
  1033 +#define RF_DIOMAPPING1_DIO0_00 0x00 // Default
  1034 +#define RF_DIOMAPPING1_DIO0_01 0x40
  1035 +#define RF_DIOMAPPING1_DIO0_10 0x80
  1036 +#define RF_DIOMAPPING1_DIO0_11 0xC0
  1037 +
  1038 +#define RF_DIOMAPPING1_DIO1_MASK 0xCF
  1039 +#define RF_DIOMAPPING1_DIO1_00 0x00 // Default
  1040 +#define RF_DIOMAPPING1_DIO1_01 0x10
  1041 +#define RF_DIOMAPPING1_DIO1_10 0x20
  1042 +#define RF_DIOMAPPING1_DIO1_11 0x30
  1043 +
  1044 +#define RF_DIOMAPPING1_DIO2_MASK 0xF3
  1045 +#define RF_DIOMAPPING1_DIO2_00 0x00 // Default
  1046 +#define RF_DIOMAPPING1_DIO2_01 0x04
  1047 +#define RF_DIOMAPPING1_DIO2_10 0x08
  1048 +#define RF_DIOMAPPING1_DIO2_11 0x0C
  1049 +
  1050 +#define RF_DIOMAPPING1_DIO3_MASK 0xFC
  1051 +#define RF_DIOMAPPING1_DIO3_00 0x00 // Default
  1052 +#define RF_DIOMAPPING1_DIO3_01 0x01
  1053 +#define RF_DIOMAPPING1_DIO3_10 0x02
  1054 +#define RF_DIOMAPPING1_DIO3_11 0x03
  1055 +
  1056 +/*!
  1057 + * RegDioMapping2
  1058 + */
  1059 +#define RF_DIOMAPPING2_DIO4_MASK 0x3F
  1060 +#define RF_DIOMAPPING2_DIO4_00 0x00 // Default
  1061 +#define RF_DIOMAPPING2_DIO4_01 0x40
  1062 +#define RF_DIOMAPPING2_DIO4_10 0x80
  1063 +#define RF_DIOMAPPING2_DIO4_11 0xC0
  1064 +
  1065 +#define RF_DIOMAPPING2_DIO5_MASK 0xCF
  1066 +#define RF_DIOMAPPING2_DIO5_00 0x00 // Default
  1067 +#define RF_DIOMAPPING2_DIO5_01 0x10
  1068 +#define RF_DIOMAPPING2_DIO5_10 0x20
  1069 +#define RF_DIOMAPPING2_DIO5_11 0x30
  1070 +
  1071 +#define RF_DIOMAPPING2_MAP_MASK 0xFE
  1072 +#define RF_DIOMAPPING2_MAP_PREAMBLEDETECT 0x01
  1073 +#define RF_DIOMAPPING2_MAP_RSSI 0x00 // Default
  1074 +
  1075 +/*!
  1076 + * RegVersion (Read Only)
  1077 + */
  1078 +
  1079 +/*!
  1080 + * RegPllHop
  1081 + */
  1082 +#define RF_PLLHOP_FASTHOP_MASK 0x7F
  1083 +#define RF_PLLHOP_FASTHOP_ON 0x80
  1084 +#define RF_PLLHOP_FASTHOP_OFF 0x00 // Default
  1085 +
  1086 +/*!
  1087 + * RegTcxo
  1088 + */
  1089 +#define RF_TCXO_TCXOINPUT_MASK 0xEF
  1090 +#define RF_TCXO_TCXOINPUT_ON 0x10
  1091 +#define RF_TCXO_TCXOINPUT_OFF 0x00 // Default
  1092 +
  1093 +/*!
  1094 + * RegPaDac
  1095 + */
  1096 +#define RF_PADAC_20DBM_MASK 0xF8
  1097 +#define RF_PADAC_20DBM_ON 0x07
  1098 +#define RF_PADAC_20DBM_OFF 0x04 // Default
  1099 +
  1100 +/*!
  1101 + * RegFormerTemp
  1102 + */
  1103 +
  1104 +/*!
  1105 + * RegBitrateFrac
  1106 + */
  1107 +#define RF_BITRATEFRAC_MASK 0xF0
  1108 +
  1109 +/*!
  1110 + * RegAgcRef
  1111 + */
  1112 +
  1113 +/*!
  1114 + * RegAgcThresh1
  1115 + */
  1116 +
  1117 +/*!
  1118 + * RegAgcThresh2
  1119 + */
  1120 +
  1121 +/*!
  1122 + * RegAgcThresh3
  1123 + */
  1124 +
  1125 +/*!
  1126 + * RegPll
  1127 + */
  1128 +#define RF_PLL_BANDWIDTH_MASK 0x3F
  1129 +#define RF_PLL_BANDWIDTH_75 0x00
  1130 +#define RF_PLL_BANDWIDTH_150 0x40
  1131 +#define RF_PLL_BANDWIDTH_225 0x80
  1132 +#define RF_PLL_BANDWIDTH_300 0xC0 // Default
  1133 +
  1134 +#endif // __SX1276_REGS_FSK_H__
... ...
recepteur/SX1276Lib/registers/sx1276Regs-LoRa.h 0 → 100644
... ... @@ -0,0 +1,565 @@
  1 +/*
  2 + / _____) _ | |
  3 +( (____ _____ ____ _| |_ _____ ____| |__
  4 + \____ \| ___ | (_ _) ___ |/ ___) _ \
  5 + _____) ) ____| | | || |_| ____( (___| | | |
  6 +(______/|_____)_|_|_| \__)_____)\____)_| |_|
  7 + (C) 2014 Semtech
  8 +
  9 +Description: SX1276 LoRa modem registers and bits definitions
  10 +
  11 +License: Revised BSD License, see LICENSE.TXT file include in the project
  12 +
  13 +Maintainer: Miguel Luis and Gregory Cristian
  14 +*/
  15 +#ifndef __SX1276_REGS_LORA_H__
  16 +#define __SX1276_REGS_LORA_H__
  17 +
  18 +/*!
  19 + * ============================================================================
  20 + * SX1276 Internal registers Address
  21 + * ============================================================================
  22 + */
  23 +#define REG_LR_FIFO 0x00
  24 +// Common settings
  25 +#define REG_LR_OPMODE 0x01
  26 +#define REG_LR_FRFMSB 0x06
  27 +#define REG_LR_FRFMID 0x07
  28 +#define REG_LR_FRFLSB 0x08
  29 +// Tx settings
  30 +#define REG_LR_PACONFIG 0x09
  31 +#define REG_LR_PARAMP 0x0A
  32 +#define REG_LR_OCP 0x0B
  33 +// Rx settings
  34 +#define REG_LR_LNA 0x0C
  35 +// LoRa registers
  36 +#define REG_LR_FIFOADDRPTR 0x0D
  37 +#define REG_LR_FIFOTXBASEADDR 0x0E
  38 +#define REG_LR_FIFORXBASEADDR 0x0F
  39 +#define REG_LR_FIFORXCURRENTADDR 0x10
  40 +#define REG_LR_IRQFLAGSMASK 0x11
  41 +#define REG_LR_IRQFLAGS 0x12
  42 +#define REG_LR_RXNBBYTES 0x13
  43 +#define REG_LR_RXHEADERCNTVALUEMSB 0x14
  44 +#define REG_LR_RXHEADERCNTVALUELSB 0x15
  45 +#define REG_LR_RXPACKETCNTVALUEMSB 0x16
  46 +#define REG_LR_RXPACKETCNTVALUELSB 0x17
  47 +#define REG_LR_MODEMSTAT 0x18
  48 +#define REG_LR_PKTSNRVALUE 0x19
  49 +#define REG_LR_PKTRSSIVALUE 0x1A
  50 +#define REG_LR_RSSIVALUE 0x1B
  51 +#define REG_LR_HOPCHANNEL 0x1C
  52 +#define REG_LR_MODEMCONFIG1 0x1D
  53 +#define REG_LR_MODEMCONFIG2 0x1E
  54 +#define REG_LR_SYMBTIMEOUTLSB 0x1F
  55 +#define REG_LR_PREAMBLEMSB 0x20
  56 +#define REG_LR_PREAMBLELSB 0x21
  57 +#define REG_LR_PAYLOADLENGTH 0x22
  58 +#define REG_LR_PAYLOADMAXLENGTH 0x23
  59 +#define REG_LR_HOPPERIOD 0x24
  60 +#define REG_LR_FIFORXBYTEADDR 0x25
  61 +#define REG_LR_MODEMCONFIG3 0x26
  62 +#define REG_LR_FEIMSB 0x28
  63 +#define REG_LR_FEIMID 0x29
  64 +#define REG_LR_FEILSB 0x2A
  65 +#define REG_LR_RSSIWIDEBAND 0x2C
  66 +#define REG_LR_TEST2F 0x2F
  67 +#define REG_LR_TEST30 0x30
  68 +#define REG_LR_DETECTOPTIMIZE 0x31
  69 +#define REG_LR_INVERTIQ 0x33
  70 +#define REG_LR_TEST36 0x36
  71 +#define REG_LR_DETECTIONTHRESHOLD 0x37
  72 +#define REG_LR_SYNCWORD 0x39
  73 +#define REG_LR_TEST3A 0x3A
  74 +#define REG_LR_INVERTIQ2 0x3B
  75 +
  76 +// end of documented register in datasheet
  77 +// I/O settings
  78 +#define REG_LR_DIOMAPPING1 0x40
  79 +#define REG_LR_DIOMAPPING2 0x41
  80 +// Version
  81 +#define REG_LR_VERSION 0x42
  82 +// Additional settings
  83 +#define REG_LR_PLLHOP 0x44
  84 +#define REG_LR_TCXO 0x4B
  85 +#define REG_LR_PADAC 0x4D
  86 +#define REG_LR_FORMERTEMP 0x5B
  87 +#define REG_LR_BITRATEFRAC 0x5D
  88 +#define REG_LR_AGCREF 0x61
  89 +#define REG_LR_AGCTHRESH1 0x62
  90 +#define REG_LR_AGCTHRESH2 0x63
  91 +#define REG_LR_AGCTHRESH3 0x64
  92 +#define REG_LR_PLL 0x70
  93 +
  94 +/*!
  95 + * ============================================================================
  96 + * SX1276 LoRa bits control definition
  97 + * ============================================================================
  98 + */
  99 +
  100 +/*!
  101 + * RegFifo
  102 + */
  103 +
  104 +/*!
  105 + * RegOpMode
  106 + */
  107 +#define RFLR_OPMODE_LONGRANGEMODE_MASK 0x7F
  108 +#define RFLR_OPMODE_LONGRANGEMODE_OFF 0x00 // Default
  109 +#define RFLR_OPMODE_LONGRANGEMODE_ON 0x80
  110 +
  111 +#define RFLR_OPMODE_ACCESSSHAREDREG_MASK 0xBF
  112 +#define RFLR_OPMODE_ACCESSSHAREDREG_ENABLE 0x40
  113 +#define RFLR_OPMODE_ACCESSSHAREDREG_DISABLE 0x00 // Default
  114 +
  115 +#define RFLR_OPMODE_FREQMODE_ACCESS_MASK 0xF7
  116 +#define RFLR_OPMODE_FREQMODE_ACCESS_LF 0x08 // Default
  117 +#define RFLR_OPMODE_FREQMODE_ACCESS_HF 0x00
  118 +
  119 +#define RFLR_OPMODE_MASK 0xF8
  120 +#define RFLR_OPMODE_SLEEP 0x00
  121 +#define RFLR_OPMODE_STANDBY 0x01 // Default
  122 +#define RFLR_OPMODE_SYNTHESIZER_TX 0x02
  123 +#define RFLR_OPMODE_TRANSMITTER 0x03
  124 +#define RFLR_OPMODE_SYNTHESIZER_RX 0x04
  125 +#define RFLR_OPMODE_RECEIVER 0x05
  126 +// LoRa specific modes
  127 +#define RFLR_OPMODE_RECEIVER_SINGLE 0x06
  128 +#define RFLR_OPMODE_CAD 0x07
  129 +
  130 +/*!
  131 + * RegFrf (MHz)
  132 + */
  133 +#define RFLR_FRFMSB_434_MHZ 0x6C // Default
  134 +#define RFLR_FRFMID_434_MHZ 0x80 // Default
  135 +#define RFLR_FRFLSB_434_MHZ 0x00 // Default
  136 +
  137 +/*!
  138 + * RegPaConfig
  139 + */
  140 +#define RFLR_PACONFIG_PASELECT_MASK 0x7F
  141 +#define RFLR_PACONFIG_PASELECT_PABOOST 0x80
  142 +#define RFLR_PACONFIG_PASELECT_RFO 0x00 // Default
  143 +
  144 +#define RFLR_PACONFIG_MAX_POWER_MASK 0x8F
  145 +
  146 +#define RFLR_PACONFIG_OUTPUTPOWER_MASK 0xF0
  147 +
  148 +/*!
  149 + * RegPaRamp
  150 + */
  151 +#define RFLR_PARAMP_TXBANDFORCE_MASK 0xEF
  152 +#define RFLR_PARAMP_TXBANDFORCE_BAND_SEL 0x10
  153 +#define RFLR_PARAMP_TXBANDFORCE_AUTO 0x00 // Default
  154 +
  155 +#define RFLR_PARAMP_MASK 0xF0
  156 +#define RFLR_PARAMP_3400_US 0x00
  157 +#define RFLR_PARAMP_2000_US 0x01
  158 +#define RFLR_PARAMP_1000_US 0x02
  159 +#define RFLR_PARAMP_0500_US 0x03
  160 +#define RFLR_PARAMP_0250_US 0x04
  161 +#define RFLR_PARAMP_0125_US 0x05
  162 +#define RFLR_PARAMP_0100_US 0x06
  163 +#define RFLR_PARAMP_0062_US 0x07
  164 +#define RFLR_PARAMP_0050_US 0x08
  165 +#define RFLR_PARAMP_0040_US 0x09 // Default
  166 +#define RFLR_PARAMP_0031_US 0x0A
  167 +#define RFLR_PARAMP_0025_US 0x0B
  168 +#define RFLR_PARAMP_0020_US 0x0C
  169 +#define RFLR_PARAMP_0015_US 0x0D
  170 +#define RFLR_PARAMP_0012_US 0x0E
  171 +#define RFLR_PARAMP_0010_US 0x0F
  172 +
  173 +/*!
  174 + * RegOcp
  175 + */
  176 +#define RFLR_OCP_MASK 0xDF
  177 +#define RFLR_OCP_ON 0x20 // Default
  178 +#define RFLR_OCP_OFF 0x00
  179 +
  180 +#define RFLR_OCP_TRIM_MASK 0xE0
  181 +#define RFLR_OCP_TRIM_045_MA 0x00
  182 +#define RFLR_OCP_TRIM_050_MA 0x01
  183 +#define RFLR_OCP_TRIM_055_MA 0x02
  184 +#define RFLR_OCP_TRIM_060_MA 0x03
  185 +#define RFLR_OCP_TRIM_065_MA 0x04
  186 +#define RFLR_OCP_TRIM_070_MA 0x05
  187 +#define RFLR_OCP_TRIM_075_MA 0x06
  188 +#define RFLR_OCP_TRIM_080_MA 0x07
  189 +#define RFLR_OCP_TRIM_085_MA 0x08
  190 +#define RFLR_OCP_TRIM_090_MA 0x09
  191 +#define RFLR_OCP_TRIM_095_MA 0x0A
  192 +#define RFLR_OCP_TRIM_100_MA 0x0B // Default
  193 +#define RFLR_OCP_TRIM_105_MA 0x0C
  194 +#define RFLR_OCP_TRIM_110_MA 0x0D
  195 +#define RFLR_OCP_TRIM_115_MA 0x0E
  196 +#define RFLR_OCP_TRIM_120_MA 0x0F
  197 +#define RFLR_OCP_TRIM_130_MA 0x10
  198 +#define RFLR_OCP_TRIM_140_MA 0x11
  199 +#define RFLR_OCP_TRIM_150_MA 0x12
  200 +#define RFLR_OCP_TRIM_160_MA 0x13
  201 +#define RFLR_OCP_TRIM_170_MA 0x14
  202 +#define RFLR_OCP_TRIM_180_MA 0x15
  203 +#define RFLR_OCP_TRIM_190_MA 0x16
  204 +#define RFLR_OCP_TRIM_200_MA 0x17
  205 +#define RFLR_OCP_TRIM_210_MA 0x18
  206 +#define RFLR_OCP_TRIM_220_MA 0x19
  207 +#define RFLR_OCP_TRIM_230_MA 0x1A
  208 +#define RFLR_OCP_TRIM_240_MA 0x1B
  209 +
  210 +/*!
  211 + * RegLna
  212 + */
  213 +#define RFLR_LNA_GAIN_MASK 0x1F
  214 +#define RFLR_LNA_GAIN_G1 0x20 // Default
  215 +#define RFLR_LNA_GAIN_G2 0x40
  216 +#define RFLR_LNA_GAIN_G3 0x60
  217 +#define RFLR_LNA_GAIN_G4 0x80
  218 +#define RFLR_LNA_GAIN_G5 0xA0
  219 +#define RFLR_LNA_GAIN_G6 0xC0
  220 +
  221 +#define RFLR_LNA_BOOST_LF_MASK 0xE7
  222 +#define RFLR_LNA_BOOST_LF_DEFAULT 0x00 // Default
  223 +
  224 +#define RFLR_LNA_BOOST_HF_MASK 0xFC
  225 +#define RFLR_LNA_BOOST_HF_OFF 0x00 // Default
  226 +#define RFLR_LNA_BOOST_HF_ON 0x03
  227 +
  228 +/*!
  229 + * RegFifoAddrPtr
  230 + */
  231 +#define RFLR_FIFOADDRPTR 0x00 // Default
  232 +
  233 +/*!
  234 + * RegFifoTxBaseAddr
  235 + */
  236 +#define RFLR_FIFOTXBASEADDR 0x80 // Default
  237 +
  238 +/*!
  239 + * RegFifoTxBaseAddr
  240 + */
  241 +#define RFLR_FIFORXBASEADDR 0x00 // Default
  242 +
  243 +/*!
  244 + * RegFifoRxCurrentAddr (Read Only)
  245 + */
  246 +
  247 +/*!
  248 + * RegIrqFlagsMask
  249 + */
  250 +#define RFLR_IRQFLAGS_RXTIMEOUT_MASK 0x80
  251 +#define RFLR_IRQFLAGS_RXDONE_MASK 0x40
  252 +#define RFLR_IRQFLAGS_PAYLOADCRCERROR_MASK 0x20
  253 +#define RFLR_IRQFLAGS_VALIDHEADER_MASK 0x10
  254 +#define RFLR_IRQFLAGS_TXDONE_MASK 0x08
  255 +#define RFLR_IRQFLAGS_CADDONE_MASK 0x04
  256 +#define RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL_MASK 0x02
  257 +#define RFLR_IRQFLAGS_CADDETECTED_MASK 0x01
  258 +
  259 +/*!
  260 + * RegIrqFlags
  261 + */
  262 +#define RFLR_IRQFLAGS_RXTIMEOUT 0x80
  263 +#define RFLR_IRQFLAGS_RXDONE 0x40
  264 +#define RFLR_IRQFLAGS_PAYLOADCRCERROR 0x20
  265 +#define RFLR_IRQFLAGS_VALIDHEADER 0x10
  266 +#define RFLR_IRQFLAGS_TXDONE 0x08
  267 +#define RFLR_IRQFLAGS_CADDONE 0x04
  268 +#define RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL 0x02
  269 +#define RFLR_IRQFLAGS_CADDETECTED 0x01
  270 +
  271 +/*!
  272 + * RegFifoRxNbBytes (Read Only)
  273 + */
  274 +
  275 +/*!
  276 + * RegRxHeaderCntValueMsb (Read Only)
  277 + */
  278 +
  279 +/*!
  280 + * RegRxHeaderCntValueLsb (Read Only)
  281 + */
  282 +
  283 +/*!
  284 + * RegRxPacketCntValueMsb (Read Only)
  285 + */
  286 +
  287 +/*!
  288 + * RegRxPacketCntValueLsb (Read Only)
  289 + */
  290 +
  291 +/*!
  292 + * RegModemStat (Read Only)
  293 + */
  294 +#define RFLR_MODEMSTAT_RX_CR_MASK 0x1F
  295 +#define RFLR_MODEMSTAT_MODEM_STATUS_MASK 0xE0
  296 +
  297 +/*!
  298 + * RegPktSnrValue (Read Only)
  299 + */
  300 +
  301 +/*!
  302 + * RegPktRssiValue (Read Only)
  303 + */
  304 +
  305 +/*!
  306 + * RegRssiValue (Read Only)
  307 + */
  308 +
  309 +/*!
  310 + * RegHopChannel (Read Only)
  311 + */
  312 +#define RFLR_HOPCHANNEL_PLL_LOCK_TIMEOUT_MASK 0x7F
  313 +#define RFLR_HOPCHANNEL_PLL_LOCK_FAIL 0x80
  314 +#define RFLR_HOPCHANNEL_PLL_LOCK_SUCCEED 0x00 // Default
  315 +
  316 +#define RFLR_HOPCHANNEL_CRCONPAYLOAD_MASK 0xBF
  317 +#define RFLR_HOPCHANNEL_CRCONPAYLOAD_ON 0x40
  318 +#define RFLR_HOPCHANNEL_CRCONPAYLOAD_OFF 0x00 // Default
  319 +
  320 +#define RFLR_HOPCHANNEL_CHANNEL_MASK 0x3F
  321 +
  322 +/*!
  323 + * RegModemConfig1
  324 + */
  325 +#define RFLR_MODEMCONFIG1_BW_MASK 0x0F
  326 +#define RFLR_MODEMCONFIG1_BW_7_81_KHZ 0x00
  327 +#define RFLR_MODEMCONFIG1_BW_10_41_KHZ 0x10
  328 +#define RFLR_MODEMCONFIG1_BW_15_62_KHZ 0x20
  329 +#define RFLR_MODEMCONFIG1_BW_20_83_KHZ 0x30
  330 +#define RFLR_MODEMCONFIG1_BW_31_25_KHZ 0x40
  331 +#define RFLR_MODEMCONFIG1_BW_41_66_KHZ 0x50
  332 +#define RFLR_MODEMCONFIG1_BW_62_50_KHZ 0x60
  333 +#define RFLR_MODEMCONFIG1_BW_125_KHZ 0x70 // Default
  334 +#define RFLR_MODEMCONFIG1_BW_250_KHZ 0x80
  335 +#define RFLR_MODEMCONFIG1_BW_500_KHZ 0x90
  336 +
  337 +#define RFLR_MODEMCONFIG1_CODINGRATE_MASK 0xF1
  338 +#define RFLR_MODEMCONFIG1_CODINGRATE_4_5 0x02
  339 +#define RFLR_MODEMCONFIG1_CODINGRATE_4_6 0x04 // Default
  340 +#define RFLR_MODEMCONFIG1_CODINGRATE_4_7 0x06
  341 +#define RFLR_MODEMCONFIG1_CODINGRATE_4_8 0x08
  342 +
  343 +#define RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK 0xFE
  344 +#define RFLR_MODEMCONFIG1_IMPLICITHEADER_ON 0x01
  345 +#define RFLR_MODEMCONFIG1_IMPLICITHEADER_OFF 0x00 // Default
  346 +
  347 +/*!
  348 + * RegModemConfig2
  349 + */
  350 +#define RFLR_MODEMCONFIG2_SF_MASK 0x0F
  351 +#define RFLR_MODEMCONFIG2_SF_6 0x60
  352 +#define RFLR_MODEMCONFIG2_SF_7 0x70 // Default
  353 +#define RFLR_MODEMCONFIG2_SF_8 0x80
  354 +#define RFLR_MODEMCONFIG2_SF_9 0x90
  355 +#define RFLR_MODEMCONFIG2_SF_10 0xA0
  356 +#define RFLR_MODEMCONFIG2_SF_11 0xB0
  357 +#define RFLR_MODEMCONFIG2_SF_12 0xC0
  358 +
  359 +#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_MASK 0xF7
  360 +#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_ON 0x08
  361 +#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_OFF 0x00
  362 +
  363 +#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK 0xFB
  364 +#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_ON 0x04
  365 +#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_OFF 0x00 // Default
  366 +
  367 +#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK 0xFC
  368 +#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB 0x00 // Default
  369 +
  370 +/*!
  371 + * RegSymbTimeoutLsb
  372 + */
  373 +#define RFLR_SYMBTIMEOUTLSB_SYMBTIMEOUT 0x64 // Default
  374 +
  375 +/*!
  376 + * RegPreambleLengthMsb
  377 + */
  378 +#define RFLR_PREAMBLELENGTHMSB 0x00 // Default
  379 +
  380 +/*!
  381 + * RegPreambleLengthLsb
  382 + */
  383 +#define RFLR_PREAMBLELENGTHLSB 0x08 // Default
  384 +
  385 +/*!
  386 + * RegPayloadLength
  387 + */
  388 +#define RFLR_PAYLOADLENGTH 0x0E // Default
  389 +
  390 +/*!
  391 + * RegPayloadMaxLength
  392 + */
  393 +#define RFLR_PAYLOADMAXLENGTH 0xFF // Default
  394 +
  395 +/*!
  396 + * RegHopPeriod
  397 + */
  398 +#define RFLR_HOPPERIOD_FREQFOPPINGPERIOD 0x00 // Default
  399 +
  400 +/*!
  401 + * RegFifoRxByteAddr (Read Only)
  402 + */
  403 +
  404 +/*!
  405 + * RegModemConfig3
  406 + */
  407 +#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK 0xF7
  408 +#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_ON 0x08
  409 +#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_OFF 0x00 // Default
  410 +
  411 +#define RFLR_MODEMCONFIG3_AGCAUTO_MASK 0xFB
  412 +#define RFLR_MODEMCONFIG3_AGCAUTO_ON 0x04 // Default
  413 +#define RFLR_MODEMCONFIG3_AGCAUTO_OFF 0x00
  414 +
  415 +/*!
  416 + * RegFeiMsb (Read Only)
  417 + */
  418 +
  419 +/*!
  420 + * RegFeiMid (Read Only)
  421 + */
  422 +
  423 +/*!
  424 + * RegFeiLsb (Read Only)
  425 + */
  426 +
  427 +/*!
  428 + * RegRssiWideband (Read Only)
  429 + */
  430 +
  431 +/*!
  432 + * RegDetectOptimize
  433 + */
  434 +#define RFLR_DETECTIONOPTIMIZE_MASK 0xF8
  435 +#define RFLR_DETECTIONOPTIMIZE_SF7_TO_SF12 0x03 // Default
  436 +#define RFLR_DETECTIONOPTIMIZE_SF6 0x05
  437 +
  438 +/*!
  439 + * RegInvertIQ
  440 + */
  441 +#define RFLR_INVERTIQ_RX_MASK 0xBF
  442 +#define RFLR_INVERTIQ_RX_OFF 0x00
  443 +#define RFLR_INVERTIQ_RX_ON 0x40
  444 +#define RFLR_INVERTIQ_TX_MASK 0xFE
  445 +#define RFLR_INVERTIQ_TX_OFF 0x01
  446 +#define RFLR_INVERTIQ_TX_ON 0x00
  447 +
  448 +/*!
  449 + * RegDetectionThreshold
  450 + */
  451 +#define RFLR_DETECTIONTHRESH_SF7_TO_SF12 0x0A // Default
  452 +#define RFLR_DETECTIONTHRESH_SF6 0x0C
  453 +
  454 +/*!
  455 + * RegInvertIQ2
  456 + */
  457 +#define RFLR_INVERTIQ2_ON 0x19
  458 +#define RFLR_INVERTIQ2_OFF 0x1D
  459 +
  460 +/*!
  461 + * RegDioMapping1
  462 + */
  463 +#define RFLR_DIOMAPPING1_DIO0_MASK 0x3F
  464 +#define RFLR_DIOMAPPING1_DIO0_00 0x00 // Default
  465 +#define RFLR_DIOMAPPING1_DIO0_01 0x40
  466 +#define RFLR_DIOMAPPING1_DIO0_10 0x80
  467 +#define RFLR_DIOMAPPING1_DIO0_11 0xC0
  468 +
  469 +#define RFLR_DIOMAPPING1_DIO1_MASK 0xCF
  470 +#define RFLR_DIOMAPPING1_DIO1_00 0x00 // Default
  471 +#define RFLR_DIOMAPPING1_DIO1_01 0x10
  472 +#define RFLR_DIOMAPPING1_DIO1_10 0x20
  473 +#define RFLR_DIOMAPPING1_DIO1_11 0x30
  474 +
  475 +#define RFLR_DIOMAPPING1_DIO2_MASK 0xF3
  476 +#define RFLR_DIOMAPPING1_DIO2_00 0x00 // Default
  477 +#define RFLR_DIOMAPPING1_DIO2_01 0x04
  478 +#define RFLR_DIOMAPPING1_DIO2_10 0x08
  479 +#define RFLR_DIOMAPPING1_DIO2_11 0x0C
  480 +
  481 +#define RFLR_DIOMAPPING1_DIO3_MASK 0xFC
  482 +#define RFLR_DIOMAPPING1_DIO3_00 0x00 // Default
  483 +#define RFLR_DIOMAPPING1_DIO3_01 0x01
  484 +#define RFLR_DIOMAPPING1_DIO3_10 0x02
  485 +#define RFLR_DIOMAPPING1_DIO3_11 0x03
  486 +
  487 +/*!
  488 + * RegDioMapping2
  489 + */
  490 +#define RFLR_DIOMAPPING2_DIO4_MASK 0x3F
  491 +#define RFLR_DIOMAPPING2_DIO4_00 0x00 // Default
  492 +#define RFLR_DIOMAPPING2_DIO4_01 0x40
  493 +#define RFLR_DIOMAPPING2_DIO4_10 0x80
  494 +#define RFLR_DIOMAPPING2_DIO4_11 0xC0
  495 +
  496 +#define RFLR_DIOMAPPING2_DIO5_MASK 0xCF
  497 +#define RFLR_DIOMAPPING2_DIO5_00 0x00 // Default
  498 +#define RFLR_DIOMAPPING2_DIO5_01 0x10
  499 +#define RFLR_DIOMAPPING2_DIO5_10 0x20
  500 +#define RFLR_DIOMAPPING2_DIO5_11 0x30
  501 +
  502 +#define RFLR_DIOMAPPING2_MAP_MASK 0xFE
  503 +#define RFLR_DIOMAPPING2_MAP_PREAMBLEDETECT 0x01
  504 +#define RFLR_DIOMAPPING2_MAP_RSSI 0x00 // Default
  505 +
  506 +/*!
  507 + * RegVersion (Read Only)
  508 + */
  509 +
  510 +/*!
  511 + * RegPllHop
  512 + */
  513 +#define RFLR_PLLHOP_FASTHOP_MASK 0x7F
  514 +#define RFLR_PLLHOP_FASTHOP_ON 0x80
  515 +#define RFLR_PLLHOP_FASTHOP_OFF 0x00 // Default
  516 +
  517 +/*!
  518 + * RegTcxo
  519 + */
  520 +#define RFLR_TCXO_TCXOINPUT_MASK 0xEF
  521 +#define RFLR_TCXO_TCXOINPUT_ON 0x10
  522 +#define RFLR_TCXO_TCXOINPUT_OFF 0x00 // Default
  523 +
  524 +/*!
  525 + * RegPaDac
  526 + */
  527 +#define RFLR_PADAC_20DBM_MASK 0xF8
  528 +#define RFLR_PADAC_20DBM_ON 0x07
  529 +#define RFLR_PADAC_20DBM_OFF 0x04 // Default
  530 +
  531 +/*!
  532 + * RegFormerTemp
  533 + */
  534 +
  535 +/*!
  536 + * RegBitrateFrac
  537 + */
  538 +#define RF_BITRATEFRAC_MASK 0xF0
  539 +
  540 +/*!
  541 + * RegAgcRef
  542 + */
  543 +
  544 +/*!
  545 + * RegAgcThresh1
  546 + */
  547 +
  548 +/*!
  549 + * RegAgcThresh2
  550 + */
  551 +
  552 +/*!
  553 + * RegAgcThresh3
  554 + */
  555 +
  556 +/*!
  557 + * RegPll
  558 + */
  559 +#define RF_PLL_BANDWIDTH_MASK 0x3F
  560 +#define RF_PLL_BANDWIDTH_75 0x00
  561 +#define RF_PLL_BANDWIDTH_150 0x40
  562 +#define RF_PLL_BANDWIDTH_225 0x80
  563 +#define RF_PLL_BANDWIDTH_300 0xC0 // Default
  564 +
  565 +#endif // __SX1276_REGS_LORA_H__
... ...
recepteur/SX1276Lib/sx1276/sx1276-hal.cpp 0 → 100644
... ... @@ -0,0 +1,349 @@
  1 +/*
  2 + / _____) _ | |
  3 +( (____ _____ ____ _| |_ _____ ____| |__
  4 + \____ \| ___ | (_ _) ___ |/ ___) _ \
  5 + _____) ) ____| | | || |_| ____( (___| | | |
  6 +(______/|_____)_|_|_| \__)_____)\____)_| |_|
  7 + (C) 2014 Semtech
  8 +
  9 +Description: -
  10 +
  11 +License: Revised BSD License, see LICENSE.TXT file include in the project
  12 +
  13 +Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin
  14 +*/
  15 +#include "sx1276-hal.h"
  16 +
  17 +const RadioRegisters_t SX1276MB1xAS::RadioRegsInit[] = RADIO_INIT_REGISTERS_VALUE;
  18 +
  19 +SX1276MB1xAS::SX1276MB1xAS( RadioEvents_t *events,
  20 + PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset,
  21 + PinName dio0, PinName dio1, PinName dio2, PinName dio3, PinName dio4, PinName dio5,
  22 + PinName antSwitch )
  23 + : SX1276( events, mosi, miso, sclk, nss, reset, dio0, dio1, dio2, dio3, dio4, dio5 ),
  24 + AntSwitch( antSwitch ),
  25 + #if( defined ( TARGET_NUCLEO_L152RE ) )
  26 + Fake( D8 )
  27 + #else
  28 + Fake( A3 )
  29 + #endif
  30 +{
  31 + this->RadioEvents = events;
  32 +
  33 + Reset( );
  34 +
  35 + RxChainCalibration( );
  36 +
  37 + IoInit( );
  38 +
  39 + SetOpMode( RF_OPMODE_SLEEP );
  40 +
  41 + IoIrqInit( dioIrq );
  42 +
  43 + RadioRegistersInit( );
  44 +
  45 + SetModem( MODEM_FSK );
  46 +
  47 + this->settings.State = RF_IDLE ;
  48 +}
  49 +
  50 +SX1276MB1xAS::SX1276MB1xAS( RadioEvents_t *events )
  51 + #if defined ( TARGET_NUCLEO_L152RE )
  52 + : SX1276( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, A3, D9 ), // For NUCLEO L152RE dio4 is on port A3
  53 + AntSwitch( A4 ),
  54 + Fake( D8 )
  55 + #elif defined( TARGET_LPC11U6X )
  56 + : SX1276( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, D8, D9 ),
  57 + AntSwitch( P0_23 ),
  58 + Fake( A3 )
  59 + #else
  60 + : SX1276( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, D8, D9 ),
  61 + AntSwitch( A4 ),
  62 + Fake( A3 )
  63 + #endif
  64 +{
  65 + this->RadioEvents = events;
  66 +
  67 + Reset( );
  68 +
  69 + boardConnected = UNKNOWN;
  70 +
  71 + DetectBoardType( );
  72 +
  73 + RxChainCalibration( );
  74 +
  75 + IoInit( );
  76 +
  77 + SetOpMode( RF_OPMODE_SLEEP );
  78 + IoIrqInit( dioIrq );
  79 +
  80 + RadioRegistersInit( );
  81 +
  82 + SetModem( MODEM_FSK );
  83 +
  84 + this->settings.State = RF_IDLE ;
  85 +}
  86 +
  87 +//-------------------------------------------------------------------------
  88 +// Board relative functions
  89 +//-------------------------------------------------------------------------
  90 +uint8_t SX1276MB1xAS::DetectBoardType( void )
  91 +{
  92 + if( boardConnected == UNKNOWN )
  93 + {
  94 + this->AntSwitch.input( );
  95 + wait_ms( 1 );
  96 + if( this->AntSwitch == 1 )
  97 + {
  98 + boardConnected = SX1276MB1LAS;
  99 + }
  100 + else
  101 + {
  102 + boardConnected = SX1276MB1MAS;
  103 + }
  104 + this->AntSwitch.output( );
  105 + wait_ms( 1 );
  106 + }
  107 + return ( boardConnected );
  108 +}
  109 +
  110 +void SX1276MB1xAS::IoInit( void )
  111 +{
  112 + AntSwInit( );
  113 + SpiInit( );
  114 +}
  115 +
  116 +void SX1276MB1xAS::RadioRegistersInit( )
  117 +{
  118 + uint8_t i = 0;
  119 + for( i = 0; i < sizeof( RadioRegsInit ) / sizeof( RadioRegisters_t ); i++ )
  120 + {
  121 + SetModem( RadioRegsInit[i].Modem );
  122 + Write( RadioRegsInit[i].Addr, RadioRegsInit[i].Value );
  123 + }
  124 +}
  125 +
  126 +void SX1276MB1xAS::SpiInit( void )
  127 +{
  128 + nss = 1;
  129 + spi.format( 8,0 );
  130 + uint32_t frequencyToSet = 8000000;
  131 + #if( defined ( TARGET_NUCLEO_L152RE ) || defined ( TARGET_LPC11U6X ) )
  132 + spi.frequency( frequencyToSet );
  133 + #elif( defined ( TARGET_KL25Z ) ) //busclock frequency is halved -> double the spi frequency to compensate
  134 + spi.frequency( frequencyToSet * 2 );
  135 + #else
  136 + #warning "Check the board's SPI frequency"
  137 + #endif
  138 + wait(0.1);
  139 +}
  140 +
  141 +void SX1276MB1xAS::IoIrqInit( DioIrqHandler *irqHandlers )
  142 +{
  143 +#if( defined ( TARGET_NUCLEO_L152RE ) || defined ( TARGET_LPC11U6X ) )
  144 + dio0.mode( PullDown );
  145 + dio1.mode( PullDown );
  146 + dio2.mode( PullDown );
  147 + dio3.mode( PullDown );
  148 + dio4.mode( PullDown );
  149 +#endif
  150 + dio0.rise( mbed::callback( this, static_cast< TriggerMB1xAS > ( irqHandlers[0] ) ) );
  151 + dio1.rise( mbed::callback( this, static_cast< TriggerMB1xAS > ( irqHandlers[1] ) ) );
  152 + dio2.rise( mbed::callback( this, static_cast< TriggerMB1xAS > ( irqHandlers[2] ) ) );
  153 + dio3.rise( mbed::callback( this, static_cast< TriggerMB1xAS > ( irqHandlers[3] ) ) );
  154 + dio4.rise( mbed::callback( this, static_cast< TriggerMB1xAS > ( irqHandlers[4] ) ) );
  155 +}
  156 +
  157 +void SX1276MB1xAS::IoDeInit( void )
  158 +{
  159 + //nothing
  160 +}
  161 +
  162 +void SX1276MB1xAS::SetRfTxPower( int8_t power )
  163 +{
  164 + uint8_t paConfig = 0;
  165 + uint8_t paDac = 0;
  166 +
  167 + paConfig = Read( REG_PACONFIG );
  168 + paDac = Read( REG_PADAC );
  169 +
  170 + paConfig = ( paConfig & RF_PACONFIG_PASELECT_MASK ) | GetPaSelect( this->settings.Channel );
  171 + paConfig = ( paConfig & RF_PACONFIG_MAX_POWER_MASK ) | 0x70;
  172 +
  173 + if( ( paConfig & RF_PACONFIG_PASELECT_PABOOST ) == RF_PACONFIG_PASELECT_PABOOST )
  174 + {
  175 + if( power > 17 )
  176 + {
  177 + paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_ON;
  178 + }
  179 + else
  180 + {
  181 + paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_OFF;
  182 + }
  183 + if( ( paDac & RF_PADAC_20DBM_ON ) == RF_PADAC_20DBM_ON )
  184 + {
  185 + if( power < 5 )
  186 + {
  187 + power = 5;
  188 + }
  189 + if( power > 20 )
  190 + {
  191 + power = 20;
  192 + }
  193 + paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 5 ) & 0x0F );
  194 + }
  195 + else
  196 + {
  197 + if( power < 2 )
  198 + {
  199 + power = 2;
  200 + }
  201 + if( power > 17 )
  202 + {
  203 + power = 17;
  204 + }
  205 + paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 2 ) & 0x0F );
  206 + }
  207 + }
  208 + else
  209 + {
  210 + if( power < -1 )
  211 + {
  212 + power = -1;
  213 + }
  214 + if( power > 14 )
  215 + {
  216 + power = 14;
  217 + }
  218 + paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power + 1 ) & 0x0F );
  219 + }
  220 + Write( REG_PACONFIG, paConfig );
  221 + Write( REG_PADAC, paDac );
  222 +}
  223 +
  224 +uint8_t SX1276MB1xAS::GetPaSelect( uint32_t channel )
  225 +{
  226 + if( channel > RF_MID_BAND_THRESH )
  227 + {
  228 + if( boardConnected == SX1276MB1LAS )
  229 + {
  230 + return RF_PACONFIG_PASELECT_PABOOST;
  231 + }
  232 + else
  233 + {
  234 + return RF_PACONFIG_PASELECT_RFO;
  235 + }
  236 + }
  237 + else
  238 + {
  239 + return RF_PACONFIG_PASELECT_RFO;
  240 + }
  241 +}
  242 +
  243 +void SX1276MB1xAS::SetAntSwLowPower( bool status )
  244 +{
  245 + if( isRadioActive != status )
  246 + {
  247 + isRadioActive = status;
  248 +
  249 + if( status == false )
  250 + {
  251 + AntSwInit( );
  252 + }
  253 + else
  254 + {
  255 + AntSwDeInit( );
  256 + }
  257 + }
  258 +}
  259 +
  260 +void SX1276MB1xAS::AntSwInit( void )
  261 +{
  262 + this->AntSwitch = 0;
  263 +}
  264 +
  265 +void SX1276MB1xAS::AntSwDeInit( void )
  266 +{
  267 + this->AntSwitch = 0;
  268 +}
  269 +
  270 +void SX1276MB1xAS::SetAntSw( uint8_t opMode )
  271 +{
  272 + switch( opMode )
  273 + {
  274 + case RFLR_OPMODE_TRANSMITTER:
  275 + this->AntSwitch = 1;
  276 + break;
  277 + case RFLR_OPMODE_RECEIVER:
  278 + case RFLR_OPMODE_RECEIVER_SINGLE:
  279 + case RFLR_OPMODE_CAD:
  280 + this->AntSwitch = 0;
  281 + break;
  282 + default:
  283 + this->AntSwitch = 0;
  284 + break;
  285 + }
  286 +}
  287 +
  288 +bool SX1276MB1xAS::CheckRfFrequency( uint32_t frequency )
  289 +{
  290 + // Implement check. Currently all frequencies are supported
  291 + return true;
  292 +}
  293 +
  294 +void SX1276MB1xAS::Reset( void )
  295 +{
  296 + reset.output( );
  297 + reset = 0;
  298 + wait_ms( 1 );
  299 + reset.input( );
  300 + wait_ms( 6 );
  301 +}
  302 +
  303 +void SX1276MB1xAS::Write( uint8_t addr, uint8_t data )
  304 +{
  305 + Write( addr, &data, 1 );
  306 +}
  307 +
  308 +uint8_t SX1276MB1xAS::Read( uint8_t addr )
  309 +{
  310 + uint8_t data;
  311 + Read( addr, &data, 1 );
  312 + return data;
  313 +}
  314 +
  315 +void SX1276MB1xAS::Write( uint8_t addr, uint8_t *buffer, uint8_t size )
  316 +{
  317 + uint8_t i;
  318 +
  319 + nss = 0;
  320 + spi.write( addr | 0x80 );
  321 + for( i = 0; i < size; i++ )
  322 + {
  323 + spi.write( buffer[i] );
  324 + }
  325 + nss = 1;
  326 +}
  327 +
  328 +void SX1276MB1xAS::Read( uint8_t addr, uint8_t *buffer, uint8_t size )
  329 +{
  330 + uint8_t i;
  331 +
  332 + nss = 0;
  333 + spi.write( addr & 0x7F );
  334 + for( i = 0; i < size; i++ )
  335 + {
  336 + buffer[i] = spi.write( 0 );
  337 + }
  338 + nss = 1;
  339 +}
  340 +
  341 +void SX1276MB1xAS::WriteFifo( uint8_t *buffer, uint8_t size )
  342 +{
  343 + Write( 0, buffer, size );
  344 +}
  345 +
  346 +void SX1276MB1xAS::ReadFifo( uint8_t *buffer, uint8_t size )
  347 +{
  348 + Read( 0, buffer, size );
  349 +}
... ...
recepteur/SX1276Lib/sx1276/sx1276-hal.h 0 → 100644
... ... @@ -0,0 +1,212 @@
  1 +/*
  2 + / _____) _ | |
  3 +( (____ _____ ____ _| |_ _____ ____| |__
  4 + \____ \| ___ | (_ _) ___ |/ ___) _ \
  5 + _____) ) ____| | | || |_| ____( (___| | | |
  6 +(______/|_____)_|_|_| \__)_____)\____)_| |_|
  7 + (C) 2014 Semtech
  8 +
  9 +Description: -
  10 +
  11 +License: Revised BSD License, see LICENSE.TXT file include in the project
  12 +
  13 +Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin
  14 +*/
  15 +#ifndef __SX1276_HAL_H__
  16 +#define __SX1276_HAL_H__
  17 +#include "sx1276.h"
  18 +
  19 +/*!
  20 + * @brief Radio hardware registers initialization definition
  21 + *
  22 + * @remark Can be automatically generated by the SX1276 GUI (not yet implemented)
  23 + */
  24 +#define RADIO_INIT_REGISTERS_VALUE \
  25 +{ \
  26 + { MODEM_FSK , REG_LNA , 0x23 },\
  27 + { MODEM_FSK , REG_RXCONFIG , 0x1E },\
  28 + { MODEM_FSK , REG_RSSICONFIG , 0xD2 },\
  29 + { MODEM_FSK , REG_AFCFEI , 0x01 },\
  30 + { MODEM_FSK , REG_PREAMBLEDETECT , 0xAA },\
  31 + { MODEM_FSK , REG_OSC , 0x07 },\
  32 + { MODEM_FSK , REG_SYNCCONFIG , 0x12 },\
  33 + { MODEM_FSK , REG_SYNCVALUE1 , 0xC1 },\
  34 + { MODEM_FSK , REG_SYNCVALUE2 , 0x94 },\
  35 + { MODEM_FSK , REG_SYNCVALUE3 , 0xC1 },\
  36 + { MODEM_FSK , REG_PACKETCONFIG1 , 0xD8 },\
  37 + { MODEM_FSK , REG_FIFOTHRESH , 0x8F },\
  38 + { MODEM_FSK , REG_IMAGECAL , 0x02 },\
  39 + { MODEM_FSK , REG_DIOMAPPING1 , 0x00 },\
  40 + { MODEM_FSK , REG_DIOMAPPING2 , 0x30 },\
  41 + { MODEM_LORA, REG_LR_PAYLOADMAXLENGTH, 0x40 },\
  42 +} \
  43 +
  44 +/*!
  45 + * Actual implementation of a SX1276 radio, includes some modifications to make it compatible with the MB1 LAS board
  46 + */
  47 +class SX1276MB1xAS : public SX1276
  48 +{
  49 +protected:
  50 + /*!
  51 + * Antenna switch GPIO pins objects
  52 + */
  53 + DigitalInOut AntSwitch;
  54 + DigitalIn Fake;
  55 +
  56 +private:
  57 + static const RadioRegisters_t RadioRegsInit[];
  58 +
  59 +public:
  60 + SX1276MB1xAS( RadioEvents_t *events,
  61 + PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset,
  62 + PinName dio0, PinName dio1, PinName dio2, PinName dio3, PinName dio4, PinName dio5,
  63 + PinName antSwitch );
  64 +
  65 + SX1276MB1xAS( RadioEvents_t *events );
  66 +
  67 + virtual ~SX1276MB1xAS( ) { };
  68 +
  69 +protected:
  70 + /*!
  71 + * @brief Initializes the radio I/Os pins interface
  72 + */
  73 + virtual void IoInit( void );
  74 +
  75 + /*!
  76 + * @brief Initializes the radio registers
  77 + */
  78 + virtual void RadioRegistersInit( );
  79 +
  80 + /*!
  81 + * @brief Initializes the radio SPI
  82 + */
  83 + virtual void SpiInit( void );
  84 +
  85 + /*!
  86 + * @brief Initializes DIO IRQ handlers
  87 + *
  88 + * @param [IN] irqHandlers Array containing the IRQ callback functions
  89 + */
  90 + virtual void IoIrqInit( DioIrqHandler *irqHandlers );
  91 +
  92 + /*!
  93 + * @brief De-initializes the radio I/Os pins interface.
  94 + *
  95 + * \remark Useful when going in MCU lowpower modes
  96 + */
  97 + virtual void IoDeInit( void );
  98 +
  99 + /*!
  100 + * \brief Sets the radio output power.
  101 + *
  102 + * @param [IN] power Sets the RF output power
  103 + */
  104 + virtual void SetRfTxPower( int8_t power );
  105 +
  106 + /*!
  107 + * @brief Gets the board PA selection configuration
  108 + *
  109 + * @param [IN] channel Channel frequency in Hz
  110 + * @retval PaSelect RegPaConfig PaSelect value
  111 + */
  112 + virtual uint8_t GetPaSelect( uint32_t channel );
  113 +
  114 + /*!
  115 + * @brief Set the RF Switch I/Os pins in Low Power mode
  116 + *
  117 + * @param [IN] status enable or disable
  118 + */
  119 + virtual void SetAntSwLowPower( bool status );
  120 +
  121 + /*!
  122 + * @brief Initializes the RF Switch I/Os pins interface
  123 + */
  124 + virtual void AntSwInit( void );
  125 +
  126 + /*!
  127 + * @brief De-initializes the RF Switch I/Os pins interface
  128 + *
  129 + * @remark Needed to decrease the power consumption in MCU lowpower modes
  130 + */
  131 + virtual void AntSwDeInit( void );
  132 +
  133 + /*!
  134 + * @brief Controls the antena switch if necessary.
  135 + *
  136 + * @remark see errata note
  137 + *
  138 + * @param [IN] opMode Current radio operating mode
  139 + */
  140 + virtual void SetAntSw( uint8_t opMode );
  141 +
  142 +public:
  143 + /*!
  144 + * @brief Detect the board connected by reading the value of the antenna switch pin
  145 + */
  146 + virtual uint8_t DetectBoardType( void );
  147 +
  148 + /*!
  149 + * @brief Checks if the given RF frequency is supported by the hardware
  150 + *
  151 + * @param [IN] frequency RF frequency to be checked
  152 + * @retval isSupported [true: supported, false: unsupported]
  153 + */
  154 + virtual bool CheckRfFrequency( uint32_t frequency );
  155 +
  156 + /*!
  157 + * @brief Writes the radio register at the specified address
  158 + *
  159 + * @param [IN]: addr Register address
  160 + * @param [IN]: data New register value
  161 + */
  162 + virtual void Write ( uint8_t addr, uint8_t data ) ;
  163 +
  164 + /*!
  165 + * @brief Reads the radio register at the specified address
  166 + *
  167 + * @param [IN]: addr Register address
  168 + * @retval data Register value
  169 + */
  170 + virtual uint8_t Read ( uint8_t addr ) ;
  171 +
  172 + /*!
  173 + * @brief Writes multiple radio registers starting at address
  174 + *
  175 + * @param [IN] addr First Radio register address
  176 + * @param [IN] buffer Buffer containing the new register's values
  177 + * @param [IN] size Number of registers to be written
  178 + */
  179 + virtual void Write( uint8_t addr, uint8_t *buffer, uint8_t size ) ;
  180 +
  181 + /*!
  182 + * @brief Reads multiple radio registers starting at address
  183 + *
  184 + * @param [IN] addr First Radio register address
  185 + * @param [OUT] buffer Buffer where to copy the registers data
  186 + * @param [IN] size Number of registers to be read
  187 + */
  188 + virtual void Read ( uint8_t addr, uint8_t *buffer, uint8_t size ) ;
  189 +
  190 + /*!
  191 + * @brief Writes the buffer contents to the SX1276 FIFO
  192 + *
  193 + * @param [IN] buffer Buffer containing data to be put on the FIFO.
  194 + * @param [IN] size Number of bytes to be written to the FIFO
  195 + */
  196 + virtual void WriteFifo( uint8_t *buffer, uint8_t size ) ;
  197 +
  198 + /*!
  199 + * @brief Reads the contents of the SX1276 FIFO
  200 + *
  201 + * @param [OUT] buffer Buffer where to copy the FIFO read data.
  202 + * @param [IN] size Number of bytes to be read from the FIFO
  203 + */
  204 + virtual void ReadFifo( uint8_t *buffer, uint8_t size ) ;
  205 +
  206 + /*!
  207 + * @brief Reset the SX1276
  208 + */
  209 + virtual void Reset( void );
  210 +};
  211 +
  212 +#endif // __SX1276_HAL_H__
... ...
recepteur/SX1276Lib/sx1276/sx1276.cpp 0 → 100644
... ... @@ -0,0 +1,1561 @@
  1 +/*
  2 + / _____) _ | |
  3 +( (____ _____ ____ _| |_ _____ ____| |__
  4 + \____ \| ___ | (_ _) ___ |/ ___) _ \
  5 + _____) ) ____| | | || |_| ____( (___| | | |
  6 +(______/|_____)_|_|_| \__)_____)\____)_| |_|
  7 + (C) 2014 Semtech
  8 +
  9 +Description: Actual implementation of a SX1276 radio, inherits Radio
  10 +
  11 +License: Revised BSD License, see LICENSE.TXT file include in the project
  12 +
  13 +Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin
  14 +*/
  15 +#include "sx1276.h"
  16 +
  17 +const FskBandwidth_t SX1276::FskBandwidths[] =
  18 +{
  19 + { 2600 , 0x17 },
  20 + { 3100 , 0x0F },
  21 + { 3900 , 0x07 },
  22 + { 5200 , 0x16 },
  23 + { 6300 , 0x0E },
  24 + { 7800 , 0x06 },
  25 + { 10400 , 0x15 },
  26 + { 12500 , 0x0D },
  27 + { 15600 , 0x05 },
  28 + { 20800 , 0x14 },
  29 + { 25000 , 0x0C },
  30 + { 31300 , 0x04 },
  31 + { 41700 , 0x13 },
  32 + { 50000 , 0x0B },
  33 + { 62500 , 0x03 },
  34 + { 83333 , 0x12 },
  35 + { 100000, 0x0A },
  36 + { 125000, 0x02 },
  37 + { 166700, 0x11 },
  38 + { 200000, 0x09 },
  39 + { 250000, 0x01 },
  40 + { 300000, 0x00 }, // Invalid Bandwidth
  41 +};
  42 +
  43 +
  44 +SX1276::SX1276( RadioEvents_t *events,
  45 + PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset,
  46 + PinName dio0, PinName dio1, PinName dio2, PinName dio3, PinName dio4, PinName dio5 )
  47 + : Radio( events ),
  48 + spi( mosi, miso, sclk ),
  49 + nss( nss ),
  50 + reset( reset ),
  51 + dio0( dio0 ), dio1( dio1 ), dio2( dio2 ), dio3( dio3 ), dio4( dio4 ), dio5( dio5 ),
  52 + isRadioActive( false )
  53 +{
  54 + wait_ms( 10 );
  55 + this->rxtxBuffer = new uint8_t[RX_BUFFER_SIZE];
  56 +
  57 + this->RadioEvents = events;
  58 +
  59 + this->dioIrq = new DioIrqHandler[6];
  60 +
  61 + this->dioIrq[0] = &SX1276::OnDio0Irq;
  62 + this->dioIrq[1] = &SX1276::OnDio1Irq;
  63 + this->dioIrq[2] = &SX1276::OnDio2Irq;
  64 + this->dioIrq[3] = &SX1276::OnDio3Irq;
  65 + this->dioIrq[4] = &SX1276::OnDio4Irq;
  66 + this->dioIrq[5] = NULL;
  67 +
  68 + this->settings.State = RF_IDLE;
  69 +}
  70 +
  71 +SX1276::~SX1276( )
  72 +{
  73 + delete this->rxtxBuffer;
  74 + delete this->dioIrq;
  75 +}
  76 +
  77 +void SX1276::Init( RadioEvents_t *events )
  78 +{
  79 + this->RadioEvents = events;
  80 +}
  81 +
  82 +RadioState SX1276::GetStatus( void )
  83 +{
  84 + return this->settings.State;
  85 +}
  86 +
  87 +void SX1276::SetChannel( uint32_t freq )
  88 +{
  89 + this->settings.Channel = freq;
  90 + freq = ( uint32_t )( ( double )freq / ( double )FREQ_STEP );
  91 + Write( REG_FRFMSB, ( uint8_t )( ( freq >> 16 ) & 0xFF ) );
  92 + Write( REG_FRFMID, ( uint8_t )( ( freq >> 8 ) & 0xFF ) );
  93 + Write( REG_FRFLSB, ( uint8_t )( freq & 0xFF ) );
  94 +}
  95 +
  96 +bool SX1276::IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh )
  97 +{
  98 + int16_t rssi = 0;
  99 +
  100 + SetModem( modem );
  101 +
  102 + SetChannel( freq );
  103 +
  104 + SetOpMode( RF_OPMODE_RECEIVER );
  105 +
  106 + wait_ms( 1 );
  107 +
  108 + rssi = GetRssi( modem );
  109 +
  110 + Sleep( );
  111 +
  112 + if( rssi > rssiThresh )
  113 + {
  114 + return false;
  115 + }
  116 + return true;
  117 +}
  118 +
  119 +uint32_t SX1276::Random( void )
  120 +{
  121 + uint8_t i;
  122 + uint32_t rnd = 0;
  123 +
  124 + /*
  125 + * Radio setup for random number generation
  126 + */
  127 + // Set LoRa modem ON
  128 + SetModem( MODEM_LORA );
  129 +
  130 + // Disable LoRa modem interrupts
  131 + Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
  132 + RFLR_IRQFLAGS_RXDONE |
  133 + RFLR_IRQFLAGS_PAYLOADCRCERROR |
  134 + RFLR_IRQFLAGS_VALIDHEADER |
  135 + RFLR_IRQFLAGS_TXDONE |
  136 + RFLR_IRQFLAGS_CADDONE |
  137 + RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
  138 + RFLR_IRQFLAGS_CADDETECTED );
  139 +
  140 + // Set radio in continuous reception
  141 + SetOpMode( RF_OPMODE_RECEIVER );
  142 +
  143 + for( i = 0; i < 32; i++ )
  144 + {
  145 + wait_ms( 1 );
  146 + // Unfiltered RSSI value reading. Only takes the LSB value
  147 + rnd |= ( ( uint32_t )Read( REG_LR_RSSIWIDEBAND ) & 0x01 ) << i;
  148 + }
  149 +
  150 + Sleep( );
  151 +
  152 + return rnd;
  153 +}
  154 +
  155 +/*!
  156 + * Performs the Rx chain calibration for LF and HF bands
  157 + * \remark Must be called just after the reset so all registers are at their
  158 + * default values
  159 + */
  160 +void SX1276::RxChainCalibration( void )
  161 +{
  162 + uint8_t regPaConfigInitVal;
  163 + uint32_t initialFreq;
  164 +
  165 + // Save context
  166 + regPaConfigInitVal = this->Read( REG_PACONFIG );
  167 + initialFreq = ( double )( ( ( uint32_t )this->Read( REG_FRFMSB ) << 16 ) |
  168 + ( ( uint32_t )this->Read( REG_FRFMID ) << 8 ) |
  169 + ( ( uint32_t )this->Read( REG_FRFLSB ) ) ) * ( double )FREQ_STEP;
  170 +
  171 + // Cut the PA just in case, RFO output, power = -1 dBm
  172 + this->Write( REG_PACONFIG, 0x00 );
  173 +
  174 + // Launch Rx chain calibration for LF band
  175 + Write ( REG_IMAGECAL, ( Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_MASK ) | RF_IMAGECAL_IMAGECAL_START );
  176 + while( ( Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_RUNNING ) == RF_IMAGECAL_IMAGECAL_RUNNING )
  177 + {
  178 + }
  179 +
  180 + // Sets a Frequency in HF band
  181 + SetChannel( 868000000 );
  182 +
  183 + // Launch Rx chain calibration for HF band
  184 + Write ( REG_IMAGECAL, ( Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_MASK ) | RF_IMAGECAL_IMAGECAL_START );
  185 + while( ( Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_RUNNING ) == RF_IMAGECAL_IMAGECAL_RUNNING )
  186 + {
  187 + }
  188 +
  189 + // Restore context
  190 + this->Write( REG_PACONFIG, regPaConfigInitVal );
  191 + SetChannel( initialFreq );
  192 +}
  193 +
  194 +/*!
  195 + * Returns the known FSK bandwidth registers value
  196 + *
  197 + * \param [IN] bandwidth Bandwidth value in Hz
  198 + * \retval regValue Bandwidth register value.
  199 + */
  200 +uint8_t SX1276::GetFskBandwidthRegValue( uint32_t bandwidth )
  201 +{
  202 + uint8_t i;
  203 +
  204 + for( i = 0; i < ( sizeof( FskBandwidths ) / sizeof( FskBandwidth_t ) ) - 1; i++ )
  205 + {
  206 + if( ( bandwidth >= FskBandwidths[i].bandwidth ) && ( bandwidth < FskBandwidths[i + 1].bandwidth ) )
  207 + {
  208 + return FskBandwidths[i].RegValue;
  209 + }
  210 + }
  211 + // ERROR: Value not found
  212 + while( 1 );
  213 +}
  214 +
  215 +void SX1276::SetRxConfig( RadioModems_t modem, uint32_t bandwidth,
  216 + uint32_t datarate, uint8_t coderate,
  217 + uint32_t bandwidthAfc, uint16_t preambleLen,
  218 + uint16_t symbTimeout, bool fixLen,
  219 + uint8_t payloadLen,
  220 + bool crcOn, bool freqHopOn, uint8_t hopPeriod,
  221 + bool iqInverted, bool rxContinuous )
  222 +{
  223 + SetModem( modem );
  224 +
  225 + switch( modem )
  226 + {
  227 + case MODEM_FSK:
  228 + {
  229 + this->settings.Fsk.Bandwidth = bandwidth;
  230 + this->settings.Fsk.Datarate = datarate;
  231 + this->settings.Fsk.BandwidthAfc = bandwidthAfc;
  232 + this->settings.Fsk.FixLen = fixLen;
  233 + this->settings.Fsk.PayloadLen = payloadLen;
  234 + this->settings.Fsk.CrcOn = crcOn;
  235 + this->settings.Fsk.IqInverted = iqInverted;
  236 + this->settings.Fsk.RxContinuous = rxContinuous;
  237 + this->settings.Fsk.PreambleLen = preambleLen;
  238 + this->settings.Fsk.RxSingleTimeout = symbTimeout * ( ( 1.0 / ( double )datarate ) * 8.0 ) * 1e3;
  239 +
  240 + datarate = ( uint16_t )( ( double )XTAL_FREQ / ( double )datarate );
  241 + Write( REG_BITRATEMSB, ( uint8_t )( datarate >> 8 ) );
  242 + Write( REG_BITRATELSB, ( uint8_t )( datarate & 0xFF ) );
  243 +
  244 + Write( REG_RXBW, GetFskBandwidthRegValue( bandwidth ) );
  245 + Write( REG_AFCBW, GetFskBandwidthRegValue( bandwidthAfc ) );
  246 +
  247 + Write( REG_PREAMBLEMSB, ( uint8_t )( ( preambleLen >> 8 ) & 0xFF ) );
  248 + Write( REG_PREAMBLELSB, ( uint8_t )( preambleLen & 0xFF ) );
  249 +
  250 + if( fixLen == 1 )
  251 + {
  252 + Write( REG_PAYLOADLENGTH, payloadLen );
  253 + }
  254 + else
  255 + {
  256 + Write( REG_PAYLOADLENGTH, 0xFF ); // Set payload length to the maximum
  257 + }
  258 +
  259 + Write( REG_PACKETCONFIG1,
  260 + ( Read( REG_PACKETCONFIG1 ) &
  261 + RF_PACKETCONFIG1_CRC_MASK &
  262 + RF_PACKETCONFIG1_PACKETFORMAT_MASK ) |
  263 + ( ( fixLen == 1 ) ? RF_PACKETCONFIG1_PACKETFORMAT_FIXED : RF_PACKETCONFIG1_PACKETFORMAT_VARIABLE ) |
  264 + ( crcOn << 4 ) );
  265 + Write( REG_PACKETCONFIG2, ( Read( REG_PACKETCONFIG2 ) | RF_PACKETCONFIG2_DATAMODE_PACKET ) );
  266 + }
  267 + break;
  268 + case MODEM_LORA:
  269 + {
  270 + if( bandwidth > 2 )
  271 + {
  272 + // Fatal error: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
  273 + while( 1 );
  274 + }
  275 + bandwidth += 7;
  276 + this->settings.LoRa.Bandwidth = bandwidth;
  277 + this->settings.LoRa.Datarate = datarate;
  278 + this->settings.LoRa.Coderate = coderate;
  279 + this->settings.LoRa.PreambleLen = preambleLen;
  280 + this->settings.LoRa.FixLen = fixLen;
  281 + this->settings.LoRa.PayloadLen = payloadLen;
  282 + this->settings.LoRa.CrcOn = crcOn;
  283 + this->settings.LoRa.FreqHopOn = freqHopOn;
  284 + this->settings.LoRa.HopPeriod = hopPeriod;
  285 + this->settings.LoRa.IqInverted = iqInverted;
  286 + this->settings.LoRa.RxContinuous = rxContinuous;
  287 +
  288 + if( datarate > 12 )
  289 + {
  290 + datarate = 12;
  291 + }
  292 + else if( datarate < 6 )
  293 + {
  294 + datarate = 6;
  295 + }
  296 +
  297 + if( ( ( bandwidth == 7 ) && ( ( datarate == 11 ) || ( datarate == 12 ) ) ) ||
  298 + ( ( bandwidth == 8 ) && ( datarate == 12 ) ) )
  299 + {
  300 + this->settings.LoRa.LowDatarateOptimize = 0x01;
  301 + }
  302 + else
  303 + {
  304 + this->settings.LoRa.LowDatarateOptimize = 0x00;
  305 + }
  306 +
  307 + Write( REG_LR_MODEMCONFIG1,
  308 + ( Read( REG_LR_MODEMCONFIG1 ) &
  309 + RFLR_MODEMCONFIG1_BW_MASK &
  310 + RFLR_MODEMCONFIG1_CODINGRATE_MASK &
  311 + RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK ) |
  312 + ( bandwidth << 4 ) | ( coderate << 1 ) |
  313 + fixLen );
  314 +
  315 + Write( REG_LR_MODEMCONFIG2,
  316 + ( Read( REG_LR_MODEMCONFIG2 ) &
  317 + RFLR_MODEMCONFIG2_SF_MASK &
  318 + RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK &
  319 + RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK ) |
  320 + ( datarate << 4 ) | ( crcOn << 2 ) |
  321 + ( ( symbTimeout >> 8 ) & ~RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK ) );
  322 +
  323 + Write( REG_LR_MODEMCONFIG3,
  324 + ( Read( REG_LR_MODEMCONFIG3 ) &
  325 + RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK ) |
  326 + ( this->settings.LoRa.LowDatarateOptimize << 3 ) );
  327 +
  328 + Write( REG_LR_SYMBTIMEOUTLSB, ( uint8_t )( symbTimeout & 0xFF ) );
  329 +
  330 + Write( REG_LR_PREAMBLEMSB, ( uint8_t )( ( preambleLen >> 8 ) & 0xFF ) );
  331 + Write( REG_LR_PREAMBLELSB, ( uint8_t )( preambleLen & 0xFF ) );
  332 +
  333 + if( fixLen == 1 )
  334 + {
  335 + Write( REG_LR_PAYLOADLENGTH, payloadLen );
  336 + }
  337 +
  338 + if( this->settings.LoRa.FreqHopOn == true )
  339 + {
  340 + Write( REG_LR_PLLHOP, ( Read( REG_LR_PLLHOP ) & RFLR_PLLHOP_FASTHOP_MASK ) | RFLR_PLLHOP_FASTHOP_ON );
  341 + Write( REG_LR_HOPPERIOD, this->settings.LoRa.HopPeriod );
  342 + }
  343 +
  344 + if( ( bandwidth == 9 ) && ( this->settings.Channel > RF_MID_BAND_THRESH ) )
  345 + {
  346 + // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
  347 + Write( REG_LR_TEST36, 0x02 );
  348 + Write( REG_LR_TEST3A, 0x64 );
  349 + }
  350 + else if( bandwidth == 9 )
  351 + {
  352 + // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
  353 + Write( REG_LR_TEST36, 0x02 );
  354 + Write( REG_LR_TEST3A, 0x7F );
  355 + }
  356 + else
  357 + {
  358 + // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
  359 + Write( REG_LR_TEST36, 0x03 );
  360 + }
  361 +
  362 + if( datarate == 6 )
  363 + {
  364 + Write( REG_LR_DETECTOPTIMIZE,
  365 + ( Read( REG_LR_DETECTOPTIMIZE ) &
  366 + RFLR_DETECTIONOPTIMIZE_MASK ) |
  367 + RFLR_DETECTIONOPTIMIZE_SF6 );
  368 + Write( REG_LR_DETECTIONTHRESHOLD,
  369 + RFLR_DETECTIONTHRESH_SF6 );
  370 + }
  371 + else
  372 + {
  373 + Write( REG_LR_DETECTOPTIMIZE,
  374 + ( Read( REG_LR_DETECTOPTIMIZE ) &
  375 + RFLR_DETECTIONOPTIMIZE_MASK ) |
  376 + RFLR_DETECTIONOPTIMIZE_SF7_TO_SF12 );
  377 + Write( REG_LR_DETECTIONTHRESHOLD,
  378 + RFLR_DETECTIONTHRESH_SF7_TO_SF12 );
  379 + }
  380 + }
  381 + break;
  382 + }
  383 +}
  384 +
  385 +void SX1276::SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
  386 + uint32_t bandwidth, uint32_t datarate,
  387 + uint8_t coderate, uint16_t preambleLen,
  388 + bool fixLen, bool crcOn, bool freqHopOn,
  389 + uint8_t hopPeriod, bool iqInverted, uint32_t timeout )
  390 +{
  391 + SetModem( modem );
  392 +
  393 + SetRfTxPower( power );
  394 +
  395 + switch( modem )
  396 + {
  397 + case MODEM_FSK:
  398 + {
  399 + this->settings.Fsk.Power = power;
  400 + this->settings.Fsk.Fdev = fdev;
  401 + this->settings.Fsk.Bandwidth = bandwidth;
  402 + this->settings.Fsk.Datarate = datarate;
  403 + this->settings.Fsk.PreambleLen = preambleLen;
  404 + this->settings.Fsk.FixLen = fixLen;
  405 + this->settings.Fsk.CrcOn = crcOn;
  406 + this->settings.Fsk.IqInverted = iqInverted;
  407 + this->settings.Fsk.TxTimeout = timeout;
  408 +
  409 + fdev = ( uint16_t )( ( double )fdev / ( double )FREQ_STEP );
  410 + Write( REG_FDEVMSB, ( uint8_t )( fdev >> 8 ) );
  411 + Write( REG_FDEVLSB, ( uint8_t )( fdev & 0xFF ) );
  412 +
  413 + datarate = ( uint16_t )( ( double )XTAL_FREQ / ( double )datarate );
  414 + Write( REG_BITRATEMSB, ( uint8_t )( datarate >> 8 ) );
  415 + Write( REG_BITRATELSB, ( uint8_t )( datarate & 0xFF ) );
  416 +
  417 + Write( REG_PREAMBLEMSB, ( preambleLen >> 8 ) & 0x00FF );
  418 + Write( REG_PREAMBLELSB, preambleLen & 0xFF );
  419 +
  420 + Write( REG_PACKETCONFIG1,
  421 + ( Read( REG_PACKETCONFIG1 ) &
  422 + RF_PACKETCONFIG1_CRC_MASK &
  423 + RF_PACKETCONFIG1_PACKETFORMAT_MASK ) |
  424 + ( ( fixLen == 1 ) ? RF_PACKETCONFIG1_PACKETFORMAT_FIXED : RF_PACKETCONFIG1_PACKETFORMAT_VARIABLE ) |
  425 + ( crcOn << 4 ) );
  426 + Write( REG_PACKETCONFIG2, ( Read( REG_PACKETCONFIG2 ) | RF_PACKETCONFIG2_DATAMODE_PACKET ) );
  427 + }
  428 + break;
  429 + case MODEM_LORA:
  430 + {
  431 + this->settings.LoRa.Power = power;
  432 + if( bandwidth > 2 )
  433 + {
  434 + // Fatal error: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
  435 + while( 1 );
  436 + }
  437 + bandwidth += 7;
  438 + this->settings.LoRa.Bandwidth = bandwidth;
  439 + this->settings.LoRa.Datarate = datarate;
  440 + this->settings.LoRa.Coderate = coderate;
  441 + this->settings.LoRa.PreambleLen = preambleLen;
  442 + this->settings.LoRa.FixLen = fixLen;
  443 + this->settings.LoRa.FreqHopOn = freqHopOn;
  444 + this->settings.LoRa.HopPeriod = hopPeriod;
  445 + this->settings.LoRa.CrcOn = crcOn;
  446 + this->settings.LoRa.IqInverted = iqInverted;
  447 + this->settings.LoRa.TxTimeout = timeout;
  448 +
  449 + if( datarate > 12 )
  450 + {
  451 + datarate = 12;
  452 + }
  453 + else if( datarate < 6 )
  454 + {
  455 + datarate = 6;
  456 + }
  457 + if( ( ( bandwidth == 7 ) && ( ( datarate == 11 ) || ( datarate == 12 ) ) ) ||
  458 + ( ( bandwidth == 8 ) && ( datarate == 12 ) ) )
  459 + {
  460 + this->settings.LoRa.LowDatarateOptimize = 0x01;
  461 + }
  462 + else
  463 + {
  464 + this->settings.LoRa.LowDatarateOptimize = 0x00;
  465 + }
  466 +
  467 + if( this->settings.LoRa.FreqHopOn == true )
  468 + {
  469 + Write( REG_LR_PLLHOP, ( Read( REG_LR_PLLHOP ) & RFLR_PLLHOP_FASTHOP_MASK ) | RFLR_PLLHOP_FASTHOP_ON );
  470 + Write( REG_LR_HOPPERIOD, this->settings.LoRa.HopPeriod );
  471 + }
  472 +
  473 + Write( REG_LR_MODEMCONFIG1,
  474 + ( Read( REG_LR_MODEMCONFIG1 ) &
  475 + RFLR_MODEMCONFIG1_BW_MASK &
  476 + RFLR_MODEMCONFIG1_CODINGRATE_MASK &
  477 + RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK ) |
  478 + ( bandwidth << 4 ) | ( coderate << 1 ) |
  479 + fixLen );
  480 +
  481 + Write( REG_LR_MODEMCONFIG2,
  482 + ( Read( REG_LR_MODEMCONFIG2 ) &
  483 + RFLR_MODEMCONFIG2_SF_MASK &
  484 + RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK ) |
  485 + ( datarate << 4 ) | ( crcOn << 2 ) );
  486 +
  487 + Write( REG_LR_MODEMCONFIG3,
  488 + ( Read( REG_LR_MODEMCONFIG3 ) &
  489 + RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK ) |
  490 + ( this->settings.LoRa.LowDatarateOptimize << 3 ) );
  491 +
  492 + Write( REG_LR_PREAMBLEMSB, ( preambleLen >> 8 ) & 0x00FF );
  493 + Write( REG_LR_PREAMBLELSB, preambleLen & 0xFF );
  494 +
  495 + if( datarate == 6 )
  496 + {
  497 + Write( REG_LR_DETECTOPTIMIZE,
  498 + ( Read( REG_LR_DETECTOPTIMIZE ) &
  499 + RFLR_DETECTIONOPTIMIZE_MASK ) |
  500 + RFLR_DETECTIONOPTIMIZE_SF6 );
  501 + Write( REG_LR_DETECTIONTHRESHOLD,
  502 + RFLR_DETECTIONTHRESH_SF6 );
  503 + }
  504 + else
  505 + {
  506 + Write( REG_LR_DETECTOPTIMIZE,
  507 + ( Read( REG_LR_DETECTOPTIMIZE ) &
  508 + RFLR_DETECTIONOPTIMIZE_MASK ) |
  509 + RFLR_DETECTIONOPTIMIZE_SF7_TO_SF12 );
  510 + Write( REG_LR_DETECTIONTHRESHOLD,
  511 + RFLR_DETECTIONTHRESH_SF7_TO_SF12 );
  512 + }
  513 + }
  514 + break;
  515 + }
  516 +}
  517 +
  518 +uint32_t SX1276::TimeOnAir( RadioModems_t modem, uint8_t pktLen )
  519 +{
  520 + uint32_t airTime = 0;
  521 +
  522 + switch( modem )
  523 + {
  524 + case MODEM_FSK:
  525 + {
  526 + airTime = rint( ( 8 * ( this->settings.Fsk.PreambleLen +
  527 + ( ( Read( REG_SYNCCONFIG ) & ~RF_SYNCCONFIG_SYNCSIZE_MASK ) + 1 ) +
  528 + ( ( this->settings.Fsk.FixLen == 0x01 ) ? 0.0 : 1.0 ) +
  529 + ( ( ( Read( REG_PACKETCONFIG1 ) & ~RF_PACKETCONFIG1_ADDRSFILTERING_MASK ) != 0x00 ) ? 1.0 : 0 ) +
  530 + pktLen +
  531 + ( ( this->settings.Fsk.CrcOn == 0x01 ) ? 2.0 : 0 ) ) /
  532 + this->settings.Fsk.Datarate ) * 1e3 );
  533 + }
  534 + break;
  535 + case MODEM_LORA:
  536 + {
  537 + double bw = 0.0;
  538 + // REMARK: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
  539 + switch( this->settings.LoRa.Bandwidth )
  540 + {
  541 + //case 0: // 7.8 kHz
  542 + // bw = 78e2;
  543 + // break;
  544 + //case 1: // 10.4 kHz
  545 + // bw = 104e2;
  546 + // break;
  547 + //case 2: // 15.6 kHz
  548 + // bw = 156e2;
  549 + // break;
  550 + //case 3: // 20.8 kHz
  551 + // bw = 208e2;
  552 + // break;
  553 + //case 4: // 31.2 kHz
  554 + // bw = 312e2;
  555 + // break;
  556 + //case 5: // 41.4 kHz
  557 + // bw = 414e2;
  558 + // break;
  559 + //case 6: // 62.5 kHz
  560 + // bw = 625e2;
  561 + // break;
  562 + case 7: // 125 kHz
  563 + bw = 125e3;
  564 + break;
  565 + case 8: // 250 kHz
  566 + bw = 250e3;
  567 + break;
  568 + case 9: // 500 kHz
  569 + bw = 500e3;
  570 + break;
  571 + }
  572 +
  573 + // Symbol rate : time for one symbol (secs)
  574 + double rs = bw / ( 1 << this->settings.LoRa.Datarate );
  575 + double ts = 1 / rs;
  576 + // time of preamble
  577 + double tPreamble = ( this->settings.LoRa.PreambleLen + 4.25 ) * ts;
  578 + // Symbol length of payload and time
  579 + double tmp = ceil( ( 8 * pktLen - 4 * this->settings.LoRa.Datarate +
  580 + 28 + 16 * this->settings.LoRa.CrcOn -
  581 + ( this->settings.LoRa.FixLen ? 20 : 0 ) ) /
  582 + ( double )( 4 * ( this->settings.LoRa.Datarate -
  583 + ( ( this->settings.LoRa.LowDatarateOptimize > 0 ) ? 2 : 0 ) ) ) ) *
  584 + ( this->settings.LoRa.Coderate + 4 );
  585 + double nPayload = 8 + ( ( tmp > 0 ) ? tmp : 0 );
  586 + double tPayload = nPayload * ts;
  587 + // Time on air
  588 + double tOnAir = tPreamble + tPayload;
  589 + // return ms secs
  590 + airTime = floor( tOnAir * 1e3 + 0.999 );
  591 + }
  592 + break;
  593 + }
  594 + return airTime;
  595 +}
  596 +
  597 +void SX1276::Send( uint8_t *buffer, uint8_t size )
  598 +{
  599 + uint32_t txTimeout = 0;
  600 +
  601 + switch( this->settings.Modem )
  602 + {
  603 + case MODEM_FSK:
  604 + {
  605 + this->settings.FskPacketHandler.NbBytes = 0;
  606 + this->settings.FskPacketHandler.Size = size;
  607 +
  608 + if( this->settings.Fsk.FixLen == false )
  609 + {
  610 + WriteFifo( ( uint8_t* )&size, 1 );
  611 + }
  612 + else
  613 + {
  614 + Write( REG_PAYLOADLENGTH, size );
  615 + }
  616 +
  617 + if( ( size > 0 ) && ( size <= 64 ) )
  618 + {
  619 + this->settings.FskPacketHandler.ChunkSize = size;
  620 + }
  621 + else
  622 + {
  623 + memcpy( rxtxBuffer, buffer, size );
  624 + this->settings.FskPacketHandler.ChunkSize = 32;
  625 + }
  626 +
  627 + // Write payload buffer
  628 + WriteFifo( buffer, this->settings.FskPacketHandler.ChunkSize );
  629 + this->settings.FskPacketHandler.NbBytes += this->settings.FskPacketHandler.ChunkSize;
  630 + txTimeout = this->settings.Fsk.TxTimeout;
  631 + }
  632 + break;
  633 + case MODEM_LORA:
  634 + {
  635 + if( this->settings.LoRa.IqInverted == true )
  636 + {
  637 + Write( REG_LR_INVERTIQ, ( ( Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_ON ) );
  638 + Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_ON );
  639 + }
  640 + else
  641 + {
  642 + Write( REG_LR_INVERTIQ, ( ( Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_OFF ) );
  643 + Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_OFF );
  644 + }
  645 +
  646 + this->settings.LoRaPacketHandler.Size = size;
  647 +
  648 + // Initializes the payload size
  649 + Write( REG_LR_PAYLOADLENGTH, size );
  650 +
  651 + // Full buffer used for Tx
  652 + Write( REG_LR_FIFOTXBASEADDR, 0 );
  653 + Write( REG_LR_FIFOADDRPTR, 0 );
  654 +
  655 + // FIFO operations can not take place in Sleep mode
  656 + if( ( Read( REG_OPMODE ) & ~RF_OPMODE_MASK ) == RF_OPMODE_SLEEP )
  657 + {
  658 + Standby( );
  659 + wait_ms( 1 );
  660 + }
  661 + // Write payload buffer
  662 + WriteFifo( buffer, size );
  663 + txTimeout = this->settings.LoRa.TxTimeout;
  664 + }
  665 + break;
  666 + }
  667 +
  668 + Tx( txTimeout );
  669 +}
  670 +
  671 +void SX1276::Sleep( void )
  672 +{
  673 + txTimeoutTimer.detach( );
  674 + rxTimeoutTimer.detach( );
  675 +
  676 + SetOpMode( RF_OPMODE_SLEEP );
  677 + this->settings.State = RF_IDLE;
  678 +}
  679 +
  680 +void SX1276::Standby( void )
  681 +{
  682 + txTimeoutTimer.detach( );
  683 + rxTimeoutTimer.detach( );
  684 +
  685 + SetOpMode( RF_OPMODE_STANDBY );
  686 + this->settings.State = RF_IDLE;
  687 +}
  688 +
  689 +void SX1276::Rx( uint32_t timeout )
  690 +{
  691 + bool rxContinuous = false;
  692 +
  693 + switch( this->settings.Modem )
  694 + {
  695 + case MODEM_FSK:
  696 + {
  697 + rxContinuous = this->settings.Fsk.RxContinuous;
  698 +
  699 + // DIO0=PayloadReady
  700 + // DIO1=FifoLevel
  701 + // DIO2=SyncAddr
  702 + // DIO3=FifoEmpty
  703 + // DIO4=Preamble
  704 + // DIO5=ModeReady
  705 + Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RF_DIOMAPPING1_DIO0_MASK &
  706 + RF_DIOMAPPING1_DIO1_MASK &
  707 + RF_DIOMAPPING1_DIO2_MASK ) |
  708 + RF_DIOMAPPING1_DIO0_00 |
  709 + RF_DIOMAPPING1_DIO1_00 |
  710 + RF_DIOMAPPING1_DIO2_11 );
  711 +
  712 + Write( REG_DIOMAPPING2, ( Read( REG_DIOMAPPING2 ) & RF_DIOMAPPING2_DIO4_MASK &
  713 + RF_DIOMAPPING2_MAP_MASK ) |
  714 + RF_DIOMAPPING2_DIO4_11 |
  715 + RF_DIOMAPPING2_MAP_PREAMBLEDETECT );
  716 +
  717 + this->settings.FskPacketHandler.FifoThresh = Read( REG_FIFOTHRESH ) & 0x3F;
  718 +
  719 + Write( REG_RXCONFIG, RF_RXCONFIG_AFCAUTO_ON | RF_RXCONFIG_AGCAUTO_ON | RF_RXCONFIG_RXTRIGER_PREAMBLEDETECT );
  720 +
  721 + this->settings.FskPacketHandler.PreambleDetected = false;
  722 + this->settings.FskPacketHandler.SyncWordDetected = false;
  723 + this->settings.FskPacketHandler.NbBytes = 0;
  724 + this->settings.FskPacketHandler.Size = 0;
  725 + }
  726 + break;
  727 + case MODEM_LORA:
  728 + {
  729 + if( this->settings.LoRa.IqInverted == true )
  730 + {
  731 + Write( REG_LR_INVERTIQ, ( ( Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_ON | RFLR_INVERTIQ_TX_OFF ) );
  732 + Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_ON );
  733 + }
  734 + else
  735 + {
  736 + Write( REG_LR_INVERTIQ, ( ( Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_OFF ) );
  737 + Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_OFF );
  738 + }
  739 +
  740 + // ERRATA 2.3 - Receiver Spurious Reception of a LoRa Signal
  741 + if( this->settings.LoRa.Bandwidth < 9 )
  742 + {
  743 + Write( REG_LR_DETECTOPTIMIZE, Read( REG_LR_DETECTOPTIMIZE ) & 0x7F );
  744 + Write( REG_LR_TEST30, 0x00 );
  745 + switch( this->settings.LoRa.Bandwidth )
  746 + {
  747 + case 0: // 7.8 kHz
  748 + Write( REG_LR_TEST2F, 0x48 );
  749 + SetChannel(this->settings.Channel + 7.81e3 );
  750 + break;
  751 + case 1: // 10.4 kHz
  752 + Write( REG_LR_TEST2F, 0x44 );
  753 + SetChannel(this->settings.Channel + 10.42e3 );
  754 + break;
  755 + case 2: // 15.6 kHz
  756 + Write( REG_LR_TEST2F, 0x44 );
  757 + SetChannel(this->settings.Channel + 15.62e3 );
  758 + break;
  759 + case 3: // 20.8 kHz
  760 + Write( REG_LR_TEST2F, 0x44 );
  761 + SetChannel(this->settings.Channel + 20.83e3 );
  762 + break;
  763 + case 4: // 31.2 kHz
  764 + Write( REG_LR_TEST2F, 0x44 );
  765 + SetChannel(this->settings.Channel + 31.25e3 );
  766 + break;
  767 + case 5: // 41.4 kHz
  768 + Write( REG_LR_TEST2F, 0x44 );
  769 + SetChannel(this->settings.Channel + 41.67e3 );
  770 + break;
  771 + case 6: // 62.5 kHz
  772 + Write( REG_LR_TEST2F, 0x40 );
  773 + break;
  774 + case 7: // 125 kHz
  775 + Write( REG_LR_TEST2F, 0x40 );
  776 + break;
  777 + case 8: // 250 kHz
  778 + Write( REG_LR_TEST2F, 0x40 );
  779 + break;
  780 + }
  781 + }
  782 + else
  783 + {
  784 + Write( REG_LR_DETECTOPTIMIZE, Read( REG_LR_DETECTOPTIMIZE ) | 0x80 );
  785 + }
  786 +
  787 + rxContinuous = this->settings.LoRa.RxContinuous;
  788 +
  789 + if( this->settings.LoRa.FreqHopOn == true )
  790 + {
  791 + Write( REG_LR_IRQFLAGSMASK, //RFLR_IRQFLAGS_RXTIMEOUT |
  792 + //RFLR_IRQFLAGS_RXDONE |
  793 + //RFLR_IRQFLAGS_PAYLOADCRCERROR |
  794 + RFLR_IRQFLAGS_VALIDHEADER |
  795 + RFLR_IRQFLAGS_TXDONE |
  796 + RFLR_IRQFLAGS_CADDONE |
  797 + //RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
  798 + RFLR_IRQFLAGS_CADDETECTED );
  799 +
  800 + // DIO0=RxDone, DIO2=FhssChangeChannel
  801 + Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK & RFLR_DIOMAPPING1_DIO2_MASK ) | RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO2_00 );
  802 + }
  803 + else
  804 + {
  805 + Write( REG_LR_IRQFLAGSMASK, //RFLR_IRQFLAGS_RXTIMEOUT |
  806 + //RFLR_IRQFLAGS_RXDONE |
  807 + //RFLR_IRQFLAGS_PAYLOADCRCERROR |
  808 + RFLR_IRQFLAGS_VALIDHEADER |
  809 + RFLR_IRQFLAGS_TXDONE |
  810 + RFLR_IRQFLAGS_CADDONE |
  811 + RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
  812 + RFLR_IRQFLAGS_CADDETECTED );
  813 +
  814 + // DIO0=RxDone
  815 + Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_00 );
  816 + }
  817 + Write( REG_LR_FIFORXBASEADDR, 0 );
  818 + Write( REG_LR_FIFOADDRPTR, 0 );
  819 + }
  820 + break;
  821 + }
  822 +
  823 + memset( rxtxBuffer, 0, ( size_t )RX_BUFFER_SIZE );
  824 +
  825 + this->settings.State = RF_RX_RUNNING;
  826 + if( timeout != 0 )
  827 + {
  828 + rxTimeoutTimer.attach_us( mbed::callback( this, &SX1276::OnTimeoutIrq ), timeout * 1e3 );
  829 + }
  830 +
  831 + if( this->settings.Modem == MODEM_FSK )
  832 + {
  833 + SetOpMode( RF_OPMODE_RECEIVER );
  834 +
  835 + if( rxContinuous == false )
  836 + {
  837 + rxTimeoutSyncWord.attach_us( mbed::callback( this, &SX1276::OnTimeoutIrq ),
  838 + this->settings.Fsk.RxSingleTimeout * 1e3 );
  839 + }
  840 + }
  841 + else
  842 + {
  843 + if( rxContinuous == true )
  844 + {
  845 + SetOpMode( RFLR_OPMODE_RECEIVER );
  846 + }
  847 + else
  848 + {
  849 + SetOpMode( RFLR_OPMODE_RECEIVER_SINGLE );
  850 + }
  851 + }
  852 +}
  853 +
  854 +void SX1276::Tx( uint32_t timeout )
  855 +{
  856 +
  857 + switch( this->settings.Modem )
  858 + {
  859 + case MODEM_FSK:
  860 + {
  861 + // DIO0=PacketSent
  862 + // DIO1=FifoEmpty
  863 + // DIO2=FifoFull
  864 + // DIO3=FifoEmpty
  865 + // DIO4=LowBat
  866 + // DIO5=ModeReady
  867 + Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RF_DIOMAPPING1_DIO0_MASK &
  868 + RF_DIOMAPPING1_DIO1_MASK &
  869 + RF_DIOMAPPING1_DIO2_MASK ) |
  870 + RF_DIOMAPPING1_DIO1_01 );
  871 +
  872 + Write( REG_DIOMAPPING2, ( Read( REG_DIOMAPPING2 ) & RF_DIOMAPPING2_DIO4_MASK &
  873 + RF_DIOMAPPING2_MAP_MASK ) );
  874 + this->settings.FskPacketHandler.FifoThresh = Read( REG_FIFOTHRESH ) & 0x3F;
  875 + }
  876 + break;
  877 + case MODEM_LORA:
  878 + {
  879 + if( this->settings.LoRa.FreqHopOn == true )
  880 + {
  881 + Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
  882 + RFLR_IRQFLAGS_RXDONE |
  883 + RFLR_IRQFLAGS_PAYLOADCRCERROR |
  884 + RFLR_IRQFLAGS_VALIDHEADER |
  885 + //RFLR_IRQFLAGS_TXDONE |
  886 + RFLR_IRQFLAGS_CADDONE |
  887 + //RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
  888 + RFLR_IRQFLAGS_CADDETECTED );
  889 +
  890 + // DIO0=TxDone, DIO2=FhssChangeChannel
  891 + Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK & RFLR_DIOMAPPING1_DIO2_MASK ) | RFLR_DIOMAPPING1_DIO0_01 | RFLR_DIOMAPPING1_DIO2_00 );
  892 + }
  893 + else
  894 + {
  895 + Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
  896 + RFLR_IRQFLAGS_RXDONE |
  897 + RFLR_IRQFLAGS_PAYLOADCRCERROR |
  898 + RFLR_IRQFLAGS_VALIDHEADER |
  899 + //RFLR_IRQFLAGS_TXDONE |
  900 + RFLR_IRQFLAGS_CADDONE |
  901 + RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
  902 + RFLR_IRQFLAGS_CADDETECTED );
  903 +
  904 + // DIO0=TxDone
  905 + Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_01 );
  906 + }
  907 + }
  908 + break;
  909 + }
  910 +
  911 + this->settings.State = RF_TX_RUNNING;
  912 + txTimeoutTimer.attach_us( mbed::callback( this, &SX1276::OnTimeoutIrq ), timeout * 1e3 );
  913 + SetOpMode( RF_OPMODE_TRANSMITTER );
  914 +}
  915 +
  916 +void SX1276::StartCad( void )
  917 +{
  918 + switch( this->settings.Modem )
  919 + {
  920 + case MODEM_FSK:
  921 + {
  922 +
  923 + }
  924 + break;
  925 + case MODEM_LORA:
  926 + {
  927 + Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
  928 + RFLR_IRQFLAGS_RXDONE |
  929 + RFLR_IRQFLAGS_PAYLOADCRCERROR |
  930 + RFLR_IRQFLAGS_VALIDHEADER |
  931 + RFLR_IRQFLAGS_TXDONE |
  932 + //RFLR_IRQFLAGS_CADDONE |
  933 + RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL // |
  934 + //RFLR_IRQFLAGS_CADDETECTED
  935 + );
  936 +
  937 + // DIO3=CADDone
  938 + Write( REG_DIOMAPPING1, ( Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO3_MASK ) | RFLR_DIOMAPPING1_DIO3_00 );
  939 +
  940 + this->settings.State = RF_CAD;
  941 + SetOpMode( RFLR_OPMODE_CAD );
  942 + }
  943 + break;
  944 + default:
  945 + break;
  946 + }
  947 +}
  948 +
  949 +void SX1276::SetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time )
  950 +{
  951 + uint32_t timeout = ( uint32_t )( time * 1e6 );
  952 +
  953 + SetChannel( freq );
  954 +
  955 + SetTxConfig( MODEM_FSK, power, 0, 0, 4800, 0, 5, false, false, 0, 0, 0, timeout );
  956 +
  957 + Write( REG_PACKETCONFIG2, ( Read( REG_PACKETCONFIG2 ) & RF_PACKETCONFIG2_DATAMODE_MASK ) );
  958 + // Disable radio interrupts
  959 + Write( REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_11 | RF_DIOMAPPING1_DIO1_11 );
  960 + Write( REG_DIOMAPPING2, RF_DIOMAPPING2_DIO4_10 | RF_DIOMAPPING2_DIO5_10 );
  961 +
  962 + this->settings.State = RF_TX_RUNNING;
  963 + txTimeoutTimer.attach_us( mbed::callback( this, &SX1276::OnTimeoutIrq ), timeout );
  964 + SetOpMode( RF_OPMODE_TRANSMITTER );
  965 +}
  966 +
  967 +int16_t SX1276::GetRssi( RadioModems_t modem )
  968 +{
  969 + int16_t rssi = 0;
  970 +
  971 + switch( modem )
  972 + {
  973 + case MODEM_FSK:
  974 + rssi = -( Read( REG_RSSIVALUE ) >> 1 );
  975 + break;
  976 + case MODEM_LORA:
  977 + if( this->settings.Channel > RF_MID_BAND_THRESH )
  978 + {
  979 + rssi = RSSI_OFFSET_HF + Read( REG_LR_RSSIVALUE );
  980 + }
  981 + else
  982 + {
  983 + rssi = RSSI_OFFSET_LF + Read( REG_LR_RSSIVALUE );
  984 + }
  985 + break;
  986 + default:
  987 + rssi = -1;
  988 + break;
  989 + }
  990 + return rssi;
  991 +}
  992 +
  993 +void SX1276::SetOpMode( uint8_t opMode )
  994 +{
  995 + if( opMode == RF_OPMODE_SLEEP )
  996 + {
  997 + SetAntSwLowPower( true );
  998 + }
  999 + else
  1000 + {
  1001 + SetAntSwLowPower( false );
  1002 + SetAntSw( opMode );
  1003 + }
  1004 + Write( REG_OPMODE, ( Read( REG_OPMODE ) & RF_OPMODE_MASK ) | opMode );
  1005 +}
  1006 +
  1007 +void SX1276::SetModem( RadioModems_t modem )
  1008 +{
  1009 + if( ( Read( REG_OPMODE ) & RFLR_OPMODE_LONGRANGEMODE_ON ) != 0 )
  1010 + {
  1011 + this->settings.Modem = MODEM_LORA;
  1012 + }
  1013 + else
  1014 + {
  1015 + this->settings.Modem = MODEM_FSK;
  1016 + }
  1017 +
  1018 + if( this->settings.Modem == modem )
  1019 + {
  1020 + return;
  1021 + }
  1022 +
  1023 + this->settings.Modem = modem;
  1024 + switch( this->settings.Modem )
  1025 + {
  1026 + default:
  1027 + case MODEM_FSK:
  1028 + Sleep( );
  1029 + Write( REG_OPMODE, ( Read( REG_OPMODE ) & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_OFF );
  1030 +
  1031 + Write( REG_DIOMAPPING1, 0x00 );
  1032 + Write( REG_DIOMAPPING2, 0x30 ); // DIO5=ModeReady
  1033 + break;
  1034 + case MODEM_LORA:
  1035 + Sleep( );
  1036 + Write( REG_OPMODE, ( Read( REG_OPMODE ) & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_ON );
  1037 +
  1038 + Write( REG_DIOMAPPING1, 0x00 );
  1039 + Write( REG_DIOMAPPING2, 0x00 );
  1040 + break;
  1041 + }
  1042 +}
  1043 +
  1044 +void SX1276::SetMaxPayloadLength( RadioModems_t modem, uint8_t max )
  1045 +{
  1046 + this->SetModem( modem );
  1047 +
  1048 + switch( modem )
  1049 + {
  1050 + case MODEM_FSK:
  1051 + if( this->settings.Fsk.FixLen == false )
  1052 + {
  1053 + this->Write( REG_PAYLOADLENGTH, max );
  1054 + }
  1055 + break;
  1056 + case MODEM_LORA:
  1057 + this->Write( REG_LR_PAYLOADMAXLENGTH, max );
  1058 + break;
  1059 + }
  1060 +}
  1061 +
  1062 +void SX1276::SetPublicNetwork( bool enable )
  1063 +{
  1064 + SetModem( MODEM_LORA );
  1065 + this->settings.LoRa.PublicNetwork = enable;
  1066 + if( enable == true )
  1067 + {
  1068 + // Change LoRa modem SyncWord
  1069 + Write( REG_LR_SYNCWORD, LORA_MAC_PUBLIC_SYNCWORD );
  1070 + }
  1071 + else
  1072 + {
  1073 + // Change LoRa modem SyncWord
  1074 + Write( REG_LR_SYNCWORD, LORA_MAC_PRIVATE_SYNCWORD );
  1075 + }
  1076 +}
  1077 +
  1078 +void SX1276::OnTimeoutIrq( void )
  1079 +{
  1080 + switch( this->settings.State )
  1081 + {
  1082 + case RF_RX_RUNNING:
  1083 + if( this->settings.Modem == MODEM_FSK )
  1084 + {
  1085 + this->settings.FskPacketHandler.PreambleDetected = false;
  1086 + this->settings.FskPacketHandler.SyncWordDetected = false;
  1087 + this->settings.FskPacketHandler.NbBytes = 0;
  1088 + this->settings.FskPacketHandler.Size = 0;
  1089 +
  1090 + // Clear Irqs
  1091 + Write( REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
  1092 + RF_IRQFLAGS1_PREAMBLEDETECT |
  1093 + RF_IRQFLAGS1_SYNCADDRESSMATCH );
  1094 + Write( REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN );
  1095 +
  1096 + if( this->settings.Fsk.RxContinuous == true )
  1097 + {
  1098 + // Continuous mode restart Rx chain
  1099 + Write( REG_RXCONFIG, Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
  1100 + rxTimeoutSyncWord.attach_us( mbed::callback( this, &SX1276::OnTimeoutIrq ),
  1101 + this->settings.Fsk.RxSingleTimeout * 1e3 );
  1102 + }
  1103 + else
  1104 + {
  1105 + this->settings.State = RF_IDLE;
  1106 + rxTimeoutSyncWord.detach( );
  1107 + }
  1108 + }
  1109 + if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxTimeout != NULL ) )
  1110 + {
  1111 + this->RadioEvents->RxTimeout( );
  1112 + }
  1113 + break;
  1114 + case RF_TX_RUNNING:
  1115 + // Tx timeout shouldn't happen.
  1116 + // But it has been observed that when it happens it is a result of a corrupted SPI transfer
  1117 + // it depends on the platform design.
  1118 + //
  1119 + // The workaround is to put the radio in a known state. Thus, we re-initialize it.
  1120 +
  1121 + // BEGIN WORKAROUND
  1122 +
  1123 + // Reset the radio
  1124 + Reset( );
  1125 +
  1126 + // Calibrate Rx chain
  1127 + RxChainCalibration( );
  1128 +
  1129 + // Initialize radio default values
  1130 + SetOpMode( RF_OPMODE_SLEEP );
  1131 +
  1132 + RadioRegistersInit( );
  1133 +
  1134 + SetModem( MODEM_FSK );
  1135 +
  1136 + // Restore previous network type setting.
  1137 + SetPublicNetwork( this->settings.LoRa.PublicNetwork );
  1138 + // END WORKAROUND
  1139 +
  1140 + this->settings.State = RF_IDLE;
  1141 + if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->TxTimeout != NULL ) )
  1142 + {
  1143 + this->RadioEvents->TxTimeout( );
  1144 + }
  1145 + break;
  1146 + default:
  1147 + break;
  1148 + }
  1149 +}
  1150 +
  1151 +void SX1276::OnDio0Irq( void )
  1152 +{
  1153 + volatile uint8_t irqFlags = 0;
  1154 +
  1155 + switch( this->settings.State )
  1156 + {
  1157 + case RF_RX_RUNNING:
  1158 + //TimerStop( &RxTimeoutTimer );
  1159 + // RxDone interrupt
  1160 + switch( this->settings.Modem )
  1161 + {
  1162 + case MODEM_FSK:
  1163 + if( this->settings.Fsk.CrcOn == true )
  1164 + {
  1165 + irqFlags = Read( REG_IRQFLAGS2 );
  1166 + if( ( irqFlags & RF_IRQFLAGS2_CRCOK ) != RF_IRQFLAGS2_CRCOK )
  1167 + {
  1168 + // Clear Irqs
  1169 + Write( REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
  1170 + RF_IRQFLAGS1_PREAMBLEDETECT |
  1171 + RF_IRQFLAGS1_SYNCADDRESSMATCH );
  1172 + Write( REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN );
  1173 +
  1174 + rxTimeoutTimer.detach( );
  1175 +
  1176 + if( this->settings.Fsk.RxContinuous == false )
  1177 + {
  1178 + rxTimeoutSyncWord.detach( );
  1179 + this->settings.State = RF_IDLE;
  1180 + }
  1181 + else
  1182 + {
  1183 + // Continuous mode restart Rx chain
  1184 + Write( REG_RXCONFIG, Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
  1185 + rxTimeoutSyncWord.attach_us( mbed::callback( this, &SX1276::OnTimeoutIrq ),
  1186 + this->settings.Fsk.RxSingleTimeout * 1e3 );
  1187 + }
  1188 +
  1189 + if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxError != NULL ) )
  1190 + {
  1191 + this->RadioEvents->RxError( );
  1192 + }
  1193 + this->settings.FskPacketHandler.PreambleDetected = false;
  1194 + this->settings.FskPacketHandler.SyncWordDetected = false;
  1195 + this->settings.FskPacketHandler.NbBytes = 0;
  1196 + this->settings.FskPacketHandler.Size = 0;
  1197 + break;
  1198 + }
  1199 + }
  1200 +
  1201 + // Read received packet size
  1202 + if( ( this->settings.FskPacketHandler.Size == 0 ) && ( this->settings.FskPacketHandler.NbBytes == 0 ) )
  1203 + {
  1204 + if( this->settings.Fsk.FixLen == false )
  1205 + {
  1206 + ReadFifo( ( uint8_t* )&this->settings.FskPacketHandler.Size, 1 );
  1207 + }
  1208 + else
  1209 + {
  1210 + this->settings.FskPacketHandler.Size = Read( REG_PAYLOADLENGTH );
  1211 + }
  1212 + ReadFifo( rxtxBuffer + this->settings.FskPacketHandler.NbBytes, this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
  1213 + this->settings.FskPacketHandler.NbBytes += ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
  1214 + }
  1215 + else
  1216 + {
  1217 + ReadFifo( rxtxBuffer + this->settings.FskPacketHandler.NbBytes, this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
  1218 + this->settings.FskPacketHandler.NbBytes += ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
  1219 + }
  1220 +
  1221 + rxTimeoutTimer.detach( );
  1222 +
  1223 + if( this->settings.Fsk.RxContinuous == false )
  1224 + {
  1225 + this->settings.State = RF_IDLE;
  1226 + rxTimeoutSyncWord.detach( );
  1227 + }
  1228 + else
  1229 + {
  1230 + // Continuous mode restart Rx chain
  1231 + Write( REG_RXCONFIG, Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
  1232 + rxTimeoutSyncWord.attach_us( mbed::callback( this, &SX1276::OnTimeoutIrq ),
  1233 + this->settings.Fsk.RxSingleTimeout * 1e3 );
  1234 + }
  1235 +
  1236 + if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxDone != NULL ) )
  1237 + {
  1238 + this->RadioEvents->RxDone( rxtxBuffer, this->settings.FskPacketHandler.Size, this->settings.FskPacketHandler.RssiValue, 0 );
  1239 + }
  1240 + this->settings.FskPacketHandler.PreambleDetected = false;
  1241 + this->settings.FskPacketHandler.SyncWordDetected = false;
  1242 + this->settings.FskPacketHandler.NbBytes = 0;
  1243 + this->settings.FskPacketHandler.Size = 0;
  1244 + break;
  1245 + case MODEM_LORA:
  1246 + {
  1247 + int8_t snr = 0;
  1248 +
  1249 + // Clear Irq
  1250 + Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXDONE );
  1251 +
  1252 + irqFlags = Read( REG_LR_IRQFLAGS );
  1253 + if( ( irqFlags & RFLR_IRQFLAGS_PAYLOADCRCERROR_MASK ) == RFLR_IRQFLAGS_PAYLOADCRCERROR )
  1254 + {
  1255 + // Clear Irq
  1256 + Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_PAYLOADCRCERROR );
  1257 +
  1258 + if( this->settings.LoRa.RxContinuous == false )
  1259 + {
  1260 + this->settings.State = RF_IDLE;
  1261 + }
  1262 + rxTimeoutTimer.detach( );
  1263 +
  1264 + if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxError != NULL ) )
  1265 + {
  1266 + this->RadioEvents->RxError( );
  1267 + }
  1268 + break;
  1269 + }
  1270 +
  1271 + this->settings.LoRaPacketHandler.SnrValue = Read( REG_LR_PKTSNRVALUE );
  1272 + if( this->settings.LoRaPacketHandler.SnrValue & 0x80 ) // The SNR sign bit is 1
  1273 + {
  1274 + // Invert and divide by 4
  1275 + snr = ( ( ~this->settings.LoRaPacketHandler.SnrValue + 1 ) & 0xFF ) >> 2;
  1276 + snr = -snr;
  1277 + }
  1278 + else
  1279 + {
  1280 + // Divide by 4
  1281 + snr = ( this->settings.LoRaPacketHandler.SnrValue & 0xFF ) >> 2;
  1282 + }
  1283 +
  1284 + int16_t rssi = Read( REG_LR_PKTRSSIVALUE );
  1285 + if( snr < 0 )
  1286 + {
  1287 + if( this->settings.Channel > RF_MID_BAND_THRESH )
  1288 + {
  1289 + this->settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_HF + rssi + ( rssi >> 4 ) +
  1290 + snr;
  1291 + }
  1292 + else
  1293 + {
  1294 + this->settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_LF + rssi + ( rssi >> 4 ) +
  1295 + snr;
  1296 + }
  1297 + }
  1298 + else
  1299 + {
  1300 + if( this->settings.Channel > RF_MID_BAND_THRESH )
  1301 + {
  1302 + this->settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_HF + rssi + ( rssi >> 4 );
  1303 + }
  1304 + else
  1305 + {
  1306 + this->settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_LF + rssi + ( rssi >> 4 );
  1307 + }
  1308 + }
  1309 +
  1310 + this->settings.LoRaPacketHandler.Size = Read( REG_LR_RXNBBYTES );
  1311 + ReadFifo( rxtxBuffer, this->settings.LoRaPacketHandler.Size );
  1312 +
  1313 + if( this->settings.LoRa.RxContinuous == false )
  1314 + {
  1315 + this->settings.State = RF_IDLE;
  1316 + }
  1317 + rxTimeoutTimer.detach( );
  1318 +
  1319 + if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxDone != NULL ) )
  1320 + {
  1321 + this->RadioEvents->RxDone( rxtxBuffer, this->settings.LoRaPacketHandler.Size, this->settings.LoRaPacketHandler.RssiValue, this->settings.LoRaPacketHandler.SnrValue );
  1322 + }
  1323 + }
  1324 + break;
  1325 + default:
  1326 + break;
  1327 + }
  1328 + break;
  1329 + case RF_TX_RUNNING:
  1330 + txTimeoutTimer.detach( );
  1331 + // TxDone interrupt
  1332 + switch( this->settings.Modem )
  1333 + {
  1334 + case MODEM_LORA:
  1335 + // Clear Irq
  1336 + Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_TXDONE );
  1337 + // Intentional fall through
  1338 + case MODEM_FSK:
  1339 + default:
  1340 + this->settings.State = RF_IDLE;
  1341 + if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->TxDone != NULL ) )
  1342 + {
  1343 + this->RadioEvents->TxDone( );
  1344 + }
  1345 + break;
  1346 + }
  1347 + break;
  1348 + default:
  1349 + break;
  1350 + }
  1351 +}
  1352 +
  1353 +void SX1276::OnDio1Irq( void )
  1354 +{
  1355 + switch( this->settings.State )
  1356 + {
  1357 + case RF_RX_RUNNING:
  1358 + switch( this->settings.Modem )
  1359 + {
  1360 + case MODEM_FSK:
  1361 + // FifoLevel interrupt
  1362 + // Read received packet size
  1363 + if( ( this->settings.FskPacketHandler.Size == 0 ) && ( this->settings.FskPacketHandler.NbBytes == 0 ) )
  1364 + {
  1365 + if( this->settings.Fsk.FixLen == false )
  1366 + {
  1367 + ReadFifo( ( uint8_t* )&this->settings.FskPacketHandler.Size, 1 );
  1368 + }
  1369 + else
  1370 + {
  1371 + this->settings.FskPacketHandler.Size = Read( REG_PAYLOADLENGTH );
  1372 + }
  1373 + }
  1374 +
  1375 + if( ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes ) > this->settings.FskPacketHandler.FifoThresh )
  1376 + {
  1377 + ReadFifo( ( rxtxBuffer + this->settings.FskPacketHandler.NbBytes ), this->settings.FskPacketHandler.FifoThresh );
  1378 + this->settings.FskPacketHandler.NbBytes += this->settings.FskPacketHandler.FifoThresh;
  1379 + }
  1380 + else
  1381 + {
  1382 + ReadFifo( ( rxtxBuffer + this->settings.FskPacketHandler.NbBytes ), this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
  1383 + this->settings.FskPacketHandler.NbBytes += ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
  1384 + }
  1385 + break;
  1386 + case MODEM_LORA:
  1387 + // Sync time out
  1388 + rxTimeoutTimer.detach( );
  1389 + // Clear Irq
  1390 + Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXTIMEOUT );
  1391 +
  1392 + this->settings.State = RF_IDLE;
  1393 + if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->RxTimeout != NULL ) )
  1394 + {
  1395 + this->RadioEvents->RxTimeout( );
  1396 + }
  1397 + break;
  1398 + default:
  1399 + break;
  1400 + }
  1401 + break;
  1402 + case RF_TX_RUNNING:
  1403 + switch( this->settings.Modem )
  1404 + {
  1405 + case MODEM_FSK:
  1406 + // FifoEmpty interrupt
  1407 + if( ( this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes ) > this->settings.FskPacketHandler.ChunkSize )
  1408 + {
  1409 + WriteFifo( ( rxtxBuffer + this->settings.FskPacketHandler.NbBytes ), this->settings.FskPacketHandler.ChunkSize );
  1410 + this->settings.FskPacketHandler.NbBytes += this->settings.FskPacketHandler.ChunkSize;
  1411 + }
  1412 + else
  1413 + {
  1414 + // Write the last chunk of data
  1415 + WriteFifo( rxtxBuffer + this->settings.FskPacketHandler.NbBytes, this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes );
  1416 + this->settings.FskPacketHandler.NbBytes += this->settings.FskPacketHandler.Size - this->settings.FskPacketHandler.NbBytes;
  1417 + }
  1418 + break;
  1419 + case MODEM_LORA:
  1420 + break;
  1421 + default:
  1422 + break;
  1423 + }
  1424 + break;
  1425 + default:
  1426 + break;
  1427 + }
  1428 +}
  1429 +
  1430 +void SX1276::OnDio2Irq( void )
  1431 +{
  1432 + switch( this->settings.State )
  1433 + {
  1434 + case RF_RX_RUNNING:
  1435 + switch( this->settings.Modem )
  1436 + {
  1437 + case MODEM_FSK:
  1438 + // Checks if DIO4 is connected. If it is not PreambleDtected is set to true.
  1439 + if( this->dioIrq[4] == NULL )
  1440 + {
  1441 + this->settings.FskPacketHandler.PreambleDetected = true;
  1442 + }
  1443 +
  1444 + if( ( this->settings.FskPacketHandler.PreambleDetected == true ) && ( this->settings.FskPacketHandler.SyncWordDetected == false ) )
  1445 + {
  1446 + rxTimeoutSyncWord.detach( );
  1447 +
  1448 + this->settings.FskPacketHandler.SyncWordDetected = true;
  1449 +
  1450 + this->settings.FskPacketHandler.RssiValue = -( Read( REG_RSSIVALUE ) >> 1 );
  1451 +
  1452 + this->settings.FskPacketHandler.AfcValue = ( int32_t )( double )( ( ( uint16_t )Read( REG_AFCMSB ) << 8 ) |
  1453 + ( uint16_t )Read( REG_AFCLSB ) ) *
  1454 + ( double )FREQ_STEP;
  1455 + this->settings.FskPacketHandler.RxGain = ( Read( REG_LNA ) >> 5 ) & 0x07;
  1456 + }
  1457 + break;
  1458 + case MODEM_LORA:
  1459 + if( this->settings.LoRa.FreqHopOn == true )
  1460 + {
  1461 + // Clear Irq
  1462 + Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL );
  1463 +
  1464 + if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->FhssChangeChannel != NULL ) )
  1465 + {
  1466 + this->RadioEvents->FhssChangeChannel( ( Read( REG_LR_HOPCHANNEL ) & RFLR_HOPCHANNEL_CHANNEL_MASK ) );
  1467 + }
  1468 + }
  1469 + break;
  1470 + default:
  1471 + break;
  1472 + }
  1473 + break;
  1474 + case RF_TX_RUNNING:
  1475 + switch( this->settings.Modem )
  1476 + {
  1477 + case MODEM_FSK:
  1478 + break;
  1479 + case MODEM_LORA:
  1480 + if( this->settings.LoRa.FreqHopOn == true )
  1481 + {
  1482 + // Clear Irq
  1483 + Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL );
  1484 +
  1485 + if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->FhssChangeChannel != NULL ) )
  1486 + {
  1487 + this->RadioEvents->FhssChangeChannel( ( Read( REG_LR_HOPCHANNEL ) & RFLR_HOPCHANNEL_CHANNEL_MASK ) );
  1488 + }
  1489 + }
  1490 + break;
  1491 + default:
  1492 + break;
  1493 + }
  1494 + break;
  1495 + default:
  1496 + break;
  1497 + }
  1498 +}
  1499 +
  1500 +void SX1276::OnDio3Irq( void )
  1501 +{
  1502 + switch( this->settings.Modem )
  1503 + {
  1504 + case MODEM_FSK:
  1505 + break;
  1506 + case MODEM_LORA:
  1507 + if( ( Read( REG_LR_IRQFLAGS ) & RFLR_IRQFLAGS_CADDETECTED ) == RFLR_IRQFLAGS_CADDETECTED )
  1508 + {
  1509 + // Clear Irq
  1510 + Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDETECTED | RFLR_IRQFLAGS_CADDONE );
  1511 + if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->CadDone != NULL ) )
  1512 + {
  1513 + this->RadioEvents->CadDone( true );
  1514 + }
  1515 + }
  1516 + else
  1517 + {
  1518 + // Clear Irq
  1519 + Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDONE );
  1520 + if( ( this->RadioEvents != NULL ) && ( this->RadioEvents->CadDone != NULL ) )
  1521 + {
  1522 + this->RadioEvents->CadDone( false );
  1523 + }
  1524 + }
  1525 + break;
  1526 + default:
  1527 + break;
  1528 + }
  1529 +}
  1530 +
  1531 +void SX1276::OnDio4Irq( void )
  1532 +{
  1533 + switch( this->settings.Modem )
  1534 + {
  1535 + case MODEM_FSK:
  1536 + {
  1537 + if( this->settings.FskPacketHandler.PreambleDetected == false )
  1538 + {
  1539 + this->settings.FskPacketHandler.PreambleDetected = true;
  1540 + }
  1541 + }
  1542 + break;
  1543 + case MODEM_LORA:
  1544 + break;
  1545 + default:
  1546 + break;
  1547 + }
  1548 +}
  1549 +
  1550 +void SX1276::OnDio5Irq( void )
  1551 +{
  1552 + switch( this->settings.Modem )
  1553 + {
  1554 + case MODEM_FSK:
  1555 + break;
  1556 + case MODEM_LORA:
  1557 + break;
  1558 + default:
  1559 + break;
  1560 + }
  1561 +}
... ...
recepteur/SX1276Lib/sx1276/sx1276.h 0 → 100644
... ... @@ -0,0 +1,506 @@
  1 +/*
  2 + / _____) _ | |
  3 +( (____ _____ ____ _| |_ _____ ____| |__
  4 + \____ \| ___ | (_ _) ___ |/ ___) _ \
  5 + _____) ) ____| | | || |_| ____( (___| | | |
  6 +(______/|_____)_|_|_| \__)_____)\____)_| |_|
  7 + (C) 2014 Semtech
  8 +
  9 +Description: Actual implementation of a SX1276 radio, inherits Radio
  10 +
  11 +License: Revised BSD License, see LICENSE.TXT file include in the project
  12 +
  13 +Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin
  14 +*/
  15 +#ifndef __SX1276_H__
  16 +#define __SX1276_H__
  17 +
  18 +#include "radio.h"
  19 +#include "./registers/sx1276Regs-Fsk.h"
  20 +#include "./registers/sx1276Regs-LoRa.h"
  21 +#include "./typedefs/typedefs.h"
  22 +
  23 +/*!
  24 + * Radio wake-up time from sleep
  25 + */
  26 +#define RADIO_WAKEUP_TIME 1 // [ms]
  27 +
  28 +/*!
  29 + * Sync word for Private LoRa networks
  30 + */
  31 +#define LORA_MAC_PRIVATE_SYNCWORD 0x12
  32 +
  33 +/*!
  34 + * Sync word for Public LoRa networks
  35 + */
  36 +#define LORA_MAC_PUBLIC_SYNCWORD 0x34
  37 +
  38 +
  39 +/*!
  40 + * SX1276 definitions
  41 + */
  42 +#define XTAL_FREQ 32000000
  43 +#define FREQ_STEP 61.03515625
  44 +
  45 +#define RX_BUFFER_SIZE 256
  46 +
  47 +/*!
  48 + * Constant values need to compute the RSSI value
  49 + */
  50 +#define RSSI_OFFSET_LF -164.0
  51 +#define RSSI_OFFSET_HF -157.0
  52 +
  53 +#define RF_MID_BAND_THRESH 525000000
  54 +
  55 +/*!
  56 + * Actual implementation of a SX1276 radio, inherits Radio
  57 + */
  58 +class SX1276 : public Radio
  59 +{
  60 +protected:
  61 + /*!
  62 + * SPI Interface
  63 + */
  64 + SPI spi; // mosi, miso, sclk
  65 + DigitalOut nss;
  66 +
  67 + /*!
  68 + * SX1276 Reset pin
  69 + */
  70 + DigitalInOut reset;
  71 +
  72 + /*!
  73 + * SX1276 DIO pins
  74 + */
  75 + InterruptIn dio0;
  76 + InterruptIn dio1;
  77 + InterruptIn dio2;
  78 + InterruptIn dio3;
  79 + InterruptIn dio4;
  80 + DigitalIn dio5;
  81 +
  82 + bool isRadioActive;
  83 +
  84 + uint8_t boardConnected; //1 = SX1276MB1LAS; 0 = SX1276MB1MAS
  85 +
  86 + uint8_t *rxtxBuffer;
  87 +
  88 + /*!
  89 + * Hardware DIO IRQ functions
  90 + */
  91 + DioIrqHandler *dioIrq;
  92 +
  93 + /*!
  94 + * Tx and Rx timers
  95 + */
  96 + Timeout txTimeoutTimer;
  97 + Timeout rxTimeoutTimer;
  98 + Timeout rxTimeoutSyncWord;
  99 +
  100 + RadioSettings_t settings;
  101 +
  102 + static const FskBandwidth_t FskBandwidths[];
  103 +protected:
  104 +
  105 + /*!
  106 + * Performs the Rx chain calibration for LF and HF bands
  107 + * \remark Must be called just after the reset so all registers are at their
  108 + * default values
  109 + */
  110 + void RxChainCalibration( void );
  111 +
  112 +public:
  113 + SX1276( RadioEvents_t *events,
  114 + PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset,
  115 + PinName dio0, PinName dio1, PinName dio2, PinName dio3, PinName dio4, PinName dio5 );
  116 + SX1276( RadioEvents_t *events );
  117 + virtual ~SX1276( );
  118 +
  119 + //-------------------------------------------------------------------------
  120 + // Redefined Radio functions
  121 + //-------------------------------------------------------------------------
  122 + /*!
  123 + * @brief Initializes the radio
  124 + *
  125 + * @param [IN] events Structure containing the driver callback functions
  126 + */
  127 + virtual void Init( RadioEvents_t *events );
  128 + /*!
  129 + * Return current radio status
  130 + *
  131 + * @param status Radio status. [RF_IDLE, RX_RUNNING, TX_RUNNING]
  132 + */
  133 + virtual RadioState GetStatus( void );
  134 + /*!
  135 + * @brief Configures the SX1276 with the given modem
  136 + *
  137 + * @param [IN] modem Modem to be used [0: FSK, 1: LoRa]
  138 + */
  139 + virtual void SetModem( RadioModems_t modem );
  140 + /*!
  141 + * @brief Sets the channel frequency
  142 + *
  143 + * @param [IN] freq Channel RF frequency
  144 + */
  145 + virtual void SetChannel( uint32_t freq );
  146 + /*!
  147 + * @brief Sets the channels configuration
  148 + *
  149 + * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
  150 + * @param [IN] freq Channel RF frequency
  151 + * @param [IN] rssiThresh RSSI threshold
  152 + *
  153 + * @retval isFree [true: Channel is free, false: Channel is not free]
  154 + */
  155 + virtual bool IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh );
  156 + /*!
  157 + * @brief Generates a 32 bits random value based on the RSSI readings
  158 + *
  159 + * \remark This function sets the radio in LoRa modem mode and disables
  160 + * all interrupts.
  161 + * After calling this function either Radio.SetRxConfig or
  162 + * Radio.SetTxConfig functions must be called.
  163 + *
  164 + * @retval randomValue 32 bits random value
  165 + */
  166 + virtual uint32_t Random( void );
  167 + /*!
  168 + * @brief Sets the reception parameters
  169 + *
  170 + * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
  171 + * @param [IN] bandwidth Sets the bandwidth
  172 + * FSK : >= 2600 and <= 250000 Hz
  173 + * LoRa: [0: 125 kHz, 1: 250 kHz,
  174 + * 2: 500 kHz, 3: Reserved]
  175 + * @param [IN] datarate Sets the Datarate
  176 + * FSK : 600..300000 bits/s
  177 + * LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
  178 + * 10: 1024, 11: 2048, 12: 4096 chips]
  179 + * @param [IN] coderate Sets the coding rate ( LoRa only )
  180 + * FSK : N/A ( set to 0 )
  181 + * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
  182 + * @param [IN] bandwidthAfc Sets the AFC Bandwidth ( FSK only )
  183 + * FSK : >= 2600 and <= 250000 Hz
  184 + * LoRa: N/A ( set to 0 )
  185 + * @param [IN] preambleLen Sets the Preamble length ( LoRa only )
  186 + * FSK : N/A ( set to 0 )
  187 + * LoRa: Length in symbols ( the hardware adds 4 more symbols )
  188 + * @param [IN] symbTimeout Sets the RxSingle timeout value
  189 + * FSK : timeout number of bytes
  190 + * LoRa: timeout in symbols
  191 + * @param [IN] fixLen Fixed length packets [0: variable, 1: fixed]
  192 + * @param [IN] payloadLen Sets payload length when fixed lenght is used
  193 + * @param [IN] crcOn Enables/Disables the CRC [0: OFF, 1: ON]
  194 + * @param [IN] freqHopOn Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only)
  195 + * @param [IN] hopPeriod Number of symbols bewteen each hop (LoRa only)
  196 + * @param [IN] iqInverted Inverts IQ signals ( LoRa only )
  197 + * FSK : N/A ( set to 0 )
  198 + * LoRa: [0: not inverted, 1: inverted]
  199 + * @param [IN] rxContinuous Sets the reception in continuous mode
  200 + * [false: single mode, true: continuous mode]
  201 + */
  202 + virtual void SetRxConfig ( RadioModems_t modem, uint32_t bandwidth,
  203 + uint32_t datarate, uint8_t coderate,
  204 + uint32_t bandwidthAfc, uint16_t preambleLen,
  205 + uint16_t symbTimeout, bool fixLen,
  206 + uint8_t payloadLen,
  207 + bool crcOn, bool freqHopOn, uint8_t hopPeriod,
  208 + bool iqInverted, bool rxContinuous );
  209 + /*!
  210 + * @brief Sets the transmission parameters
  211 + *
  212 + * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
  213 + * @param [IN] power Sets the output power [dBm]
  214 + * @param [IN] fdev Sets the frequency deviation ( FSK only )
  215 + * FSK : [Hz]
  216 + * LoRa: 0
  217 + * @param [IN] bandwidth Sets the bandwidth ( LoRa only )
  218 + * FSK : 0
  219 + * LoRa: [0: 125 kHz, 1: 250 kHz,
  220 + * 2: 500 kHz, 3: Reserved]
  221 + * @param [IN] datarate Sets the Datarate
  222 + * FSK : 600..300000 bits/s
  223 + * LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
  224 + * 10: 1024, 11: 2048, 12: 4096 chips]
  225 + * @param [IN] coderate Sets the coding rate ( LoRa only )
  226 + * FSK : N/A ( set to 0 )
  227 + * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
  228 + * @param [IN] preambleLen Sets the preamble length
  229 + * @param [IN] fixLen Fixed length packets [0: variable, 1: fixed]
  230 + * @param [IN] crcOn Enables disables the CRC [0: OFF, 1: ON]
  231 + * @param [IN] freqHopOn Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only)
  232 + * @param [IN] hopPeriod Number of symbols bewteen each hop (LoRa only)
  233 + * @param [IN] iqInverted Inverts IQ signals ( LoRa only )
  234 + * FSK : N/A ( set to 0 )
  235 + * LoRa: [0: not inverted, 1: inverted]
  236 + * @param [IN] timeout Transmission timeout [ms]
  237 + */
  238 + virtual void SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
  239 + uint32_t bandwidth, uint32_t datarate,
  240 + uint8_t coderate, uint16_t preambleLen,
  241 + bool fixLen, bool crcOn, bool freqHopOn,
  242 + uint8_t hopPeriod, bool iqInverted, uint32_t timeout );
  243 + /*!
  244 + * @brief Checks if the given RF frequency is supported by the hardware
  245 + *
  246 + * @param [IN] frequency RF frequency to be checked
  247 + * @retval isSupported [true: supported, false: unsupported]
  248 + */
  249 + virtual bool CheckRfFrequency( uint32_t frequency ) = 0;
  250 + /*!
  251 + * @brief Computes the packet time on air for the given payload
  252 + *
  253 + * \Remark Can only be called once SetRxConfig or SetTxConfig have been called
  254 + *
  255 + * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
  256 + * @param [IN] pktLen Packet payload length
  257 + *
  258 + * @retval airTime Computed airTime for the given packet payload length
  259 + */
  260 + virtual uint32_t TimeOnAir ( RadioModems_t modem, uint8_t pktLen );
  261 + /*!
  262 + * @brief Sends the buffer of size. Prepares the packet to be sent and sets
  263 + * the radio in transmission
  264 + *
  265 + * @param [IN]: buffer Buffer pointer
  266 + * @param [IN]: size Buffer size
  267 + */
  268 + virtual void Send( uint8_t *buffer, uint8_t size );
  269 + /*!
  270 + * @brief Sets the radio in sleep mode
  271 + */
  272 + virtual void Sleep( void );
  273 + /*!
  274 + * @brief Sets the radio in standby mode
  275 + */
  276 + virtual void Standby( void );
  277 + /*!
  278 + * @brief Sets the radio in CAD mode
  279 + */
  280 + virtual void StartCad( void );
  281 + /*!
  282 + * @brief Sets the radio in reception mode for the given time
  283 + * @param [IN] timeout Reception timeout [ms]
  284 + * [0: continuous, others timeout]
  285 + */
  286 + virtual void Rx( uint32_t timeout );
  287 + /*!
  288 + * @brief Sets the radio in transmission mode for the given time
  289 + * @param [IN] timeout Transmission timeout [ms]
  290 + * [0: continuous, others timeout]
  291 + */
  292 + virtual void Tx( uint32_t timeout );
  293 + /*!
  294 + * @brief Sets the radio in continuous wave transmission mode
  295 + *
  296 + * @param [IN]: freq Channel RF frequency
  297 + * @param [IN]: power Sets the output power [dBm]
  298 + * @param [IN]: time Transmission mode timeout [s]
  299 + */
  300 + virtual void SetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time );
  301 + /*!
  302 + * @brief Reads the current RSSI value
  303 + *
  304 + * @retval rssiValue Current RSSI value in [dBm]
  305 + */
  306 + virtual int16_t GetRssi ( RadioModems_t modem );
  307 + /*!
  308 + * @brief Writes the radio register at the specified address
  309 + *
  310 + * @param [IN]: addr Register address
  311 + * @param [IN]: data New register value
  312 + */
  313 + virtual void Write ( uint8_t addr, uint8_t data ) = 0;
  314 + /*!
  315 + * @brief Reads the radio register at the specified address
  316 + *
  317 + * @param [IN]: addr Register address
  318 + * @retval data Register value
  319 + */
  320 + virtual uint8_t Read ( uint8_t addr ) = 0;
  321 + /*!
  322 + * @brief Writes multiple radio registers starting at address
  323 + *
  324 + * @param [IN] addr First Radio register address
  325 + * @param [IN] buffer Buffer containing the new register's values
  326 + * @param [IN] size Number of registers to be written
  327 + */
  328 + virtual void Write( uint8_t addr, uint8_t *buffer, uint8_t size ) = 0;
  329 + /*!
  330 + * @brief Reads multiple radio registers starting at address
  331 + *
  332 + * @param [IN] addr First Radio register address
  333 + * @param [OUT] buffer Buffer where to copy the registers data
  334 + * @param [IN] size Number of registers to be read
  335 + */
  336 + virtual void Read ( uint8_t addr, uint8_t *buffer, uint8_t size ) = 0;
  337 + /*!
  338 + * @brief Writes the buffer contents to the SX1276 FIFO
  339 + *
  340 + * @param [IN] buffer Buffer containing data to be put on the FIFO.
  341 + * @param [IN] size Number of bytes to be written to the FIFO
  342 + */
  343 + virtual void WriteFifo( uint8_t *buffer, uint8_t size ) = 0;
  344 + /*!
  345 + * @brief Reads the contents of the SX1276 FIFO
  346 + *
  347 + * @param [OUT] buffer Buffer where to copy the FIFO read data.
  348 + * @param [IN] size Number of bytes to be read from the FIFO
  349 + */
  350 + virtual void ReadFifo( uint8_t *buffer, uint8_t size ) = 0;
  351 + /*!
  352 + * @brief Resets the SX1276
  353 + */
  354 + virtual void Reset( void ) = 0;
  355 +
  356 + /*!
  357 + * @brief Sets the maximum payload length.
  358 + *
  359 + * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
  360 + * @param [IN] max Maximum payload length in bytes
  361 + */
  362 + virtual void SetMaxPayloadLength( RadioModems_t modem, uint8_t max );
  363 +
  364 + /*!
  365 + * \brief Sets the network to public or private. Updates the sync byte.
  366 + *
  367 + * \remark Applies to LoRa modem only
  368 + *
  369 + * \param [IN] enable if true, it enables a public network
  370 + */
  371 + virtual void SetPublicNetwork( bool enable );
  372 +
  373 + //-------------------------------------------------------------------------
  374 + // Board relative functions
  375 + //-------------------------------------------------------------------------
  376 +
  377 +protected:
  378 + /*!
  379 + * @brief Initializes the radio I/Os pins interface
  380 + */
  381 + virtual void IoInit( void ) = 0;
  382 +
  383 + /*!
  384 + * @brief Initializes the radio registers
  385 + */
  386 + virtual void RadioRegistersInit( ) = 0;
  387 +
  388 + /*!
  389 + * @brief Initializes the radio SPI
  390 + */
  391 + virtual void SpiInit( void ) = 0;
  392 +
  393 + /*!
  394 + * @brief Initializes DIO IRQ handlers
  395 + *
  396 + * @param [IN] irqHandlers Array containing the IRQ callback functions
  397 + */
  398 + virtual void IoIrqInit( DioIrqHandler *irqHandlers ) = 0;
  399 +
  400 + /*!
  401 + * @brief De-initializes the radio I/Os pins interface.
  402 + *
  403 + * \remark Useful when going in MCU lowpower modes
  404 + */
  405 + virtual void IoDeInit( void ) = 0;
  406 +
  407 + /*!
  408 + * @brief Sets the radio output power.
  409 + *
  410 + * @param [IN] power Sets the RF output power
  411 + */
  412 + virtual void SetRfTxPower( int8_t power ) = 0;
  413 +
  414 + /*!
  415 + * @brief Gets the board PA selection configuration
  416 + *
  417 + * @param [IN] channel Channel frequency in Hz
  418 + * @retval PaSelect RegPaConfig PaSelect value
  419 + */
  420 + virtual uint8_t GetPaSelect( uint32_t channel ) = 0;
  421 +
  422 + /*!
  423 + * @brief Set the RF Switch I/Os pins in Low Power mode
  424 + *
  425 + * @param [IN] status enable or disable
  426 + */
  427 + virtual void SetAntSwLowPower( bool status ) = 0;
  428 +
  429 + /*!
  430 + * @brief Initializes the RF Switch I/Os pins interface
  431 + */
  432 + virtual void AntSwInit( void ) = 0;
  433 +
  434 + /*!
  435 + * @brief De-initializes the RF Switch I/Os pins interface
  436 + *
  437 + * \remark Needed to decrease the power consumption in MCU lowpower modes
  438 + */
  439 + virtual void AntSwDeInit( void ) = 0;
  440 +
  441 + /*!
  442 + * @brief Controls the antenna switch if necessary.
  443 + *
  444 + * \remark see errata note
  445 + *
  446 + * @param [IN] opMode Current radio operating mode
  447 + */
  448 + virtual void SetAntSw( uint8_t opMode ) = 0;
  449 +protected:
  450 +
  451 + /*!
  452 + * @brief Sets the SX1276 operating mode
  453 + *
  454 + * @param [IN] opMode New operating mode
  455 + */
  456 + virtual void SetOpMode( uint8_t opMode );
  457 +
  458 + /*
  459 + * SX1276 DIO IRQ callback functions prototype
  460 + */
  461 +
  462 + /*!
  463 + * @brief DIO 0 IRQ callback
  464 + */
  465 + virtual void OnDio0Irq( void );
  466 +
  467 + /*!
  468 + * @brief DIO 1 IRQ callback
  469 + */
  470 + virtual void OnDio1Irq( void );
  471 +
  472 + /*!
  473 + * @brief DIO 2 IRQ callback
  474 + */
  475 + virtual void OnDio2Irq( void );
  476 +
  477 + /*!
  478 + * @brief DIO 3 IRQ callback
  479 + */
  480 + virtual void OnDio3Irq( void );
  481 +
  482 + /*!
  483 + * @brief DIO 4 IRQ callback
  484 + */
  485 + virtual void OnDio4Irq( void );
  486 +
  487 + /*!
  488 + * @brief DIO 5 IRQ callback
  489 + */
  490 + virtual void OnDio5Irq( void );
  491 +
  492 + /*!
  493 + * @brief Tx & Rx timeout timer callback
  494 + */
  495 + virtual void OnTimeoutIrq( void );
  496 +
  497 + /*!
  498 + * Returns the known FSK bandwidth registers value
  499 + *
  500 + * \param [IN] bandwidth Bandwidth value in Hz
  501 + * \retval regValue Bandwidth register value.
  502 + */
  503 + static uint8_t GetFskBandwidthRegValue( uint32_t bandwidth );
  504 +};
  505 +
  506 +#endif // __SX1276_H__
... ...
recepteur/SX1276Lib/typedefs/typedefs.h 0 → 100644
... ... @@ -0,0 +1,53 @@
  1 +/*
  2 + / _____) _ | |
  3 +( (____ _____ ____ _| |_ _____ ____| |__
  4 + \____ \| ___ | (_ _) ___ |/ ___) _ \
  5 + _____) ) ____| | | || |_| ____( (___| | | |
  6 +(______/|_____)_|_|_| \__)_____)\____)_| |_|
  7 + (C) 2014 Semtech
  8 +
  9 +Description: -
  10 +
  11 +License: Revised BSD License, see LICENSE.TXT file include in the project
  12 +
  13 +Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin
  14 +*/
  15 +#ifndef __TYPEDEFS_H__
  16 +#define __TYPEDEFS_H__
  17 +
  18 +#include "mbed.h"
  19 +#include "./enums/enums.h"
  20 +
  21 +class SX1276;
  22 +class SX1276MB1xAS;
  23 +/*!
  24 + * Hardware IO IRQ callback function definition
  25 + */
  26 +typedef void ( SX1276::*DioIrqHandler )( void );
  27 +
  28 +/*!
  29 + * triggers definition
  30 + */
  31 +typedef void ( SX1276::*Trigger )( void );
  32 +typedef void ( SX1276MB1xAS::*TriggerMB1xAS )( void );
  33 +
  34 +/*!
  35 + * FSK bandwidth definition
  36 + */
  37 +typedef struct
  38 +{
  39 + uint32_t bandwidth;
  40 + uint8_t RegValue;
  41 +}FskBandwidth_t;
  42 +
  43 +/*!
  44 + * Radio registers definition
  45 + */
  46 +typedef struct
  47 +{
  48 + ModemType Modem;
  49 + uint8_t Addr;
  50 + uint8_t Value;
  51 +}RadioRegisters_t;
  52 +
  53 +#endif //__TYPEDEFS_H__
... ...
recepteur/main.h 0 → 100644
... ... @@ -0,0 +1,115 @@
  1 +/*
  2 + / _____) _ | |
  3 +( (____ _____ ____ _| |_ _____ ____| |__
  4 + \____ \| ___ | (_ _) ___ |/ ___) _ \
  5 + _____) ) ____| | | || |_| ____( (___| | | |
  6 +(______/|_____)_|_|_| \__)_____)\____)_| |_|
  7 + ( C )2014 Semtech
  8 +
  9 +Description: Contains the callbacks for the IRQs and any application related details
  10 +
  11 +License: Revised BSD License, see LICENSE.TXT file include in the project
  12 +
  13 +Maintainer: Miguel Luis and Gregory Cristian
  14 +*/
  15 +#ifndef __MAIN_H__
  16 +#define __MAIN_H__
  17 +
  18 +
  19 +/*!
  20 + * Frequency hopping frequencies table
  21 + */
  22 +const uint32_t HoppingFrequencies[] =
  23 +{
  24 + 916500000,
  25 + 923500000,
  26 + 906500000,
  27 + 917500000,
  28 + 917500000,
  29 + 909000000,
  30 + 903000000,
  31 + 916000000,
  32 + 912500000,
  33 + 926000000,
  34 + 925000000,
  35 + 909500000,
  36 + 913000000,
  37 + 918500000,
  38 + 918500000,
  39 + 902500000,
  40 + 911500000,
  41 + 926500000,
  42 + 902500000,
  43 + 922000000,
  44 + 924000000,
  45 + 903500000,
  46 + 913000000,
  47 + 922000000,
  48 + 926000000,
  49 + 910000000,
  50 + 920000000,
  51 + 922500000,
  52 + 911000000,
  53 + 922000000,
  54 + 909500000,
  55 + 926000000,
  56 + 922000000,
  57 + 918000000,
  58 + 925500000,
  59 + 908000000,
  60 + 917500000,
  61 + 926500000,
  62 + 908500000,
  63 + 916000000,
  64 + 905500000,
  65 + 916000000,
  66 + 903000000,
  67 + 905000000,
  68 + 915000000,
  69 + 913000000,
  70 + 907000000,
  71 + 910000000,
  72 + 926500000,
  73 + 925500000,
  74 + 911000000
  75 +};
  76 +
  77 +/*
  78 + * Callback functions prototypes
  79 + */
  80 +/*!
  81 + * @brief Function to be executed on Radio Tx Done event
  82 + */
  83 +void OnTxDone( void );
  84 +
  85 +/*!
  86 + * @brief Function to be executed on Radio Rx Done event
  87 + */
  88 +void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr );
  89 +
  90 +/*!
  91 + * @brief Function executed on Radio Tx Timeout event
  92 + */
  93 +void OnTxTimeout( void );
  94 +
  95 +/*!
  96 + * @brief Function executed on Radio Rx Timeout event
  97 + */
  98 +void OnRxTimeout( void );
  99 +
  100 +/*!
  101 + * @brief Function executed on Radio Rx Error event
  102 + */
  103 +void OnRxError( void );
  104 +
  105 +/*!
  106 + * @brief Function executed on Radio Fhss Change Channel event
  107 + */
  108 +void OnFhssChangeChannel( uint8_t channelIndex );
  109 +
  110 +/*!
  111 + * @brief Function executed on CAD Done event
  112 + */
  113 +void OnCadDone( void );
  114 +
  115 +#endif // __MAIN_H__
... ...
recepteur/recepteur.c deleted
... ... @@ -1,6 +0,0 @@
1   -#include <stdio.h>
2   -
3   -int main()
4   -{
5   - return 0;
6   -}
recepteur/recepteur.cpp 0 → 100644
... ... @@ -0,0 +1,160 @@
  1 +////////////////////////////////////////////////////////////////////////////////
  2 +/*RECEPTEUR LoRa
  3 +par : Robin Cavalieri
  4 + IMA5SC
  5 +PFE 2018 */
  6 +////////////////////////////////////////////////////////////////////////////////
  7 +//Headers
  8 +#include "mbed.h"
  9 +#include "main.h"
  10 +#include "sx1276-hal.h"
  11 +#include "debug.h"
  12 +////////////////////////////////////////////////////////////////////////////////
  13 +#define DEBUG_MESSAGE 1
  14 +////////////////////////////////////////////////////////////////////////////////
  15 +
  16 +////////////////////////////////////////////////////////////////////////////////
  17 +//Modulation LoRa active
  18 +#define USE_MODEM_LORA 1
  19 +#define USE_MODEM_FSK !USE_MODEM_LORA
  20 +//Paramètres
  21 +#define RF_FREQUENCY 868000000 //Hz : Fréquence de travail pour UE
  22 +#define TX_OUTPUT_POWER 14 //dBm : puissance de sortie du signal
  23 +#define LORA_BANDWIDTH 1 // 0:125 kHz de BP
  24 +#define LORA_SPREADING_FACTOR 10 // [SF7..SF12] Portée du débit. grande portée inutile
  25 +#define LORA_CODINGRATE 1
  26 +#define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
  27 +#define LORA_SYMBOL_TIMEOUT 5 // Symbols
  28 +#define LORA_FIX_LENGTH_PAYLOAD_ON false
  29 +#define LORA_FHSS_ENABLED true
  30 +#define LORA_NB_SYMB_HOP 4
  31 +#define LORA_IQ_INVERSION_ON false
  32 +#define LORA_CRC_ENABLED true
  33 +#define RX_TIMEOUT_VALUE 0 // in ms
  34 +#define BUFFER_SIZE 32 // Define the payload size here
  35 +#define TRAME_SIZE 13
  36 +////////////////////////////////////////////////////////////////////////////////
  37 +
  38 +////////////////////////////////////////////////////////////////////////////////
  39 +//Variables globales
  40 +typedef enum
  41 +{
  42 + LOWPOWER = 0,
  43 + IDLE,
  44 + RX,
  45 + RX_TIMEOUT,
  46 + RX_ERROR,
  47 + CAD,
  48 + CAD_DONE
  49 +}AppStates_t;
  50 +
  51 +volatile AppStates_t State = LOWPOWER;
  52 +static RadioEvents_t RadioEvents;
  53 +SX1276MB1xAS Radio( NULL );
  54 +uint16_t BufferSize = BUFFER_SIZE;
  55 +uint8_t Buffer[BUFFER_SIZE];
  56 +int16_t RssiValue = 0.0;
  57 +int8_t SnrValue = 0.0;
  58 +uint8_t receptMsg[13];
  59 +////////////////////////////////////////////////////////////////////////////////
  60 +
  61 +////////////////////////////////////////////////////////////////////////////////
  62 +//Main réception
  63 +int main( void )
  64 +{
  65 + debug("\nRecepteur SX1276 \n\n\r");
  66 +
  67 + // Initialize Radio driver
  68 + RadioEvents.RxDone = OnRxDone;
  69 + RadioEvents.RxError = OnRxError;
  70 + RadioEvents.RxTimeout = OnRxTimeout;
  71 + RadioEvents.FhssChangeChannel = OnFhssChangeChannel;
  72 + Radio.Init(&RadioEvents);
  73 +
  74 + //Véification de la communication avec la board
  75 + while(Radio.Read(REG_VERSION) == 0x00)
  76 + {
  77 + debug("Aucune radio detectee\n\r", NULL);
  78 + wait(1);
  79 + }
  80 +
  81 + //Checking du matériel connecté
  82 + debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1LAS ) ), "\n\r Materiel detecte : SX1276MB1LAS \n\r" );
  83 + debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1MAS ) ), "\n\r Materiel detecte : SX1276MB1MAS \n\r" );
  84 +
  85 + //Paramétrage du canal
  86 + Radio.SetChannel( HoppingFrequencies[0] );
  87 +
  88 + #if USE_MODEM_LORA == 1
  89 +
  90 + debug_if( LORA_FHSS_ENABLED, "\n\n\r > LORA FHSS Mode < \n\n\r" );
  91 + debug_if( !LORA_FHSS_ENABLED, "\n\n\r > LORA Mode < \n\n\r" );
  92 +
  93 + Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
  94 + LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
  95 + LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
  96 + LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
  97 + LORA_IQ_INVERSION_ON, true );
  98 +
  99 + #else
  100 + #error "Aucun modem defini"
  101 + #endif
  102 +
  103 + debug_if(DEBUG_MESSAGE, "Reception en cours...\r\n");
  104 + Radio.Rx(RX_TIMEOUT_VALUE); //Reception mode en continu
  105 +
  106 + while(1)
  107 + {
  108 + if( BufferSize > 0 )
  109 + {
  110 + if( strncmp( ( const char* )Buffer, ( const char* )receptMsg, TRAME_SIZE ) == 0 )
  111 + {
  112 + debug( "Trame recue : %s\r\n",(char*)Buffer);
  113 + }
  114 + else
  115 + {
  116 + debug("Attente d'une trame...\n");
  117 + }
  118 + wait_ms(1000);
  119 + }
  120 + }
  121 +}
  122 +////////////////////////////////////////////////////////////////////////////////
  123 +
  124 +////////////////////////////////////////////////////////////////////////////////
  125 +//Fonctions utiles
  126 +void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
  127 +{
  128 + Radio.SetChannel( HoppingFrequencies[0] );
  129 + Radio.Sleep( );
  130 + BufferSize = size;
  131 + memcpy( Buffer, payload, BufferSize );
  132 + RssiValue = rssi;
  133 + SnrValue = snr;
  134 + State = RX;
  135 + debug_if( DEBUG_MESSAGE, "> OnRxDone\n\r" );
  136 +}
  137 +
  138 +void OnRxTimeout( void )
  139 +{
  140 + Radio.SetChannel( HoppingFrequencies[0] );
  141 + Radio.Sleep( );
  142 + Buffer[BufferSize] = 0;
  143 + State = RX_TIMEOUT;
  144 + debug_if( DEBUG_MESSAGE, "> OnRxTimeout\n\r" );
  145 +}
  146 +
  147 +void OnRxError( void )
  148 +{
  149 + Radio.SetChannel( HoppingFrequencies[0] );
  150 + Radio.Sleep( );
  151 + State = RX_ERROR;
  152 + debug_if( DEBUG_MESSAGE, "> OnRxError\n\r" );
  153 +}
  154 +
  155 +void OnFhssChangeChannel( uint8_t channelIndex )
  156 +{
  157 + Radio.SetChannel( HoppingFrequencies[channelIndex] );
  158 + debug_if( DEBUG_MESSAGE, "F%d-", channelIndex );
  159 +}
  160 +////////////////////////////////////////////////////////////////////////////////
... ...
recepteur/recepteur_debug.bin 0 → 100644
No preview for this file type