You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

1239 lines
42 KiB

/*!
* \file sx126x.h
*
* \brief SX126x driver implementation
*
* \copyright Revised BSD License, see section \ref LICENSE.
*
* \code
* ______ _
* / _____) _ | |
* ( (____ _____ ____ _| |_ _____ ____| |__
* \____ \| ___ | (_ _) ___ |/ ___) _ \
* _____) ) ____| | | || |_| ____( (___| | | |
* (______/|_____)_|_|_| \__)_____)\____)_| |_|
* (C)2013-2017 Semtech
*
* \endcode
*
* \author Miguel Luis ( Semtech )
*
* \author Gregory Cristian ( Semtech )
*/
/**
******************************************************************************
*
* Portions COPYRIGHT 2020 STMicroelectronics
*
* @file radio_driver.h
* @author MCD Application Team
* @brief Header for driver radio interface
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __RADIO_DRIVER_H__
#define __RADIO_DRIVER_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>
/* Exported constants --------------------------------------------------------*/
#define RFO_LP 1
#define RFO_HP 2
/*!
* Generic SUBGRF_ error code
*/
#define SUBGRF_OK 0
#define SUBGRF_ERROR -1
/*!
* \brief Radio complete Wake-up Time with margin for temperature compensation
*/
#define RADIO_WAKEUP_TIME 3 // [ms]
/*!
* \brief Compensation delay for SetAutoTx/Rx functions in 15.625 microseconds
*/
#define AUTO_RX_TX_OFFSET 2
/*!
* \brief LFSR initial value to compute IBM type CRC
*/
#define CRC_IBM_SEED 0xFFFF
/*!
* \brief LFSR initial value to compute CCIT type CRC
*/
#define CRC_CCITT_SEED 0x1D0F
/*!
* \brief Polynomial used to compute IBM CRC
*/
#define CRC_POLYNOMIAL_IBM 0x8005
/*!
* \brief Polynomial used to compute CCIT CRC
*/
#define CRC_POLYNOMIAL_CCITT 0x1021
/*!
* \brief The address of the register holding the first byte defining the CRC seed
*
*/
#define REG_LR_CRCSEEDBASEADDR 0x06BC
/*!
* \brief The address of the register holding the first byte defining the CRC polynomial
*/
#define REG_LR_CRCPOLYBASEADDR 0x06BE
/*!
* \brief The address of the register holding the first byte defining the whitening seed
*/
#define REG_LR_WHITSEEDBASEADDR_MSB 0x06B8
#define REG_LR_WHITSEEDBASEADDR_LSB 0x06B9
/*!
* \brief The address of the register holding the packet configuration
*/
#define REG_LR_PACKETPARAMS 0x0704
/*!
* \brief The address of the register holding the payload size
*/
#define REG_LR_PAYLOADLENGTH 0x0702
/*!
* \brief The address of the register holding the re-calculated number of symbols
*/
#define REG_LR_SYNCH_TIMEOUT 0x0706
/*!
* \brief The addresses of the registers holding SyncWords values
*/
#define REG_LR_SYNCWORDBASEADDRESS 0x06C0
/*!
* \brief The addresses of the register holding LoRa Modem SyncWord value
*/
#define REG_LR_SYNCWORD 0x0740
/*!
* \brief Syncword for Private LoRa networks
*/
#define LORA_MAC_PRIVATE_SYNCWORD 0x1424
/*!
* \brief Syncword for Public LoRa networks
*/
#define LORA_MAC_PUBLIC_SYNCWORD 0x3444
/*!
* \brief The address of the register giving a 32-bit random number
*/
#define RANDOM_NUMBER_GENERATORBASEADDR 0x0819
/*!
* \brief The address of the register used to disable the LNA
*/
#define REG_ANA_LNA 0x08E2
/*!
* The address of the register used to disable the mixer
*/
#define REG_ANA_MIXER 0x08E5
/*!
* \brief The address of the register holding RX Gain value (0x94: power saving, 0x96: rx boosted)
*/
#define REG_RX_GAIN 0x08AC
/*!
* \brief The address of the register holding Bit Sync configuration
*/
#define REG_BIT_SYNC 0x06AC
/*!
* \brief Change the value on the device internal trimming capacitor
*/
#define REG_XTA_TRIM 0x0911
/*!
* \brief Change the value on the device internal trimming capacitor
*/
#define REG_XTB_TRIM 0x0912
/*!
* \brief Set the current max value in the over current protection
*/
#define REG_OCP 0x08E7
/*!
* \brief PA Clamping threshold
*/
#define REG_TX_CLAMP 0x08D8
/**
* @brief Sub-GHz radio register (re) definition
* @note The sub-GHz radio peripheral registers can be accessed by sub-GHz radio command
* SUBGRF_WriteRegisters() and SUBGRF_ReadRegisters() "
*/
/*Sub-GHz radio generic bit synchronization register*/
#define SUBGHZ_GBSYNCR REG_BIT_SYNC
/*Sub-GHz radio generic packet control 1A register*/
#define SUBGHZ_GPKTCTL1AR REG_LR_WHITSEEDBASEADDR_MSB
/*Sub-GHz radio generic whitening LSB register*/
#define SUBGHZ_GWHITEINIRL REG_LR_WHITSEEDBASEADDR_LSB
/*Sub-GHz radio generic CRC initial MSB register*/
#define SUBGHZ_GCRCINIRH REG_LR_CRCSEEDBASEADDR
/*Sub-GHz radio generic CRC initial LSB register*/
#define SUBGHZ_GCRCINIRL 0x06BD
/*Sub-GHz radio generic CRC polynomial MSB register*/
#define SUBGHZ_GCRCPOLRH REG_LR_CRCPOLYBASEADDR
/*Sub-GHz radio generic CRC polynomial LSB register*/
#define SUBGHZ_GCRCPOLRL 0x06BF
/*Sub-GHz radio generic synchronization word control register 7*/
#define SUBGHZ_GSYNCR7 REG_LR_SYNCWORDBASEADDRESS
/*Sub-GHz radio generic synchronization word control register 6*/
#define SUBGHZ_GSYNCR6 0x06C1
/*Sub-GHz radio generic synchronization word control register 5*/
#define SUBGHZ_GSYNCR5 0x06C2
/*Sub-GHz radio generic synchronization word control register 4*/
#define SUBGHZ_GSYNCR4 0x06C3
/*Sub-GHz radio generic synchronization word control register 3*/
#define SUBGHZ_GSYNCR3 0x06C4
/*Sub-GHz radio generic synchronization word control register 2*/
#define SUBGHZ_GSYNCR2 0x06C5
/*Sub-GHz radio generic synchronization word control register 1*/
#define SUBGHZ_GSYNCR1 0x06C6
/*Sub-GHz radio generic synchronization word control register 0*/
#define SUBGHZ_GSYNCR0 0x06C7
/*Sub-GHz radio LoRa synchronization word MSB register*/
#define SUBGHZ_LSYNCRH REG_LR_SYNCWORD
/*Sub-GHz radio LoRa synchronization word LSB register*/
#define SUBGHZ_LSYNCRL 0x0741
/*Sub-GHz radio random number register 3*/
#define SUBGHZ_RNGR3 RANDOM_NUMBER_GENERATORBASEADDR
/*Sub-GHz radio random number register 2*/
#define SUBGHZ_RNGR2 0x081A
/*Sub-GHz radio random number register 1*/
#define SUBGHZ_RNGR1 0x081B
/*Sub-GHz radio random number register 0*/
#define SUBGHZ_RNGR0 0x081C
/*Sub-GHz radio receiver gain control register*/
#define SUBGHZ_RXGAINCR REG_RX_GAIN
/*Sub-GHz radio PA over current protection register*/
#define SUBGHZ_PAOCPR REG_OCP
/*Sub-GHz radio HSE32 OSC_IN capacitor trim register*/
#define SUBGHZ_HSEINTRIMR REG_XTA_TRIM
/*Sub-GHz radio HSE32 OSC_OUT capacitor trim register*/
#define SUBGHZ_HSEOUTTRIMR REG_XTB_TRIM
/*Sub-GHz radio SMPS control 0 register */
#define SUBGHZ_SMPSC0R 0x0916
/*Sub-GHz radio power control register*/
#define SUBGHZ_PCR 0x091A
/*Sub-GHz radio SMPS control 2 register */
#define SUBGHZ_SMPSC2R 0x0923
/*Sub-GHz radio Rx Bandwidth selector register */
#define SUBGHZ_BWSEL 0x0807
/*Sub-GHz radio CFO High register */
#define SUBGHZ_CFO_H 0x06B0
/*Sub-GHz radio CFO Low register */
#define SUBGHZ_CFO_L 0x06B1
/*Sub-GHz radio rxAddrPtr register*/
#define SUBGHZ_RX_ADR_PTR 0x0803
/*Sub-GHz radio txAddrPtr register*/
#define SUBGHZ_TX_ADR_PTR 0x0802
/*Sub-GHz radio rtx register*/
#define SUBGHZ_RTXPLDLEN 0x06BB
/*Sub-GHz radio pktCtl1 register*/
#define SUBGHZ_PKTCTL1 0x06B4
/*Sub-GHz radio pktCtl1a register*/
#define SUBGHZ_PKTCTL1A 0x06B8
#define SMPS_CLK_DET_ENABLE ((uint8_t) (1<<6))
#define SMPS_DRV_20 ((uint8_t) ((0x0)<<1))
#define SMPS_DRV_40 ((uint8_t) ((0x1)<<1))
#define SMPS_DRV_60 ((uint8_t) ((0x2)<<1))
#define SMPS_DRV_100 ((uint8_t) ((0x3)<<1))
#define SMPS_DRV_MASK ((uint8_t) ((0x3)<<1))
/* Exported types ------------------------------------------------------------*/
/*!
* \brief Structure describing the radio status
*/
typedef union RadioStatus_u
{
uint8_t Value;
struct
{ //bit order is lsb -> msb
uint8_t Reserved : 1; //!< Reserved
uint8_t CmdStatus : 3; //!< Command status
uint8_t ChipMode : 3; //!< Chip mode
uint8_t CpuBusy : 1; //!< Flag for CPU radio busy
}Fields;
}RadioStatus_t;
/*!
* \brief Structure describing the error codes for callback functions
*/
typedef enum
{
IRQ_HEADER_ERROR_CODE = 0x01,
IRQ_SYNCWORD_ERROR_CODE = 0x02,
IRQ_CRC_ERROR_CODE = 0x04,
}IrqErrorCode_t;
enum IrqPblSyncHeaderCode_t
{
IRQ_PBL_DETECT_CODE = 0x01,
IRQ_SYNCWORD_VALID_CODE = 0x02,
IRQ_HEADER_VALID_CODE = 0x04,
};
/*!
* \brief Declares the oscillator in use while in standby mode
*
* Using the STDBY_RC standby mode allow to reduce the energy consumption
* STDBY_XOSC should be used for time critical applications
*/
typedef enum
{
STDBY_RC = 0x00,
STDBY_XOSC = 0x01,
}RadioStandbyModes_t;
/*!
* \brief Declares the power regulation used to power the device
*
* This command allows the user to specify if DC-DC or LDO is used for power regulation.
* Using only LDO implies that the Rx or Tx current is doubled
*/
typedef enum
{
USE_LDO = 0x00, // default
USE_DCDC = 0x01,
}RadioRegulatorMode_t;
/*!
* \brief Represents the possible packet type (i.e. modem) used
*/
typedef enum
{
PACKET_TYPE_GFSK = 0x00,
PACKET_TYPE_LORA = 0x01,
PACKET_TYPE_BPSK = 0x02,
PACKET_TYPE_GMSK = 0x03,
PACKET_TYPE_NONE = 0x0F,
}RadioPacketTypes_t;
/*!
* \brief Represents the ramping time for power amplifier
*/
typedef enum
{
RADIO_RAMP_10_US = 0x00,
RADIO_RAMP_20_US = 0x01,
RADIO_RAMP_40_US = 0x02,
RADIO_RAMP_80_US = 0x03,
RADIO_RAMP_200_US = 0x04,
RADIO_RAMP_800_US = 0x05,
RADIO_RAMP_1700_US = 0x06,
RADIO_RAMP_3400_US = 0x07,
}RadioRampTimes_t;
/*!
* \brief Represents the number of symbols to be used for channel activity detection operation
*/
typedef enum
{
LORA_CAD_01_SYMBOL = 0x00,
LORA_CAD_02_SYMBOL = 0x01,
LORA_CAD_04_SYMBOL = 0x02,
LORA_CAD_08_SYMBOL = 0x03,
LORA_CAD_16_SYMBOL = 0x04,
}RadioLoRaCadSymbols_t;
/*!
* \brief Represents the Channel Activity Detection actions after the CAD operation is finished
*/
typedef enum
{
LORA_CAD_ONLY = 0x00,
LORA_CAD_RX = 0x01,
LORA_CAD_LBT = 0x10,
}RadioCadExitModes_t;
/*!
* \brief Represents the modulation shaping parameter
*/
typedef enum
{
MOD_SHAPING_OFF = 0x00,
MOD_SHAPING_G_BT_03 = 0x08,
MOD_SHAPING_G_BT_05 = 0x09,
MOD_SHAPING_G_BT_07 = 0x0A,
MOD_SHAPING_G_BT_1 = 0x0B,
MOD_SHAPING_DBPSK = 0x16,
}RadioModShapings_t;
/*!
* \brief Represents the modulation shaping parameter
*/
typedef enum
{
RX_BW_4800 = 0x1F,
RX_BW_5800 = 0x17,
RX_BW_7300 = 0x0F,
RX_BW_9700 = 0x1E,
RX_BW_11700 = 0x16,
RX_BW_14600 = 0x0E,
RX_BW_19500 = 0x1D,
RX_BW_23400 = 0x15,
RX_BW_29300 = 0x0D,
RX_BW_39000 = 0x1C,
RX_BW_46900 = 0x14,
RX_BW_58600 = 0x0C,
RX_BW_78200 = 0x1B,
RX_BW_93800 = 0x13,
RX_BW_117300 = 0x0B,
RX_BW_156200 = 0x1A,
RX_BW_187200 = 0x12,
RX_BW_234300 = 0x0A,
RX_BW_312000 = 0x19,
RX_BW_373600 = 0x11,
RX_BW_467000 = 0x09,
}RadioRxBandwidth_t;
/*!
* \brief Represents the possible spreading factor values in LoRa packet types
*/
typedef enum
{
LORA_SF5 = 0x05,
LORA_SF6 = 0x06,
LORA_SF7 = 0x07,
LORA_SF8 = 0x08,
LORA_SF9 = 0x09,
LORA_SF10 = 0x0A,
LORA_SF11 = 0x0B,
LORA_SF12 = 0x0C,
}RadioLoRaSpreadingFactors_t;
/*!
* \brief Represents the bandwidth values for LoRa packet type
*/
typedef enum
{
LORA_BW_500 = 6,
LORA_BW_250 = 5,
LORA_BW_125 = 4,
LORA_BW_062 = 3,
LORA_BW_041 = 10,
LORA_BW_031 = 2,
LORA_BW_020 = 9,
LORA_BW_015 = 1,
LORA_BW_010 = 8,
LORA_BW_007 = 0,
}RadioLoRaBandwidths_t;
/*!
* \brief Represents the coding rate values for LoRa packet type
*/
typedef enum
{
LORA_CR_4_5 = 0x01,
LORA_CR_4_6 = 0x02,
LORA_CR_4_7 = 0x03,
LORA_CR_4_8 = 0x04,
}RadioLoRaCodingRates_t;
/*!
* \brief Represents the preamble length used to detect the packet on Rx side
*/
typedef enum
{
RADIO_PREAMBLE_DETECTOR_OFF = 0x00, //!< Preamble detection length off
RADIO_PREAMBLE_DETECTOR_08_BITS = 0x04, //!< Preamble detection length 8 bits
RADIO_PREAMBLE_DETECTOR_16_BITS = 0x05, //!< Preamble detection length 16 bits
RADIO_PREAMBLE_DETECTOR_24_BITS = 0x06, //!< Preamble detection length 24 bits
RADIO_PREAMBLE_DETECTOR_32_BITS = 0x07, //!< Preamble detection length 32 bit
}RadioPreambleDetection_t;
/*!
* \brief Represents the possible combinations of SyncWord correlators activated
*/
typedef enum
{
RADIO_ADDRESSCOMP_FILT_OFF = 0x00, //!< No correlator turned on, i.e. do not search for SyncWord
RADIO_ADDRESSCOMP_FILT_NODE = 0x01,
RADIO_ADDRESSCOMP_FILT_NODE_BROAD = 0x02,
}RadioAddressComp_t;
/*!
* \brief Radio GFSK packet length mode
*/
typedef enum
{
RADIO_PACKET_FIXED_LENGTH = 0x00, //!< The packet is known on both sides, no header included in the packet
RADIO_PACKET_VARIABLE_LENGTH = 0x01, //!< The packet is on variable size, header included
}RadioPacketLengthModes_t;
/*!
* \brief Represents the CRC length
*/
typedef enum
{
RADIO_CRC_OFF = 0x01, //!< No CRC in use
RADIO_CRC_1_BYTES = 0x00,
RADIO_CRC_2_BYTES = 0x02,
RADIO_CRC_1_BYTES_INV = 0x04,
RADIO_CRC_2_BYTES_INV = 0x06,
RADIO_CRC_2_BYTES_IBM = 0xF1,
RADIO_CRC_2_BYTES_CCIT = 0xF2,
}RadioCrcTypes_t;
/*!
* \brief Radio whitening mode activated or deactivated
*/
typedef enum
{
RADIO_DC_FREE_OFF = 0x00,
RADIO_DC_FREEWHITENING = 0x01,
}RadioDcFree_t;
/*!
* \brief Holds the Radio lengths mode for the LoRa packet type
*/
typedef enum
{
LORA_PACKET_VARIABLE_LENGTH = 0x00, //!< The packet is on variable size, header included
LORA_PACKET_FIXED_LENGTH = 0x01, //!< The packet is known on both sides, no header included in the packet
LORA_PACKET_EXPLICIT = LORA_PACKET_VARIABLE_LENGTH,
LORA_PACKET_IMPLICIT = LORA_PACKET_FIXED_LENGTH,
}RadioLoRaPacketLengthsMode_t;
/*!
* \brief Represents the CRC mode for LoRa packet type
*/
typedef enum
{
LORA_CRC_ON = 0x01, //!< CRC activated
LORA_CRC_OFF = 0x00, //!< CRC not used
}RadioLoRaCrcModes_t;
/*!
* \brief Represents the IQ mode for LoRa packet type
*/
typedef enum
{
LORA_IQ_NORMAL = 0x00,
LORA_IQ_INVERTED = 0x01,
}RadioLoRaIQModes_t;
/*!
* \brief Represents the voltage used to control the TCXO on/off VDD_TCXO
*/
typedef enum
{
TCXO_CTRL_1_6V = 0x00,
TCXO_CTRL_1_7V = 0x01,
TCXO_CTRL_1_8V = 0x02,
TCXO_CTRL_2_2V = 0x03,
TCXO_CTRL_2_4V = 0x04,
TCXO_CTRL_2_7V = 0x05,
TCXO_CTRL_3_0V = 0x06,
TCXO_CTRL_3_3V = 0x07,
}RadioTcxoCtrlVoltage_t;
/*!
* \brief Represents the interruption masks available for the radio
*
* \remark Note that not all these interruptions are available for all packet types
*/
typedef enum
{
IRQ_RADIO_NONE = 0x0000,
IRQ_TX_DONE = 0x0001,
IRQ_RX_DONE = 0x0002,
IRQ_PREAMBLE_DETECTED = 0x0004,
IRQ_SYNCWORD_VALID = 0x0008,
IRQ_HEADER_VALID = 0x0010,
IRQ_HEADER_ERROR = 0x0020,
IRQ_CRC_ERROR = 0x0040,
IRQ_CAD_CLEAR = 0x0080,
IRQ_CAD_DETECTED = 0x0100,
IRQ_RX_TX_TIMEOUT = 0x0200,
IRQ_RADIO_ALL = 0xFFFF,
}RadioIrqMasks_t;
/*!
* \brief The type describing the modulation parameters for every packet types
*/
typedef struct
{
RadioPacketTypes_t PacketType; //!< Packet to which the modulation parameters are referring to.
struct
{
struct
{
uint32_t BitRate;
uint32_t Fdev;
RadioModShapings_t ModulationShaping;
uint8_t Bandwidth;
}Gfsk;
struct
{
uint32_t BitRate;
RadioModShapings_t ModulationShaping;
}Bpsk;
struct
{
RadioLoRaSpreadingFactors_t SpreadingFactor; //!< Spreading Factor for the LoRa modulation
RadioLoRaBandwidths_t Bandwidth; //!< Bandwidth for the LoRa modulation
RadioLoRaCodingRates_t CodingRate; //!< Coding rate for the LoRa modulation
uint8_t LowDatarateOptimize; //!< Indicates if the modem uses the low datarate optimization
}LoRa;
}Params; //!< Holds the modulation parameters structure
}ModulationParams_t;
/*!
* \brief The type describing the packet parameters for every packet types
*/
typedef struct
{
RadioPacketTypes_t PacketType; //!< Packet to which the packet parameters are referring to.
struct
{
/*!
* \brief Holds the GFSK packet parameters
*/
struct
{
uint16_t PreambleLength; //!< The preamble Tx length for GFSK packet type in bit
RadioPreambleDetection_t PreambleMinDetect; //!< The preamble Rx length minimal for GFSK packet type
uint8_t SyncWordLength; //!< The synchronization word length for GFSK packet type
RadioAddressComp_t AddrComp; //!< Activated SyncWord correlators
RadioPacketLengthModes_t HeaderType; //!< If the header is explicit, it will be transmitted in the GFSK packet. If the header is implicit, it will not be transmitted
uint8_t PayloadLength; //!< Size of the payload in the GFSK packet
RadioCrcTypes_t CrcLength; //!< Size of the CRC block in the GFSK packet
RadioDcFree_t DcFree;
}Gfsk;
/*!
* \brief Holds the BPSK packet parameters
*/
struct
{
uint8_t PayloadLength; //!< Size of the payload in the BPSK packet
}Bpsk;
/*!
* \brief Holds the LoRa packet parameters
*/
struct
{
uint16_t PreambleLength; //!< The preamble length is the number of LoRa symbols in the preamble
RadioLoRaPacketLengthsMode_t HeaderType; //!< If the header is explicit, it will be transmitted in the LoRa packet. If the header is implicit, it will not be transmitted
uint8_t PayloadLength; //!< Size of the payload in the LoRa packet
RadioLoRaCrcModes_t CrcMode; //!< Size of CRC block in LoRa packet
RadioLoRaIQModes_t InvertIQ; //!< Allows to swap IQ for LoRa packet
}LoRa;
}Params; //!< Holds the packet parameters structure
}PacketParams_t;
/*!
* \brief Represents the packet status for every packet type
*/
typedef struct
{
RadioPacketTypes_t packetType; //!< Packet to which the packet status are referring to.
struct
{
struct
{
uint8_t RxStatus;
int8_t RssiAvg; //!< The averaged RSSI
int8_t RssiSync; //!< The RSSI measured on last packet
uint32_t FreqError;
}Gfsk;
struct
{
int8_t RssiPkt; //!< The RSSI of the last packet
int8_t SnrPkt; //!< The SNR of the last packet
int8_t SignalRssiPkt;
uint32_t FreqError;
}LoRa;
}Params;
}PacketStatus_t;
/*!
* \brief Represents the Rx internal counters values when GFSK or LoRa packet type is used
*/
typedef struct
{
RadioPacketTypes_t packetType; //!< Packet to which the packet status are referring to.
uint16_t PacketReceived;
uint16_t CrcOk;
uint16_t LengthError;
}RxCounter_t;
/*!
* \brief Represents a calibration configuration
*/
typedef union
{
struct
{
uint8_t RC64KEnable : 1; //!< Calibrate RC64K clock
uint8_t RC13MEnable : 1; //!< Calibrate RC13M clock
uint8_t PLLEnable : 1; //!< Calibrate PLL
uint8_t ADCPulseEnable : 1; //!< Calibrate ADC Pulse
uint8_t ADCBulkNEnable : 1; //!< Calibrate ADC bulkN
uint8_t ADCBulkPEnable : 1; //!< Calibrate ADC bulkP
uint8_t ImgEnable : 1;
uint8_t : 1;
}Fields;
uint8_t Value;
}CalibrationParams_t;
/*!
* \brief Represents a sleep mode configuration
*/
typedef union
{
struct
{
uint8_t WakeUpRTC : 1; //!< Get out of sleep mode if wakeup signal received from RTC
uint8_t Reset : 1;
uint8_t WarmStart : 1;
uint8_t Reserved : 5;
}Fields;
uint8_t Value;
}SleepParams_t;
/*!
* \brief Represents the possible radio system error states
*/
typedef union
{
struct
{
uint8_t Rc64kCalib : 1; //!< RC 64kHz oscillator calibration failed
uint8_t Rc13mCalib : 1; //!< RC 13MHz oscillator calibration failed
uint8_t PllCalib : 1; //!< PLL calibration failed
uint8_t AdcCalib : 1; //!< ADC calibration failed
uint8_t ImgCalib : 1; //!< Image calibration failed
uint8_t XoscStart : 1; //!< XOSC oscillator failed to start
uint8_t PllLock : 1; //!< PLL lock failed
uint8_t BuckStart : 1; //!< Buck converter failed to start
uint8_t PaRamp : 1; //!< PA ramp failed
uint8_t : 7; //!< Reserved
}Fields;
uint16_t Value;
}RadioError_t;
/*!
* \brief Represents the operating mode the radio is actually running
*/
typedef enum
{
MODE_SLEEP = 0x00, //! The radio is in sleep mode
MODE_STDBY_RC, //! The radio is in standby mode with RC oscillator
MODE_STDBY_XOSC, //! The radio is in standby mode with XOSC oscillator
MODE_FS, //! The radio is in frequency synthesis mode
MODE_TX, //! The radio is in transmit mode
MODE_RX, //! The radio is in receive mode
MODE_RX_DC, //! The radio is in receive duty cycle mode
MODE_CAD //! The radio is in channel activity detection mode
}RadioOperatingModes_t;
/*!
* \brief Radio driver internal state machine states definition
*/
typedef enum
{
RFSWITCH_RX = 0, //!< The radio is in RX
RFSWITCH_TX = 1 //!< The radio is in TX
}RFState_t;
/*!
* Hardware IO IRQ callback function definition
*/
typedef void ( *DioIrqHandler )( RadioIrqMasks_t radioIrq );
#define RX_BUFFER_SIZE 256
/* External variables --------------------------------------------------------*/
/* Exported macros -----------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/*!
* ============================================================================
* Public functions prototypes
* ============================================================================
*/
/*!
* \brief Initializes the bus for SUBG_RF driver communication
*/
void SUBGRF_Init( DioIrqHandler dioIrq );
/*!
* \brief Gets the current Operation Mode of the Radio
*
* \retval RadioOperatingModes_t last operating mode
*/
RadioOperatingModes_t SUBGRF_GetOperatingMode( void );
/*!
* \brief Saves the payload to be send in the radio buffer
*
* \param [in] payload A pointer to the payload
* \param [in] size The size of the payload
*/
void SUBGRF_SetPayload( uint8_t *payload, uint8_t size );
/*!
* \brief Reads the payload received. If the received payload is longer
* than maxSize, then the method returns 1 and do not set size and payload.
*
* \param [out] payload A pointer to a buffer into which the payload will be copied
* \param [out] size A pointer to the size of the payload received
* \param [in] maxSize The maximal size allowed to copy into the buffer
*/
uint8_t SUBGRF_GetPayload( uint8_t *payload, uint8_t *size, uint8_t maxSize );
/*!
* \brief Sends a payload
*
* \param [in] payload A pointer to the payload to send
* \param [in] size The size of the payload to send
* \param [in] timeout The timeout for Tx operation
*/
void SUBGRF_SendPayload( uint8_t *payload, uint8_t size, uint32_t timeout );
/*!
* \brief Sets the Sync Word given by index used in GFSK
*
* \param [in] syncWord SyncWord bytes ( 8 bytes )
*
* \retval status [0: OK, 1: NOK]
*/
uint8_t SUBGRF_SetSyncWord( uint8_t *syncWord );
/*!
* \brief Sets the Initial value for the LFSR used for the CRC calculation
*
* \param [in] seed Initial LFSR value ( 2 bytes )
*
*/
void SUBGRF_SetCrcSeed( uint16_t seed );
/*!
* \brief Sets the seed used for the CRC calculation
*
* \param [in] seed The seed value
*
*/
void SUBGRF_SetCrcPolynomial( uint16_t polynomial );
/*!
* \brief Sets the Initial value of the LFSR used for the whitening in GFSK protocols
*
* \param [in] seed Initial LFSR value
*/
void SUBGRF_SetWhiteningSeed( uint16_t seed );
/*!
* \brief Gets a 32-bit random value generated by the radio
*
* \remark A valid packet type must have been configured with \ref SUBGRF_SetPacketType
* before using this command.
*
* \remark The radio must be in reception mode before executing this function
* This code can potentially result in interrupt generation. It is the responsibility of
* the calling code to disable radio interrupts before calling this function,
* and re-enable them afterwards if necessary, or be certain that any interrupts
* generated during this process will not cause undesired side-effects in the software.
*
* Please note that the random numbers produced by the generator do not have a uniform or Gaussian distribution. If
* uniformity is needed, perform appropriate software post-processing.
*
* \retval randomValue 32 bits random value
*/
uint32_t SUBGRF_GetRandom( void );
/*!
* \brief Sets the radio in sleep mode
*
* \param [in] sleepConfig The sleep configuration describing data
* retention and RTC wake-up
*/
void SUBGRF_SetSleep( SleepParams_t sleepConfig );
/*!
* \brief Sets the radio in configuration mode
*
* \param [in] mode The standby mode to put the radio into
*/
void SUBGRF_SetStandby( RadioStandbyModes_t mode );
/*!
* \brief Sets the radio in FS mode
*/
void SUBGRF_SetFs( void );
/*!
* \brief Sets the radio in transmission mode
*
* \param [in] timeout Structure describing the transmission timeout value
*/
void SUBGRF_SetTx( uint32_t timeout );
/*!
* \brief Sets the radio in reception mode
*
* \param [in] timeout Structure describing the reception timeout value
*/
void SUBGRF_SetRx( uint32_t timeout );
/*!
* \brief Sets the radio in reception mode with Boosted LNA gain
*
* \param [in] timeout Structure describing the reception timeout value
*/
void SUBGRF_SetRxBoosted( uint32_t timeout );
/*!
* \brief Sets the Rx duty cycle management parameters
*
* \param [in] rxTime Structure describing reception timeout value
* \param [in] sleepTime Structure describing sleep timeout value
*/
void SUBGRF_SetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime );
/*!
* \brief Sets the radio in CAD mode
*/
void SUBGRF_SetCad( void );
/*!
* \brief Sets the radio in continuous wave transmission mode
*/
void SUBGRF_SetTxContinuousWave( void );
/*!
* \brief Sets the radio in continuous preamble transmission mode
*/
void SUBGRF_SetTxInfinitePreamble( void );
/*!
* \brief Decide which interrupt will stop the internal radio rx timer.
*
* \param [in] enable [0: Timer stop after header/syncword detection
* 1: Timer stop after preamble detection]
*/
void SUBGRF_SetStopRxTimerOnPreambleDetect( bool enable );
/*!
* \brief Set the number of symbol the radio will wait to validate a reception
*
* \param [in] symbNum number of LoRa symbols
*/
void SUBGRF_SetLoRaSymbNumTimeout( uint8_t symbNum );
/*!
* \brief Sets the power regulators operating mode
*/
void SUBGRF_SetRegulatorMode( void );
/*!
* \brief Calibrates the given radio block
*
* \param [in] calibParam The description of blocks to be calibrated
*/
void SUBGRF_Calibrate( CalibrationParams_t calibParam );
/*!
* \brief Calibrates the Image rejection depending of the frequency
*
* \param [in] freq The operating frequency
*/
void SUBGRF_CalibrateImage( uint32_t freq );
/*!
* \brief Activate the extension of the timeout when long preamble is used
*
* \param [in] enable The radio will extend the timeout to cope with long preamble
*/
void SUBGRF_SetLongPreamble( uint8_t enable );
/*!
* \brief Sets the transmission parameters
*
* \param [in] paDutyCycle Duty Cycle for the PA
* \param [in] hpMax 0 for RFO_LP, 7 for RFO_HP
* \param [in] deviceSel 1 for RFO_LP, 0 for RFO_HP
* \param [in] paLut 0 for 14dBm LUT, 1 for 22dBm LUT
*/
void SUBGRF_SetPaConfig( uint8_t paDutyCycle, uint8_t hpMax, uint8_t deviceSel, uint8_t paLut );
/*!
* \brief Defines into which mode the chip goes after a TX / RX done
*
* \param [in] fallbackMode The mode in which the radio goes
*/
void SUBGRF_SetRxTxFallbackMode( uint8_t fallbackMode );
/*!
* \brief Write data to the radio memory
*
* \param [in] address The address of the first byte to write in the radio
* \param [in] buffer The data to be written in radio's memory
* \param [in] size The number of bytes to write in radio's memory
*/
void SUBGRF_WriteRegisters( uint16_t address, uint8_t *buffer, uint16_t size );
/*!
* \brief Read data from the radio memory
*
* \param [in] address The address of the first byte to read from the radio
* \param [out] buffer The buffer that holds data read from radio
* \param [in] size The number of bytes to read from radio's memory
*/
void SUBGRF_ReadRegisters( uint16_t address, uint8_t *buffer, uint16_t size );
/*!
* \brief Write data to the buffer holding the payload in the radio
*
* \param [in] offset The offset to start writing the payload
* \param [in] buffer The data to be written (the payload)
* \param [in] size The number of byte to be written
*/
void SUBGRF_WriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size );
/*!
* \brief Read data from the buffer holding the payload in the radio
*
* \param [in] offset The offset to start reading the payload
* \param [out] buffer A pointer to a buffer holding the data from the radio
* \param [in] size The number of byte to be read
*/
void SUBGRF_ReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size );
/*!
* \brief Sets the IRQ mask and DIO masks
*
* \param [in] irqMask General IRQ mask
* \param [in] dio1Mask DIO1 mask
* \param [in] dio2Mask DIO2 mask
* \param [in] dio3Mask DIO3 mask
*/
void SUBGRF_SetDioIrqParams( uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask );
/*!
* \brief Returns the current IRQ status
*
* \retval irqStatus IRQ status
*/
uint16_t SUBGRF_GetIrqStatus( void );
/*!
* \brief Indicates if the Radio main clock is supplied from a tcxo
*
* \param [in] tcxoVoltage voltage used to control the TCXO
* \param [in] timeout time given to the TCXO to go to 32MHz
*/
void SUBGRF_SetTcxoMode( RadioTcxoCtrlVoltage_t tcxoVoltage, uint32_t timeout );
/*!
* \brief Sets the RF frequency
*
* \param [in] frequency RF frequency [Hz]
*/
void SUBGRF_SetRfFrequency( uint32_t frequency );
/*!
* \brief Sets the radio for the given protocol
*
* \param [in] packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA]
*
* \remark This method has to be called before SetRfFrequency,
* SetModulationParams and SetPacketParams
*/
void SUBGRF_SetPacketType( RadioPacketTypes_t packetType );
/*!
* \brief Gets the current radio protocol
*
* \retval packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA]
*/
RadioPacketTypes_t SUBGRF_GetPacketType( void );
/*!
* \brief Sets the transmission parameters
*
* \param [in] paSelect RegPaConfig PaSelect value (RFO_LP, RFO_HP, etc)
* \param [in] power RF output power [-18..13] dBm
* \param [in] rampTime Transmission ramp up time
*/
void SUBGRF_SetTxParams( uint8_t paSelect, int8_t power, RadioRampTimes_t rampTime );
/*!
* \brief Set the modulation parameters
*
* \param [in] modParams A structure describing the modulation parameters
*/
void SUBGRF_SetModulationParams( ModulationParams_t *modParams );
/*!
* \brief Sets the packet parameters
*
* \param [in] packetParams A structure describing the packet parameters
*/
void SUBGRF_SetPacketParams( PacketParams_t *packetParams );
/*!
* \brief Sets the Channel Activity Detection (CAD) parameters
*
* \param [in] cadSymbolNum The number of symbol to use for CAD operations
* [LORA_CAD_01_SYMBOL, LORA_CAD_02_SYMBOL,
* LORA_CAD_04_SYMBOL, LORA_CAD_08_SYMBOL,
* LORA_CAD_16_SYMBOL]
* \param [in] cadDetPeak Limit for detection of SNR peak used in the CAD
* \param [in] cadDetMin Set the minimum symbol recognition for CAD
* \param [in] cadExitMode Operation to be done at the end of CAD action
* [LORA_CAD_ONLY, LORA_CAD_RX, LORA_CAD_LBT]
* \param [in] cadTimeout Defines the timeout value to abort the CAD activity
*/
void SUBGRF_SetCadParams( RadioLoRaCadSymbols_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, RadioCadExitModes_t cadExitMode, uint32_t cadTimeout );
/*!
* \brief Sets the data buffer base address for transmission and reception
*
* \param [in] txBaseAddress Transmission base address
* \param [in] rxBaseAddress Reception base address
*/
void SUBGRF_SetBufferBaseAddress( uint8_t txBaseAddress, uint8_t rxBaseAddress );
/*!
* \brief Gets the current radio status
*
* \retval status Radio status
*/
RadioStatus_t SUBGRF_GetStatus( void );
/*!
* \brief Returns the instantaneous RSSI value for the last packet received
*
* \retval rssiInst Instantaneous RSSI
*/
int8_t SUBGRF_GetRssiInst( void );
/*!
* \brief Gets the last received packet buffer status
*
* \param [out] payloadLength Last received packet payload length
* \param [out] rxStartBuffer Last received packet buffer address pointer
*/
void SUBGRF_GetRxBufferStatus( uint8_t *payloadLength, uint8_t *rxStartBuffer );
/*!
* \brief Gets the last received packet payload length
*
* \param [out] pktStatus A structure of packet status
*/
void SUBGRF_GetPacketStatus( PacketStatus_t *pktStatus );
/*!
* \brief Returns the possible system errors
*
* \retval sysErrors Value representing the possible sys failures
*/
RadioError_t SUBGRF_GetDeviceErrors( void );
/*!
* \brief Clear all the errors in the device
*/
void SUBGRF_ClearDeviceErrors( void );
/*!
* \brief Clears the IRQs
*
* \param [in] irq IRQ(s) to be cleared
*/
void SUBGRF_ClearIrqStatus( uint16_t irq );
/*!
* \brief Write radio register
* \param [in] address The address of the register
* \param [in] data data to write
* \retval none
*/
void SUBGRF_WriteRegister( uint16_t address, uint8_t data );
/*!
* \brief Read radio register
* \param [in] address The address of the register
* \retval Data read
*/
uint8_t SUBGRF_ReadRegister( uint16_t address );
/*!
* \brief Sets RF switch for TX & RX
* \param [in] paSelect Low Power or High Power board
* \param [in] rxtx RX/TX mode
* \retval none
*/
void SUBGRF_SetSwitch (uint8_t paSelect, RFState_t rxtx);
/*!
* \brief Set the Tx End Device conducted power
* \param [in] power Tx power level [0..15]
* \retval paSelect [RFO_LP, RFO_HP]
*/
uint8_t SUBGRF_SetRfTxPower( int8_t power );
/*!
* \brief Service to get the radio wake-up time.
* \param none
* \retval Value of the radio wake-up time.
*/
uint32_t SUBGRF_GetRadioWakeUpTime( void );
/*!
* \brief Returns the known FSK bandwidth registers value
*
* \param [IN] bandwidth Bandwidth value in Hz
* \retval regValue Bandwidth register value.
*/
uint8_t SUBGRF_GetFskBandwidthRegValue( uint32_t bandwidth );
/*!
* \brief SUBGRF_GetCFO get the frequency offset between the remote transmitter and the radio receiver
*
* \param [in] bitrate gfsk bitrate
* \param [OUT] cfo carrier frequency offset in Hertz
*/
void SUBGRF_GetCFO( uint32_t BitRate, int32_t * Cfo);
#ifdef __cplusplus
}
#endif
#endif // __RADIO_DRIVER_H__
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/