GPIO retrabalhada e PABOOST selecionavel
SX126X/sx126x_ds.h
- Committer:
- MatteusCarr
- Date:
- 2021-05-20
- Revision:
- 6:f0616e516844
- Parent:
- 0:561d07a737bc
File content as of revision 6:f0616e516844:
/* * sx126x_ds.h * * Created on: Feb 20, 2019 * Author: hasnain */ #ifndef MBED_LORA_RADIO_DRV_SX126X_SX126X_DS_H_ #define MBED_LORA_RADIO_DRV_SX126X_SX126X_DS_H_ #include "LoRaRadio.h" /*! * \brief Provides the frequency of the chip running on the radio and the frequency step * * \remark These defines are used for computing the frequency divider to set the RF frequency */ #define XTAL_FREQ 32000000 #define FREQ_DIV 33554432 #define FREQ_STEP 0.95367431640625 // ((double)(XTAL_FREQ / (double)FREQ_DIV)) #define FREQ_ERR 0.47683715820312 /*! * \brief List of devices supported by this driver */ #define SX1261 0 #define SX1262 1 #define SX1268 2 /*! * \brief List of matching supported by the sx126x */ #define MATCHING_FREQ_915 0 #define MATCHING_FREQ_780 1 #define MATCHING_FREQ_490 2 #define MATCHING_FREQ_434 3 #define MATCHING_FREQ_280 4 #define MATCHING_FREQ_169 5 #define MATCHING_FREQ_868 6 /*! * \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 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 /*! * Syncword for Private LoRa networks */ #define LORA_MAC_PRIVATE_SYNCWORD 0x1424 /*! * Syncword for Public LoRa networks */ #define LORA_MAC_PUBLIC_SYNCWORD 0x3444 /*! * The address of the register giving a 4 bytes random number */ #define RANDOM_NUMBER_GENERATORBASEADDR 0x0819 /*! * The address of the register holding RX Gain value (0x94: power saving, 0x96: rx boosted) */ #define REG_RX_GAIN 0x08AC /*! * The address of the register holding frequency error indication */ #define REG_FREQUENCY_ERRORBASEADDR 0x076B /*! * Change the value on the device internal trimming capacitor */ #define REG_XTA_TRIM 0x0911 /*! * Set the current max value in the over current protection */ #define REG_OCP 0x08E7 /*! * \brief Represents the Rx internal counters values when GFSK or LoRa packet type is used */ typedef struct { radio_modems_t modem_type; //!< Packet to which the packet status are referring to. uint16_t packet_received; uint16_t crc_ok; uint16_t length_error; } rx_counter_t; /*! * \brief Represents a calibration configuration */ typedef union { struct { uint8_t rc64k_enable : 1; //!< Calibrate RC64K clock uint8_t rc13m_enable : 1; //!< Calibrate RC13M clock uint8_t pll_enable : 1; //!< Calibrate PLL uint8_t adc_pulse_enable : 1; //!< Calibrate ADC Pulse uint8_t adc_bulkN_enable : 1; //!< Calibrate ADC bulkN uint8_t adc_bulkP_enable : 1; //!< Calibrate ADC bulkP uint8_t img_enable : 1; uint8_t pad : 1; } fields; uint8_t value; } caliberation_params_t; /*! * \brief Represents the possible radio system error states */ typedef union { struct { uint8_t rc64k_calib : 1; //!< RC 64kHz oscillator calibration failed uint8_t rc13m_calib : 1; //!< RC 13MHz oscillator calibration failed uint8_t pll_calib : 1; //!< PLL calibration failed uint8_t adc_calib : 1; //!< ADC calibration failed uint8_t img_calib : 1; //!< Image calibration failed uint8_t xosc_start : 1; //!< XOSC oscillator failed to start uint8_t pll_lock : 1; //!< PLL lock failed uint8_t buck_start : 1; //!< Buck converter failed to start uint8_t pa_ramp : 1; //!< PA ramp failed uint8_t reserved : 7; //!< reserved } fields; uint16_t value; } radio_error_t; /*! * \brief Represents the operating mode the radio is actually running */ typedef enum { MODE_SLEEP = 0x00, //! The radio is in sleep mode MODE_DEEP_SLEEP, //! The radio is in deep-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 } radio_operating_mode_t; /*! * \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, } radio_standby_mode_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, } radio_regulator_mode_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, } radio_ramp_time_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, } lora_cad_symbols_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, } cad_exit_modes_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, } radio_mod_shaping_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, } radio_rx_bandwidth_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, } lora_spread_factors_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, } lora_bandwidths_t; const uint8_t lora_bandwidhts [] = {LORA_BW_125, LORA_BW_250, LORA_BW_500}; /*! * \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, } lora_coding_tates_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 } radio_preamble_detection_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, } radio_address_filter_t; /*! * \brief Radio packet length mode */ typedef enum { RADIO_PACKET_VARIABLE_LENGTH = 0x00, //!< The packet is on variable size, header included RADIO_PACKET_FIXED_LENGTH = 0x01, //!< The packet is known on both sides, no header included in the packet } radio_pkt_length_t; /*! * \brief Represents the CRC length */ typedef enum radio_crc_types_e{ 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, } radio_crc_types_t; /*! * \brief Radio whitening mode activated or deactivated */ typedef enum { RADIO_DC_FREE_OFF = 0x00, RADIO_DC_FREEWHITENING = 0x01, } radio_whitening_mode_t; /*! * \brief Holds the lengths mode of a 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, } lora_pkt_length_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 } lora_crc_mode_t; /*! * \brief Represents the IQ mode for LoRa packet type */ typedef enum { LORA_IQ_NORMAL = 0x00, LORA_IQ_INVERTED = 0x01, } lora_IQ_mode_t; /*! * \brief Represents the volatge used to control the TCXO on/off from DIO3 */ 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, } radio_TCXO_ctrl_voltage_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_DONE = 0x0080, IRQ_CAD_ACTIVITY_DETECTED = 0x0100, IRQ_RX_TX_TIMEOUT = 0x0200, IRQ_RADIO_ALL = 0xFFFF, } radio_irq_masks_t; typedef enum { RADIO_GET_STATUS = 0xC0, RADIO_WRITE_REGISTER = 0x0D, RADIO_READ_REGISTER = 0x1D, RADIO_WRITE_BUFFER = 0x0E, RADIO_READ_BUFFER = 0x1E, RADIO_SET_SLEEP = 0x84, RADIO_SET_STANDBY = 0x80, RADIO_SET_FS = 0xC1, RADIO_SET_TX = 0x83, RADIO_SET_RX = 0x82, RADIO_SET_RXDUTYCYCLE = 0x94, RADIO_SET_CAD = 0xC5, RADIO_SET_TXCONTINUOUSWAVE = 0xD1, RADIO_SET_TXCONTINUOUSPREAMBLE = 0xD2, RADIO_SET_PACKETTYPE = 0x8A, RADIO_GET_PACKETTYPE = 0x11, RADIO_SET_RFFREQUENCY = 0x86, RADIO_SET_TXPARAMS = 0x8E, RADIO_SET_PACONFIG = 0x95, RADIO_SET_CADPARAMS = 0x88, RADIO_SET_BUFFERBASEADDRESS = 0x8F, RADIO_SET_MODULATIONPARAMS = 0x8B, RADIO_SET_PACKETPARAMS = 0x8C, RADIO_GET_RXBUFFERSTATUS = 0x13, RADIO_GET_PACKETSTATUS = 0x14, RADIO_GET_RSSIINST = 0x15, RADIO_GET_STATS = 0x10, RADIO_RESET_STATS = 0x00, RADIO_CFG_DIOIRQ = 0x08, RADIO_GET_IRQSTATUS = 0x12, RADIO_CLR_IRQSTATUS = 0x02, RADIO_CALIBRATE = 0x89, RADIO_CALIBRATEIMAGE = 0x98, RADIO_SET_REGULATORMODE = 0x96, RADIO_GET_ERROR = 0x17, RADIO_CLR_ERROR = 0x07, RADIO_SET_TCXOMODE = 0x97, RADIO_SET_TXFALLBACKMODE = 0x93, RADIO_SET_RFSWITCHMODE = 0x9D, RADIO_SET_STOPRXTIMERONPREAMBLE = 0x9F, RADIO_SET_LORASYMBTIMEOUT = 0xA0, } opmode_commands_t; /*! * \brief Structure describing the radio status */ typedef union { uint8_t value; struct { //bit order is lsb -> msb uint8_t reserved : 1; //!< Reserved uint8_t cmd_status : 3; //!< Command status uint8_t chip_mode : 3; //!< Chip mode uint8_t cpu_busy : 1; //!< Flag for CPU radio busy } fields; } radio_status_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, } irq_error_t; typedef enum { IRQ_PBL_DETECT_CODE = 0x01, IRQ_SYNCWORD_VALID_CODE = 0x02, IRQ_HEADER_VALID_CODE = 0x04, } irq_valid_codes_t; typedef enum { IRQ_RX_TIMEOUT = 0x00, IRQ_TX_TIMEOUT = 0x01, } irq_timeout_t; typedef enum { RECEPTION_MODE_SINGLE = 0, RECEPTION_MODE_CONTINUOUS, RECEPTION_MODE_OTHER } reception_mode_t; /*! * \brief The type describing the modulation parameters for every packet types */ typedef struct { radio_modems_t modem_type; //!< Packet to which the modulation parameters are referring to. struct { struct { uint32_t bit_rate; uint32_t fdev; radio_mod_shaping_t modulation_shaping; uint8_t bandwidth; uint32_t operational_frequency; } gfsk; struct { lora_spread_factors_t spreading_factor; //!< Spreading Factor for the LoRa modulation lora_bandwidths_t bandwidth; //!< Bandwidth for the LoRa modulation lora_coding_tates_t coding_rate; //!< Coding rate for the LoRa modulation uint8_t low_datarate_optimization; //!< Indicates if the modem uses the low datarate optimization uint32_t operational_frequency; } lora; } params; //!< Holds the modulation parameters structure } modulation_params_t; /*! * \brief The type describing the packet parameters for every packet types */ typedef struct packet_params { radio_modems_t modem_type; //!< Packet to which the packet parameters are referring to. struct { /*! * \brief Holds the GFSK packet parameters */ struct { uint16_t preamble_length; //!< The preamble Tx length for GFSK packet type in bit radio_preamble_detection_t preamble_min_detect; //!< The preamble Rx length minimal for GFSK packet type uint8_t syncword_length; //!< The synchronization word length for GFSK packet type radio_address_filter_t addr_comp; //!< Activated SyncWord correlators radio_pkt_length_t header_type; //!< 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 payload_length; //!< Size of the payload in the GFSK packet radio_crc_types_t crc_length; //!< Size of the CRC block in the GFSK packet radio_whitening_mode_t whitening_mode; } gfsk; /*! * \brief Holds the LoRa packet parameters */ struct { uint16_t preamble_length; //!< The preamble length is the number of LoRa symbols in the preamble lora_pkt_length_t header_type; //!< 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 payload_length; //!< Size of the payload in the LoRa packet lora_crc_mode_t crc_mode; //!< Size of CRC block in LoRa packet lora_IQ_mode_t invert_IQ; //!< Allows to swap IQ for LoRa packet } lora; } params; //!< Holds the packet parameters structure } packet_params_t; /*! * \brief Represents the packet status for every packet type */ typedef struct { radio_modems_t modem_type; //!< Packet to which the packet status are referring to. struct { struct { uint8_t rx_status; int8_t rssi_avg; //!< The averaged RSSI int8_t rssi_sync; //!< The RSSI measured on last packet uint32_t freq_error; } gfsk; struct { int8_t rssi_pkt; //!< The RSSI of the last packet int8_t snr_pkt; //!< The SNR of the last packet int8_t signal_rssi_pkt; uint32_t freq_error; } lora; } params; } packet_status_t; #endif /* MBED_LORA_RADIO_DRV_SX126X_SX126X_DS_H_ */