#ifndef SX1262_H #define SX1262_H #include "driver/spi_master.h" #include "driver/gpio.h" #include #include "buscfg.h" #include "mcp23018.h" #include #include "esp_task.h" #define TAG "SX1262" #define LOG_LOCAL_LEVEL ESP_LOG_DEBUG #include "esp_log.h" #define LOG_LOCAL_LEVEL ESP_LOG_DEBUG #define LORA_SPI_HOST SPI3_HOST extern spi_device_handle_t spi; typedef struct { uint8_t status; uint16_t error; } sx1262_status_t; typedef struct { uint16_t preambleLength; uint8_t headerType; uint8_t payloadLength; uint8_t crcType; uint8_t invertIQ; } sx1262_LoRaPacketParams_t; #define SX126X_DIOX_OUTPUT_ENABLE 0x0580 #define SX126X_DIOX_INPUT_ENABLE 0x0583 #define SX126X_DIOX_PULL_UP_CONTROL 0x0584 #define SX126X_DIOX_PULL_DOWN_CONTROL 0x0585 #define SX126X_WHITENING_INIT_MSB 0x06B8 #define SX126X_WHITENING_INIT_LSB 0x06B9 #define SX126X_CRC_INIT_MSB 0x06BC #define SX126X_CRC_INIT_LSB 0x06BD #define SX126X_CRC_POLY_MSB 0x06BE #define SX126X_CRC_POLY_LSB 0x06BF #define SX126X_SYNCWORD_0 0x06C0 #define SX126X_SYNCWORD_1 0x06C1 #define SX126X_SYNCWORD_2 0x06C2 #define SX126X_SYNCWORD_3 0x06C3 #define SX126X_SYNCWORD_4 0x06C4 #define SX126X_SYNCWORD_5 0x06C5 #define SX126X_SYNCWORD_6 0x06C6 #define SX126X_SYNCWORD_7 0x06C7 #define SX126X_NODE_ADDRESS 0x06CD #define SX126X_BROADCAST_ADDRESS 0x06CE #define SX126X_IQ_POLARITY_SETUP 0x0736 #define SX126X_LORA_SYNCWORD_MSB 0x0740 #define SX126X_LORA_SYNCWORD_LSB 0x0741 #define SX126X_RANDOM_NUMBER_0 0x0819 #define SX126X_RANDOM_NUMBER_1 0x081A #define SX126X_RANDOM_NUMBER_2 0x081B #define SX126X_RANDOM_NUMBER_3 0x081C #define SX126X_TX_MODULATION 0x0889 #define SX126X_RX_GAIN 0x08AC #define SX126X_TX_CLAMP_CONFIG 0x08D8 #define SX126X_OCP_CONFIGURATION 0x08E7 #define SX126X_RTC_CONTROL 0x0902 #define SX126X_XTA_TRIM 0x0911 #define SX126X_XTB_TRIM 0x0912 #define SX126X_DIO3_OUTPUT_VOLTAGE 0x0920 #define SX126X_EVENT_MASK 0x0944 // Default values where applicable #define SX126X_RX_GAIN_POWER_SAVING 0x94 #define SX126X_RX_GAIN_BOOSTED 0x96 #define SX126X_LORA_SYNCWORD_PUBLIC 0x3444 #define SX126X_LORA_SYNCWORD_PRIVATE 0x1424 #define SX126X_OCP_LEVEL_SX1262 0x38 // 140mA #define SX126X_OCP_LEVEL_SX1261 0x18 // 60mA typedef struct { uint8_t spreadingFactor; // LoRa SF: 0x05 (SF5) to 0x0C (SF12) uint8_t bandwidth; // LoRa BW: 0x00 (7.81 kHz) to 0x06 (500 kHz) uint8_t codingRate; // LoRa CR: 0x01 (4/5) to 0x04 (4/8) uint8_t lowDataRateOpt; // LDRO: 0x00 (disabled) or 0x01 (enabled) } sx1262_LoRaModulationParams_t; typedef struct { uint32_t bitRate; // GFSK bitrate (BR), calculated as 32 * Fxtal / BR uint8_t pulseShape; // GFSK filter: 0x00 (none) to 0x0B (Gaussian BT 1) uint8_t bandwidth; // GFSK RX bandwidth: 0x1F (4.8 kHz) to 0x09 (467 kHz) uint32_t frequencyDev; // GFSK frequency deviation (Fdev) } sx1262_GFSKModulationParams_t; #include #define XTAL_FREQ (double)32000000 #define FREQ_DIV (double)pow(2.0, 25.0) #define FREQ_STEP (double)(XTAL_FREQ / FREQ_DIV) #define SX1262_SLEEPCFG_ColdStart_RTCDisable 0 #define SX1262_SLEEPCFG_ColdStart_RTCEnable 1 #define SX1262_SLEEPCFG_WarmStart_RTCDisable 4 #define SX1262_SLEEPCFG_WarmStart_RTCEnable 5 #define SX1262_STANDBY_RC 0 #define SX1262_STANDBY_XOSC 1 #define SX1262_TIMEOUT_ONCE 0 #define SX1262_TIMEOUT_RX_CONTINOUS 0xFFFFFF #define SX1262_RECEIVE_MODE 0 #define SX1262_TRANSMIT_MODE 1 #define SX1262_STOP_TIMER_ON_PREAMBLE_DISABLE 0x00 #define SX1262_STOP_TIMER_ON_PREAMBLE_ENABLE 0x01 #define SX1262_REGULATOR_LDO_ONLY 0x00 #define SX1262_REGULATOR_DC_DC_LDO 0x01 #define SX1262_FALLBACK_FS 0x40 #define SX1262_FALLBACK_STANDBY_XOSC 0x30 #define SX1262_FALLBACK_RC 0x20 #define SX1262_IRQ_TXDone (1 << 0) #define SX1262_IRQ_RXDone (1 << 1) #define SX1262_IRQ_PreambleDetected (1 << 2) #define SX1262_IRQ_SyncWordValid (1 << 3) #define SX1262_IRQ_HeaderValid (1 << 4) #define SX1262_IRQ_HeaderError (1 << 5) #define SX1262_IRQ_CRCError (1 << 6) #define SX1262_IRQ_ChannelActivityDetectionDone (1 << 7) #define SX1262_IRQ_ChannelActivityDetected (1 << 8) #define SX1262_IRQ_Timeout (1 << 9) #define SX1262_IRQ_ALL (SX1262_IRQ_TXDone | SX1262_IRQ_RXDone | SX1262_IRQ_PreambleDetected | SX1262_IRQ_SyncWordValid | SX1262_IRQ_HeaderValid | SX1262_IRQ_HeaderError | SX1262_IRQ_CRCError | SX1262_IRQ_ChannelActivityDetectionDone | SX1262_IRQ_ChannelActivityDetected | SX1262_IRQ_Timeout) #define SX1262_TCXO_VOLTAGE16dV 0x00 #define SX1262_TCXO_VOLTAGE17dV 0x01 #define SX1262_TCXO_VOLTAGE18dV 0x02 #define SX1262_TCXO_VOLTAGE22dV 0x03 #define SX1262_TCXO_VOLTAGE24dV 0x04 #define SX1262_TCXO_VOLTAGE27dV 0x05 #define SX1262_TCXO_VOLTAGE30dV 0x06 #define SX1262_TCXO_VOLTAGE33dV 0x07 #define SX1262_PACKET_TYPE_GFSK 0x00 #define SX1262_PACKET_TYPE_LORA 0x01 #define SX1262_Ramp_10U (0x00) #define SX1262_Ramp_20U (0x01) #define SX1262_Ramp_40U (0x02) #define SX1262_Ramp_80U (0x03) #define SX1262_Ramp_200U (0x04) #define SX1262_Ramp_800U (0x05) #define SX1262_Ramp_1700U (0x06) #define SX1262_Ramp_3400U (0x07) #define SX1262_HEADER_TYPE_VARIABLE 0x00 #define SX1262_HEADER_TYPE_FIXED 0x01 #define SX1262_CRC_OFF 0x00 #define SX1262_CRC_ON 0x01 #define SX1262_STANDARD_IQ 0x00 #define SX1262_INVERTED_IQ 0x01 #define SX1262_CAD_ON_1_SYMB 0x00 #define SX1262_CAD_ON_2_SYMB 0x01 #define SX1262_CAD_ON_4_SYMB 0x02 #define SX1262_CAD_ON_8_SYMB 0x03 #define SX1262_CAD_ON_16_SYMB 0x04 #define SX1262_CAD_ONLY 0x00 #define SX1262_CAD_RX 0x01 #define SX1262_ERROR_CALIBRATION_RC64K (1 << 0) #define SX1262_ERROR_CALIBRATION_RC13M (1 << 1) #define SX1262_ERROR_CALIBRATION_PLL (1 << 2) #define SX1262_ERROR_CALIBRATION_ADC (1 << 3) #define SX1262_ERROR_CALIBRATION_IMG (1 << 4) #define SX1262_ERROR_CALIBRATION_XOSC (1 << 5) #define SX1262_ERROR_PLL_LOCK (1 << 6) #define SX1262_ERROR_PA_RAMP (1 << 8) #define SX1262_CALIB_RC64K (1 << 0) // RC64k calibration enabled #define SX1262_CALIB_RC13M (1 << 1) // RC13M calibration enabled #define SX1262_CALIB_PLL (1 << 2) // PLL calibration enabled #define SX1262_CALIB_ADC_PULSE (1 << 3) // ADC pulse calibration enabled #define SX1262_CALIB_ADC_BULK_N (1 << 4) // ADC bulk N calibration enabled #define SX1262_CALIB_ADC_BULK_P (1 << 5) // ADC bulk P calibration enabled #define SX1262_CALIB_IMAGE (1 << 6) // Image calibration enabled #define SX1262_CALIB_RESERVED (1 << 7) // Reserved bit (RFU) // Combined mask for all calibration settings #define SX1262_CALIBRATION_ALL (SX1262_CALIB_RC64K | SX1262_CALIB_RC13M | \ SX1262_CALIB_PLL | SX1262_CALIB_ADC_PULSE | \ SX1262_CALIB_ADC_BULK_N | SX1262_CALIB_ADC_BULK_P | \ SX1262_CALIB_IMAGE) // GFSK Pulse Shape #define SX1262_GFSK_NO_FILTER (0x00) #define SX1262_GFSK_BT_0_3 (0x08) #define SX1262_GFSK_BT_0_5 (0x09) #define SX1262_GFSK_BT_0_7 (0x0A) #define SX1262_GFSK_BT_1_0 (0x0B) // GFSK Bandwidth #define SX1262_GFSK_RX_BW_4800 (0x1F) #define SX1262_GFSK_RX_BW_5800 (0x17) #define SX1262_GFSK_RX_BW_7300 (0x0F) #define SX1262_GFSK_RX_BW_9700 (0x1E) #define SX1262_GFSK_RX_BW_11700 (0x16) #define SX1262_GFSK_RX_BW_14600 (0x0E) #define SX1262_GFSK_RX_BW_19500 (0x1D) #define SX1262_GFSK_RX_BW_23400 (0x15) #define SX1262_GFSK_RX_BW_29300 (0x0D) #define SX1262_GFSK_RX_BW_39000 (0x1C) #define SX1262_GFSK_RX_BW_46900 (0x14) #define SX1262_GFSK_RX_BW_58600 (0x0C) #define SX1262_GFSK_RX_BW_78200 (0x1B) #define SX1262_GFSK_RX_BW_93800 (0x13) #define SX1262_GFSK_RX_BW_117300 (0x0B) #define SX1262_GFSK_RX_BW_156200 (0x1A) #define SX1262_GFSK_RX_BW_187200 (0x12) #define SX1262_GFSK_RX_BW_234300 (0x0A) #define SX1262_GFSK_RX_BW_312000 (0x19) #define SX1262_GFSK_RX_BW_373600 (0x11) #define SX1262_GFSK_RX_BW_467000 (0x09) // LoRa Spreading Factor (SF) #define SX1262_LORA_SF5 (0x05) #define SX1262_LORA_SF6 (0x06) #define SX1262_LORA_SF7 (0x07) #define SX1262_LORA_SF8 (0x08) #define SX1262_LORA_SF9 (0x09) #define SX1262_LORA_SF10 (0x0A) #define SX1262_LORA_SF11 (0x0B) #define SX1262_LORA_SF12 (0x0C) // LoRa Bandwidth (BW) #define SX1262_LORA_BW_7 (0x00) // 7.81 kHz #define SX1262_LORA_BW_10 (0x08) // 10.42 kHz #define SX1262_LORA_BW_15 (0x01) // 15.63 kHz #define SX1262_LORA_BW_20 (0x09) // 20.83 kHz #define SX1262_LORA_BW_31 (0x02) // 31.25 kHz #define SX1262_LORA_BW_41 (0x0A) // 41.67 kHz #define SX1262_LORA_BW_62 (0x03) // 62.50 kHz #define SX1262_LORA_BW_125 (0x04) // 125 kHz #define SX1262_LORA_BW_250 (0x05) // 250 kHz #define SX1262_LORA_BW_500 (0x06) // 500 kHz // LoRa Coding Rate (CR) #define SX1262_LORA_CR_4_5 (0x01) #define SX1262_LORA_CR_4_6 (0x02) #define SX1262_LORA_CR_4_7 (0x03) #define SX1262_LORA_CR_4_8 (0x04) #define SX1262_LORA_SYNC_WORD_MSB (0x0740) #define SX1262_LORA_SYNC_WORD_LSB (0x0741) void sx1262_setPacketType(uint8_t packetType); void sx1262_init(); void sx1262_reset(); void sx1262_wait_for_busy(); void sx1262_write_command(uint8_t cmd, uint8_t *data, uint8_t len); void sx1262_read_command(uint8_t cmd, uint8_t *tx_payload_buffer, uint8_t tx_payload_len, uint8_t *rx_buffer, uint8_t len); sx1262_status_t sx1262_get_status(); void sx1262_setSleep(uint8_t sleepCFG); void sx1262_setStandby(uint8_t standbyConf); void sx1262_setFrequencySynthesis(); void sx1262_setMode(uint8_t mode, uint32_t timeout); void sx1262_stopTimerOnPreamble(uint8_t enable); void sx1262_setRxDutyCycle(uint32_t rxPeriod, uint32_t sleepPeriod); void sx1262_setChannelActivityDetection(void); void sx1262_setTxContinuousWave(void); void sx1262_setTxInfinitePreamble(void); void sx1262_setRegulatorMode(uint8_t mode); void sx1262_calibrate(uint8_t calibParam); void sx1262_calibrateImage(uint8_t freq1, uint8_t freq2); void sx1262_setRxTXFallbackMode(uint8_t fallbackMode); void sx1262_writeRegister(uint16_t address, const uint8_t *data, size_t length); void sx1262_readRegister(uint16_t address, uint8_t *data, size_t length); void sx1262_writeBuffer(uint8_t offset, const uint8_t *data, size_t length); void sx1262_readBuffer(uint8_t offset, uint8_t *data, size_t length); void sx1262_setDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask); uint16_t sx1262_getIrqStatus(void); void sx1262_clearIrqStatus(uint16_t clearIrqParam); void sx1262_setDIO2AsRfSwitchCtrl(uint8_t enable); void sx1262_setDIO3AsTCXOCtrl(uint8_t tcxoVoltage, uint32_t delay); void sx1262_setFrequency(uint32_t frequency); uint8_t sx1262_getPacketType(); void sx1262_configure_tx_power(uint8_t paDutyCycle, uint8_t hpMax, uint8_t paLut, int8_t power, uint8_t rampTime); void sx1262_setLoRaPacketParams(sx1262_LoRaPacketParams_t *params); void sx1262_setCadParams(uint8_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, uint8_t cadExitMode, uint32_t cadTimeout); void sx1262_setBufferBaseAddress(uint8_t txBaseAddr, uint8_t rxBaseAddr); void sx1262_setLoRaSymbNumTimeout(uint8_t symbNum); void sx1262_getStatus(uint8_t *status); void sx1262_getRxBufferStatus(uint8_t *payloadLengthRx, uint8_t *rxStartBufferPointer); void sx1262_getPacketStatus(uint8_t *rssi, uint8_t *snr, uint8_t *signalRssi); uint8_t sx1262_getRssiInst(uint8_t *rssiInst); void sx1262_getStats(uint16_t *pktReceived, uint16_t *pktCrcError, uint16_t *pktHeaderErr); void sx1262_resetStats(void); uint16_t sx1262_getDeviceErrors(); void sx1262_clearDeviceErrors(void); void sx1262_setLoRaModulationParams(const sx1262_LoRaModulationParams_t *params); void sx1262_setGFSKModulationParams(const sx1262_GFSKModulationParams_t *params); #endif