Safe Sprinkler
Master/slave irrigation system (ESP-NOW + LoRaWAN)
Loading...
Searching...
No Matches
Data Structures | Macros | Functions
sx1276.h File Reference
#include "driver/spi_master.h"
#include "esp_err.h"
#include <stdbool.h>
#include <stdint.h>
Include dependency graph for sx1276.h:

Go to the source code of this file.

Data Structures

struct  sx1276_config_t
 
struct  sx1276_lora_config_t
 

Macros

#define SX1276_REG_FIFO   0x00
 
#define SX1276_REG_OP_MODE   0x01
 
#define SX1276_REG_FRF_MSB   0x06
 
#define SX1276_REG_FRF_MID   0x07
 
#define SX1276_REG_FRF_LSB   0x08
 
#define SX1276_REG_PA_CONFIG   0x09
 
#define SX1276_REG_PA_RAMP   0x0A
 
#define SX1276_REG_OCP   0x0B
 
#define SX1276_REG_LNA   0x0C
 
#define SX1276_REG_FIFO_ADDR_PTR   0x0D
 
#define SX1276_REG_FIFO_TX_BASE_ADDR   0x0E
 
#define SX1276_REG_FIFO_RX_BASE_ADDR   0x0F
 
#define SX1276_REG_FIFO_RX_CURRENT_ADDR   0x10
 
#define SX1276_REG_IRQ_FLAGS_MASK   0x11
 
#define SX1276_REG_IRQ_FLAGS   0x12
 
#define SX1276_REG_RX_NB_BYTES   0x13
 
#define SX1276_REG_PKT_SNR_VALUE   0x19
 
#define SX1276_REG_PKT_RSSI_VALUE   0x1A
 
#define SX1276_REG_MODEM_CONFIG_1   0x1D
 
#define SX1276_REG_MODEM_CONFIG_2   0x1E
 
#define SX1276_REG_SYMB_TIMEOUT_LSB   0x1F
 
#define SX1276_REG_PREAMBLE_MSB   0x20
 
#define SX1276_REG_PREAMBLE_LSB   0x21
 
#define SX1276_REG_PAYLOAD_LENGTH   0x22
 
#define SX1276_REG_MAX_PAYLOAD_LENGTH   0x23
 
#define SX1276_REG_HOP_PERIOD   0x24
 
#define SX1276_REG_FIFO_RX_BYTE_ADDR   0x25
 
#define SX1276_REG_MODEM_CONFIG_3   0x26
 
#define SX1276_REG_DETECTION_OPTIMIZE   0x31
 
#define SX1276_REG_DETECTION_THRESHOLD   0x37
 
#define SX1276_REG_SYNC_WORD   0x39
 
#define SX1276_REG_DIO_MAPPING_1   0x40
 
#define SX1276_REG_DIO_MAPPING_2   0x41
 
#define SX1276_REG_VERSION   0x42
 
#define SX1276_REG_PA_DAC   0x4D
 
#define SX1276_MODE_SLEEP   0x00
 
#define SX1276_MODE_STDBY   0x01
 
#define SX1276_MODE_FSTX   0x02
 
#define SX1276_MODE_TX   0x03
 
#define SX1276_MODE_FSRX   0x04
 
#define SX1276_MODE_RX_CONTINUOUS   0x05
 
#define SX1276_MODE_RX_SINGLE   0x06
 
#define SX1276_MODE_CAD   0x07
 
#define SX1276_MODE_LORA   0x80
 
#define SX1276_IRQ_CAD_DETECTED   0x01
 
#define SX1276_IRQ_FHSS_CHANGE_CHANNEL   0x02
 
#define SX1276_IRQ_CAD_DONE   0x04
 
#define SX1276_IRQ_TX_DONE   0x08
 
#define SX1276_IRQ_VALID_HEADER   0x10
 
#define SX1276_IRQ_PAYLOAD_CRC_ERROR   0x20
 
#define SX1276_IRQ_RX_DONE   0x40
 
#define SX1276_IRQ_RX_TIMEOUT   0x80
 

Functions

int sx1276_init (const sx1276_config_t *config)
 Initialize SX1276: GPIOs, SPI, reset chip, switch to LoRa and standby.
 
int sx1276_configure_lora (const sx1276_lora_config_t *config)
 Set LoRa parameters: frequency, SF, BW, TX power, sync word.
 
int sx1276_set_mode (uint8_t mode)
 Set operating mode (standby, TX, RX, etc.)
 
int sx1276_transmit (const uint8_t *data, uint8_t len)
 Load payload into FIFO and start transmit.
 
int sx1276_start_receive (void)
 Start continuous receive mode.
 
int sx1276_read_received (uint8_t *data, uint8_t *len, uint8_t max_len)
 Copy last received packet into buffer.
 
bool sx1276_is_tx_done (void)
 Check if last transmit has finished.
 
bool sx1276_is_rx_done (void)
 Check if a packet has been received.
 
void sx1276_clear_irq (void)
 Clear all IRQ flags.
 
uint8_t sx1276_get_irq_flags (void)
 Read raw IRQ flags register.
 
uint8_t sx1276_read_reg (uint8_t reg)
 Read one SX1276 register (low-level)
 
void sx1276_write_reg (uint8_t reg, uint8_t value)
 Write one SX1276 register (low-level)
 
void sx1276_reset (void)
 Hardware reset via RST pin.
 

Macro Definition Documentation

◆ SX1276_IRQ_CAD_DETECTED

#define SX1276_IRQ_CAD_DETECTED   0x01

◆ SX1276_IRQ_CAD_DONE

#define SX1276_IRQ_CAD_DONE   0x04

◆ SX1276_IRQ_FHSS_CHANGE_CHANNEL

#define SX1276_IRQ_FHSS_CHANGE_CHANNEL   0x02

◆ SX1276_IRQ_PAYLOAD_CRC_ERROR

#define SX1276_IRQ_PAYLOAD_CRC_ERROR   0x20

◆ SX1276_IRQ_RX_DONE

#define SX1276_IRQ_RX_DONE   0x40

◆ SX1276_IRQ_RX_TIMEOUT

#define SX1276_IRQ_RX_TIMEOUT   0x80

◆ SX1276_IRQ_TX_DONE

#define SX1276_IRQ_TX_DONE   0x08

◆ SX1276_IRQ_VALID_HEADER

#define SX1276_IRQ_VALID_HEADER   0x10

◆ SX1276_MODE_CAD

#define SX1276_MODE_CAD   0x07

◆ SX1276_MODE_FSRX

#define SX1276_MODE_FSRX   0x04

◆ SX1276_MODE_FSTX

#define SX1276_MODE_FSTX   0x02

◆ SX1276_MODE_LORA

#define SX1276_MODE_LORA   0x80

◆ SX1276_MODE_RX_CONTINUOUS

#define SX1276_MODE_RX_CONTINUOUS   0x05

◆ SX1276_MODE_RX_SINGLE

#define SX1276_MODE_RX_SINGLE   0x06

◆ SX1276_MODE_SLEEP

#define SX1276_MODE_SLEEP   0x00

◆ SX1276_MODE_STDBY

#define SX1276_MODE_STDBY   0x01

◆ SX1276_MODE_TX

#define SX1276_MODE_TX   0x03

◆ SX1276_REG_DETECTION_OPTIMIZE

#define SX1276_REG_DETECTION_OPTIMIZE   0x31

◆ SX1276_REG_DETECTION_THRESHOLD

#define SX1276_REG_DETECTION_THRESHOLD   0x37

◆ SX1276_REG_DIO_MAPPING_1

#define SX1276_REG_DIO_MAPPING_1   0x40

◆ SX1276_REG_DIO_MAPPING_2

#define SX1276_REG_DIO_MAPPING_2   0x41

◆ SX1276_REG_FIFO

#define SX1276_REG_FIFO   0x00

◆ SX1276_REG_FIFO_ADDR_PTR

#define SX1276_REG_FIFO_ADDR_PTR   0x0D

◆ SX1276_REG_FIFO_RX_BASE_ADDR

#define SX1276_REG_FIFO_RX_BASE_ADDR   0x0F

◆ SX1276_REG_FIFO_RX_BYTE_ADDR

#define SX1276_REG_FIFO_RX_BYTE_ADDR   0x25

◆ SX1276_REG_FIFO_RX_CURRENT_ADDR

#define SX1276_REG_FIFO_RX_CURRENT_ADDR   0x10

◆ SX1276_REG_FIFO_TX_BASE_ADDR

#define SX1276_REG_FIFO_TX_BASE_ADDR   0x0E

◆ SX1276_REG_FRF_LSB

#define SX1276_REG_FRF_LSB   0x08

◆ SX1276_REG_FRF_MID

#define SX1276_REG_FRF_MID   0x07

◆ SX1276_REG_FRF_MSB

#define SX1276_REG_FRF_MSB   0x06

◆ SX1276_REG_HOP_PERIOD

#define SX1276_REG_HOP_PERIOD   0x24

◆ SX1276_REG_IRQ_FLAGS

#define SX1276_REG_IRQ_FLAGS   0x12

◆ SX1276_REG_IRQ_FLAGS_MASK

#define SX1276_REG_IRQ_FLAGS_MASK   0x11

◆ SX1276_REG_LNA

#define SX1276_REG_LNA   0x0C

◆ SX1276_REG_MAX_PAYLOAD_LENGTH

#define SX1276_REG_MAX_PAYLOAD_LENGTH   0x23

◆ SX1276_REG_MODEM_CONFIG_1

#define SX1276_REG_MODEM_CONFIG_1   0x1D

◆ SX1276_REG_MODEM_CONFIG_2

#define SX1276_REG_MODEM_CONFIG_2   0x1E

◆ SX1276_REG_MODEM_CONFIG_3

#define SX1276_REG_MODEM_CONFIG_3   0x26

◆ SX1276_REG_OCP

#define SX1276_REG_OCP   0x0B

◆ SX1276_REG_OP_MODE

#define SX1276_REG_OP_MODE   0x01

◆ SX1276_REG_PA_CONFIG

#define SX1276_REG_PA_CONFIG   0x09

◆ SX1276_REG_PA_DAC

#define SX1276_REG_PA_DAC   0x4D

◆ SX1276_REG_PA_RAMP

#define SX1276_REG_PA_RAMP   0x0A

◆ SX1276_REG_PAYLOAD_LENGTH

#define SX1276_REG_PAYLOAD_LENGTH   0x22

◆ SX1276_REG_PKT_RSSI_VALUE

#define SX1276_REG_PKT_RSSI_VALUE   0x1A

◆ SX1276_REG_PKT_SNR_VALUE

#define SX1276_REG_PKT_SNR_VALUE   0x19

◆ SX1276_REG_PREAMBLE_LSB

#define SX1276_REG_PREAMBLE_LSB   0x21

◆ SX1276_REG_PREAMBLE_MSB

#define SX1276_REG_PREAMBLE_MSB   0x20

◆ SX1276_REG_RX_NB_BYTES

#define SX1276_REG_RX_NB_BYTES   0x13

◆ SX1276_REG_SYMB_TIMEOUT_LSB

#define SX1276_REG_SYMB_TIMEOUT_LSB   0x1F

◆ SX1276_REG_SYNC_WORD

#define SX1276_REG_SYNC_WORD   0x39

◆ SX1276_REG_VERSION

#define SX1276_REG_VERSION   0x42

Function Documentation

◆ sx1276_clear_irq()

void sx1276_clear_irq ( void  )

Clear all IRQ flags.

Call after handling TX done, RX done, or CRC error.

◆ sx1276_configure_lora()

int sx1276_configure_lora ( const sx1276_lora_config_t config)

Set LoRa parameters: frequency, SF, BW, TX power, sync word.

Call after sx1276_init() before transmit or receive.

Parameters
configLoRa modulation and RF parameters
Returns
ESP_OK on success, error code otherwise

◆ sx1276_get_irq_flags()

uint8_t sx1276_get_irq_flags ( void  )

Read raw IRQ flags register.

Returns
IRQ flags (e.g. SX1276_IRQ_PAYLOAD_CRC_ERROR, SX1276_IRQ_RX_DONE)

◆ sx1276_init()

int sx1276_init ( const sx1276_config_t config)

Initialize SX1276: GPIOs, SPI, reset chip, switch to LoRa and standby.

Parameters
configPin and SPI host configuration
Returns
ESP_OK on success (version check passes), error code otherwise

◆ sx1276_is_rx_done()

bool sx1276_is_rx_done ( void  )

Check if a packet has been received.

Returns
true when a packet is available (call sx1276_read_received), false otherwise

◆ sx1276_is_tx_done()

bool sx1276_is_tx_done ( void  )

Check if last transmit has finished.

Returns
true when TX is done, false otherwise

◆ sx1276_read_received()

int sx1276_read_received ( uint8_t *  data,
uint8_t *  len,
uint8_t  max_len 
)

Copy last received packet into buffer.

Call only after sx1276_is_rx_done() returns true.

Parameters
dataOutput buffer for payload
lenOn input: max_len; on output: actual received length
max_lenMaximum bytes to copy
Returns
ESP_OK on success, error code otherwise

◆ sx1276_read_reg()

uint8_t sx1276_read_reg ( uint8_t  reg)

Read one SX1276 register (low-level)

Parameters
regRegister address
Returns
Register value

◆ sx1276_reset()

void sx1276_reset ( void  )

Hardware reset via RST pin.

Holds RST low then high; use before or during init.

◆ sx1276_set_mode()

int sx1276_set_mode ( uint8_t  mode)

Set operating mode (standby, TX, RX, etc.)

Parameters
modeOne of SX1276_MODE_STDBY, SX1276_MODE_TX, SX1276_MODE_RX_CONTINUOUS, etc.
Returns
ESP_OK on success, error code otherwise

◆ sx1276_start_receive()

int sx1276_start_receive ( void  )

Start continuous receive mode.

Use sx1276_is_rx_done() then sx1276_read_received() to get the packet.

Returns
ESP_OK on success, error code otherwise

◆ sx1276_transmit()

int sx1276_transmit ( const uint8_t *  data,
uint8_t  len 
)

Load payload into FIFO and start transmit.

Poll sx1276_is_tx_done() for completion.

Parameters
dataPayload bytes
lenPayload length (bytes)
Returns
ESP_OK on success, error code otherwise

◆ sx1276_write_reg()

void sx1276_write_reg ( uint8_t  reg,
uint8_t  value 
)

Write one SX1276 register (low-level)

Parameters
regRegister address
valueValue to write