26#ifndef SX1272_LORARADIO_H_
27#define SX1272_LORARADIO_H_
32#include "InterruptIn.h"
33#include "DigitalOut.h"
34#include "DigitalInOut.h"
36#include "rtos/Mutex.h"
37#ifdef MBED_CONF_RTOS_PRESENT
38#include "rtos/Thread.h"
41#include "lorawan/LoRaRadio.h"
43#ifdef MBED_CONF_SX1272_LORA_DRIVER_BUFFER_SIZE
44#define MAX_DATA_BUFFER_SIZE_SX172 MBED_CONF_SX1272_LORA_DRIVER_BUFFER_SIZE
46#define MAX_DATA_BUFFER_SIZE_SX172 255
50#include "LowPowerTimeout.h"
51#define ALIAS_LORAWAN_TIMER mbed::LowPowerTimeout
54#define ALIAS_LORAWAN_TIMER mbed::Timeout
69 PinName miso = MBED_CONF_SX1272_LORA_DRIVER_SPI_MISO,
70 PinName sclk = MBED_CONF_SX1272_LORA_DRIVER_SPI_SCLK,
71 PinName nss = MBED_CONF_SX1272_LORA_DRIVER_SPI_CS,
72 PinName reset = MBED_CONF_SX1272_LORA_DRIVER_RESET,
73 PinName dio0 = MBED_CONF_SX1272_LORA_DRIVER_DIO0,
74 PinName dio1 = MBED_CONF_SX1272_LORA_DRIVER_DIO1,
75 PinName dio2 = MBED_CONF_SX1272_LORA_DRIVER_DIO2,
76 PinName dio3 = MBED_CONF_SX1272_LORA_DRIVER_DIO3,
77 PinName dio4 = MBED_CONF_SX1272_LORA_DRIVER_DIO4,
78 PinName dio5 = MBED_CONF_SX1272_LORA_DRIVER_DIO5,
79 PinName rf_switch_ctl1 = MBED_CONF_SX1272_LORA_DRIVER_RF_SWITCH_CTL1,
80 PinName rf_switch_ctl2 = MBED_CONF_SX1272_LORA_DRIVER_RF_SWITCH_CTL2,
81 PinName txctl = MBED_CONF_SX1272_LORA_DRIVER_TXCTL,
82 PinName rxctl = MBED_CONF_SX1272_LORA_DRIVER_RXCTL,
83 PinName ant_switch = MBED_CONF_SX1272_LORA_DRIVER_ANT_SWITCH,
84 PinName pwr_amp_ctl = MBED_CONF_SX1272_LORA_DRIVER_PWR_AMP_CTL,
85 PinName tcxo = MBED_CONF_SX1272_LORA_DRIVER_TCXO
117 uint32_t datarate, uint8_t coderate,
118 uint32_t bandwidth_afc, uint16_t preamble_len,
119 uint16_t symb_timeout,
bool fix_len,
121 bool crc_on,
bool freq_hop_on, uint8_t hop_period,
122 bool iq_inverted,
bool rx_continuous)
override;
154 uint32_t bandwidth, uint32_t datarate,
155 uint8_t coderate, uint16_t preamble_len,
156 bool fix_len,
bool crc_on,
bool freq_hop_on,
157 uint8_t hop_period,
bool iq_inverted, uint32_t timeout);
167 virtual void send(uint8_t *buffer, uint8_t size);
252 int16_t rssi_threshold,
253 uint32_t max_carrier_sense_time);
333 uint8_t _data_buffer[MAX_DATA_BUFFER_SIZE_SX172];
339 ALIAS_LORAWAN_TIMER tx_timeout_timer;
341#ifdef MBED_CONF_RTOS_PRESENT
349 uint8_t radio_variant;
354 bool radio_is_active;
357 void setup_registers();
358 void default_antenna_switch_ctrls();
359 void set_antenna_switch(uint8_t operation_mode);
363 void setup_interrupts();
364 void set_modem(uint8_t modem);
365 void set_operation_mode(uint8_t mode);
366 void set_low_power_mode(
bool status);
367 void set_sx1272_variant_type();
368 uint8_t get_pa_conf_reg();
369 void set_rf_tx_power(int8_t power);
371 uint8_t get_fsk_bw_reg_val(uint32_t bandwidth);
372 void write_to_register(uint8_t addr, uint8_t data);
373 void write_to_register(uint8_t addr, uint8_t *data, uint8_t size);
374 uint8_t read_register(uint8_t addr);
375 void read_register(uint8_t addr, uint8_t *buffer, uint8_t size);
376 void write_fifo(uint8_t *buffer, uint8_t size);
377 void read_fifo(uint8_t *buffer, uint8_t size);
378 void transmit(uint32_t timeout);
379 void rf_irq_task(
void);
388 void timeout_irq_isr();
391 void handle_dio0_irq();
392 void handle_dio1_irq();
393 void handle_dio2_irq();
394 void handle_dio3_irq();
395 void handle_dio4_irq();
396 void handle_dio5_irq();
397 void handle_timeout_irq();
Interface for the radios, containing the main functions that a radio needs, and five callback functio...
Radio driver implementation for Semtech SX1272 plus variants.
virtual bool check_rf_frequency(uint32_t frequency)
Check if the given RF is in range.
virtual void set_public_network(bool enable)
Sets the network to public or private.
void set_rx_config(radio_modems_t modem, uint32_t bandwidth, uint32_t datarate, uint8_t coderate, uint32_t bandwidth_afc, uint16_t preamble_len, uint16_t symb_timeout, bool fix_len, uint8_t payload_len, bool crc_on, bool freq_hop_on, uint8_t hop_period, bool iq_inverted, bool rx_continuous) override
Sets reception parameters.
virtual void set_channel(uint32_t freq)
Sets the carrier frequency.
virtual void receive(uint32_t timeout)
For backwards compatibility.
virtual uint32_t time_on_air(radio_modems_t modem, uint8_t pkt_len)
Computes the packet time on air for the given payload.
radio_state_t get_status(void) override
Gets the radio status.
virtual void unlock(void)
Release exclusive access.
virtual void set_tx_config(radio_modems_t modem, int8_t power, uint32_t fdev, uint32_t bandwidth, uint32_t datarate, uint8_t coderate, uint16_t preamble_len, bool fix_len, bool crc_on, bool freq_hop_on, uint8_t hop_period, bool iq_inverted, uint32_t timeout)
Sets the transmission parameters.
virtual void receive(void)
Sets the radio to receive.
virtual void send(uint8_t *buffer, uint8_t size)
Sends the buffer of size.
virtual ~SX1272_LoRaRadio()
Destructor.
virtual bool perform_carrier_sense(radio_modems_t modem, uint32_t freq, int16_t rssi_threshold, uint32_t max_carrier_sense_time)
Perform carrier sensing.
virtual void init_radio(radio_events_t *events)
Registers radio events with the Mbed LoRaWAN stack and undergoes initialization steps if any.
virtual void sleep(void)
Put the RF module in sleep mode.
virtual void standby(void)
Sets the radio in standby mode.
virtual void radio_reset()
Resets the radio module.
SX1272_LoRaRadio(PinName mosi=MBED_CONF_SX1272_LORA_DRIVER_SPI_MOSI, PinName miso=MBED_CONF_SX1272_LORA_DRIVER_SPI_MISO, PinName sclk=MBED_CONF_SX1272_LORA_DRIVER_SPI_SCLK, PinName nss=MBED_CONF_SX1272_LORA_DRIVER_SPI_CS, PinName reset=MBED_CONF_SX1272_LORA_DRIVER_RESET, PinName dio0=MBED_CONF_SX1272_LORA_DRIVER_DIO0, PinName dio1=MBED_CONF_SX1272_LORA_DRIVER_DIO1, PinName dio2=MBED_CONF_SX1272_LORA_DRIVER_DIO2, PinName dio3=MBED_CONF_SX1272_LORA_DRIVER_DIO3, PinName dio4=MBED_CONF_SX1272_LORA_DRIVER_DIO4, PinName dio5=MBED_CONF_SX1272_LORA_DRIVER_DIO5, PinName rf_switch_ctl1=MBED_CONF_SX1272_LORA_DRIVER_RF_SWITCH_CTL1, PinName rf_switch_ctl2=MBED_CONF_SX1272_LORA_DRIVER_RF_SWITCH_CTL2, PinName txctl=MBED_CONF_SX1272_LORA_DRIVER_TXCTL, PinName rxctl=MBED_CONF_SX1272_LORA_DRIVER_RXCTL, PinName ant_switch=MBED_CONF_SX1272_LORA_DRIVER_ANT_SWITCH, PinName pwr_amp_ctl=MBED_CONF_SX1272_LORA_DRIVER_PWR_AMP_CTL, PinName tcxo=MBED_CONF_SX1272_LORA_DRIVER_TCXO)
Use this constructor if pin definitions are provided manually.
virtual void set_tx_continuous_wave(uint32_t freq, int8_t power, uint16_t time)
Sets the radio in continuous wave transmission mode.
virtual uint32_t random(void)
Generates a 32 bits random value based on the RSSI readings.
virtual void lock(void)
Acquire exclusive access.
virtual void set_max_payload_length(radio_modems_t modem, uint8_t max)
Sets the maximum payload length.
virtual void start_cad(void)
Sets the radio in CAD mode.
A digital input/output, used for setting or reading a bi-directional pin.
A digital output, used for setting the state of a pin.
A digital interrupt input, used to call a function on a rising or falling edge.
An SPI Master, used for communicating with SPI slave devices.
The Mutex class is used to synchronize the execution of threads.
The Thread class allow defining, creating, and controlling thread functions in the system.
enum radio_state radio_state_t
Radio driver internal state.
enum modem_type radio_modems_t
Type of modem.
Reporting functions for upper layers.
Structure to hold RF controls for LoRa Radio.