LoRaWANCH341 Library
Loading...
Searching...
No Matches
RFM95.hpp
Go to the documentation of this file.
1
32#ifndef RFM95_HPP
33#define RFM95_HPP
34
35#include "CH341SPI.hpp"
36#include "SPIInterface.hpp"
37#include <cstdint>
38#include <vector>
39#include <string>
40#include <chrono>
41#include <thread>
42#include <memory>
43
53class RFM95
54{
55public:
56 // RFM95 Register Addresses
57 static constexpr uint8_t REG_FIFO = 0x00;
58 static constexpr uint8_t REG_OP_MODE = 0x01;
59 static constexpr uint8_t REG_FRF_MSB = 0x06;
60 static constexpr uint8_t REG_FRF_MID = 0x07;
61 static constexpr uint8_t REG_FRF_LSB = 0x08;
62 static constexpr uint8_t REG_PA_CONFIG = 0x09;
63 static constexpr uint8_t REG_PA_RAMP = 0x0A;
64 static constexpr uint8_t REG_OCP = 0x0B;
65 static constexpr uint8_t REG_LNA = 0x0C;
66 static constexpr uint8_t REG_FIFO_ADDR_PTR = 0x0D;
67 static constexpr uint8_t REG_FIFO_TX_BASE_ADDR = 0x0E;
68 static constexpr uint8_t REG_FIFO_RX_BASE_ADDR = 0x0F;
69 static constexpr uint8_t REG_FIFO_RX_CURRENT_ADDR = 0x10;
70 static constexpr uint8_t REG_IRQ_FLAGS_MASK = 0x11;
71 static constexpr uint8_t REG_IRQ_FLAGS = 0x12;
72 static constexpr uint8_t REG_RX_NB_BYTES = 0x13;
73 static constexpr uint8_t REG_PKT_SNR_VALUE = 0x19;
74 static constexpr uint8_t REG_PKT_RSSI_VALUE = 0x1A;
75 static constexpr uint8_t REG_MODEM_CONFIG_1 = 0x1D;
76 static constexpr uint8_t REG_MODEM_CONFIG_2 = 0x1E;
77 static constexpr uint8_t REG_PREAMBLE_MSB = 0x20;
78 static constexpr uint8_t REG_PREAMBLE_LSB = 0x21;
79 static constexpr uint8_t REG_PAYLOAD_LENGTH = 0x22;
80 static constexpr uint8_t REG_MODEM_CONFIG_3 = 0x26;
81 static constexpr uint8_t REG_FREQ_ERROR_MSB = 0x28;
82 static constexpr uint8_t REG_FREQ_ERROR_MID = 0x29;
83 static constexpr uint8_t REG_FREQ_ERROR_LSB = 0x2A;
84 static constexpr uint8_t REG_RSSI_WIDEBAND = 0x2C;
85 static constexpr uint8_t REG_DETECTION_OPTIMIZE = 0x31;
86 static constexpr uint8_t REG_INVERTIQ = 0x33;
87 static constexpr uint8_t REG_DETECTION_THRESHOLD = 0x37;
88 static constexpr uint8_t REG_SYNC_WORD = 0x39;
89 static constexpr uint8_t REG_INVERTIQ2 = 0x3B;
90 static constexpr uint8_t REG_DIO_MAPPING_1 = 0x40;
91 static constexpr uint8_t REG_DIO_MAPPING_2 = 0x41;
92 static constexpr uint8_t REG_VERSION = 0x42;
93 static constexpr uint8_t REG_PA_DAC = 0x4D;
94
95 // RFM95 Operation Modes
96 static constexpr uint8_t MODE_SLEEP = 0x00;
97 static constexpr uint8_t MODE_STDBY = 0x01;
98 static constexpr uint8_t MODE_TX = 0x03;
99 static constexpr uint8_t MODE_RX_CONTINUOUS = 0x05;
100 static constexpr uint8_t MODE_RX_SINGLE = 0x06;
101
102 // PA Config
103 static constexpr uint8_t PA_BOOST = 0x80;
104
105 // IRQ Flags
106 static constexpr uint8_t IRQ_CAD_DONE_MASK = 0x01;
107 static constexpr uint8_t IRQ_CAD_DETECTED_MASK = 0x02;
108 static constexpr uint8_t IRQ_RX_TIMEOUT_MASK = 0x04;
109 static constexpr uint8_t IRQ_TX_DONE_MASK = 0x08;
110 static constexpr uint8_t IRQ_VALID_HEADER_MASK = 0x10;
111 static constexpr uint8_t IRQ_PAYLOAD_CRC_ERROR_MASK = 0x20;
112 static constexpr uint8_t IRQ_RX_DONE_MASK = 0x40;
113 static constexpr uint8_t IRQ_TX_TIMEOUT_MASK = 0x80;
114
115 // DIO Mapping
116 static constexpr uint8_t DIO0_RX_DONE = 0x00;
117 static constexpr uint8_t DIO0_TX_DONE = 0x40;
118 static constexpr uint8_t DIO1_RX_TIMEOUT = 0x00;
119 static constexpr uint8_t DIO3_TX_DONE = 0x40; // 01 para DIO3
120 static constexpr uint8_t DIO4_RX_DONE = 0x00; // 00 para DIO4
121 static constexpr uint8_t DIO_TX_PIN = 0x03;
122 static constexpr uint8_t DIO_RX_PIN = 0x04;
123
129 RFM95(int device_index = 0);
130
136 RFM95(std::unique_ptr<SPIInterface> spi_interface);
137
141 ~RFM95();
142
148 bool begin();
149
153 void end();
154
160 void setFrequency(float freq_mhz);
161
167 float getFrequency();
168
175 void setTxPower(int level, bool use_pa_boost = true);
176
182 int getTxPower();
183
189 void setSpreadingFactor(int sf);
190
196 int getSpreadingFactor();
197
203 void setBandwidth(float bw_khz);
204
210 float getBandwidth();
211
217 void setCodingRate(int denominator);
218
224 int getCodingRate();
225
231 void setPreambleLength(int length);
232
238 int getPreambleLength();
239
245 void setInvertIQ(bool invert = false);
246
252 bool getInvertIQ();
253
259 void setSyncWord(uint8_t sync_word);
260
266 uint8_t getSyncWord();
267
274 void setLNA(int lna_gain = -1, bool lna_boost = true);
275
281 uint8_t getLNA();
282
288 void setAutoAGC(bool enable);
289
295 bool getAutoAGC();
296
300 void clearIRQFlags();
301
307 uint8_t getIRQFlags();
308
312 void clearIRQFlagTxDone();
313
317 void clearIRQFlagRxDone();
318
324 bool getRxDone();
325
331 bool getTxDone();
332
338 bool getRxError();
339
345 bool getValidHeader();
346
352 bool getCADDone();
353
359 bool getCADDetected();
360
366 bool getPayloadCRCError();
367
373 void setLoRaMode(bool enable = true);
374
382 bool send(const std::vector<uint8_t> &data, bool invert_iq = false);
383
391 std::vector<uint8_t> receive(float timeout = 5.0, bool invert_iq = false);
392
397
401 void standbyMode();
402
406 void sleepMode();
407
411 void resetPtrRx();
412
418 uint8_t getFifoRxCurrentAddr();
419
425 uint8_t getRxNbBytes();
426
432 std::vector<uint8_t> readPayload();
433
439 float getRSSI();
440
446 float getSNR();
447
454 uint8_t readRegister(uint8_t address);
455
462 void writeRegister(uint8_t address, uint8_t value);
463
467 void receiveMode();
468
475 void setDIOMapping(uint8_t _dio3 = 0x40, uint8_t _dio4 = 0x00);
476
483 bool calibrateTemperature(float actual_temp);
484
490 float readTemperature();
491
499 bool setBeaconMode(int interval_ms, const std::vector<uint8_t> &payload);
500
504 void stopBeaconMode();
505
509 void checkOperatingMode();
510
514 void checkIRQFlags();
515
519 void printRegisters();
520
526 bool testCommunication();
527
533 uint8_t readVersionRegister();
534
535private:
536 std::unique_ptr<SPIInterface> spi;
537};
538
539#endif // RFM95_HPP
Header file for the CH341SPI class, which implements the SPIInterface for the CH341 USB to SPI adapte...
Class for handling RFM95 LoRa module.
Definition RFM95.hpp:54
static constexpr uint8_t REG_DIO_MAPPING_1
Definition RFM95.hpp:90
static constexpr uint8_t PA_BOOST
Definition RFM95.hpp:103
std::vector< uint8_t > receive(float timeout=5.0, bool invert_iq=false)
Receive data packet.
Definition RFM95.cpp:443
static constexpr uint8_t MODE_RX_CONTINUOUS
Definition RFM95.hpp:99
void checkOperatingMode()
Check and print current operating mode.
Definition RFM95.cpp:763
static constexpr uint8_t REG_MODEM_CONFIG_3
Definition RFM95.hpp:80
bool getValidHeader()
Check if valid header flag is set.
Definition RFM95.cpp:341
static constexpr uint8_t IRQ_PAYLOAD_CRC_ERROR_MASK
Definition RFM95.hpp:111
static constexpr uint8_t REG_DETECTION_OPTIMIZE
Definition RFM95.hpp:85
void setTxPower(int level, bool use_pa_boost=true)
Set transmit power level.
Definition RFM95.cpp:125
static constexpr uint8_t REG_PREAMBLE_LSB
Definition RFM95.hpp:78
static constexpr uint8_t MODE_STDBY
Definition RFM95.hpp:97
void setLNA(int lna_gain=-1, bool lna_boost=true)
Set LNA gain and boost.
Definition RFM95.cpp:263
bool getAutoAGC()
Check if automatic gain control is enabled.
Definition RFM95.cpp:301
void clearIRQFlagRxDone()
Clear RX done flag.
Definition RFM95.cpp:321
static constexpr uint8_t REG_IRQ_FLAGS
Definition RFM95.hpp:71
void sleepMode()
Set sleep mode.
Definition RFM95.cpp:556
static constexpr uint8_t REG_FREQ_ERROR_LSB
Definition RFM95.hpp:83
void setDIOMapping(uint8_t _dio3=0x40, uint8_t _dio4=0x00)
Configure DIO pins for TX/RX indication.
Definition RFM95.cpp:645
static constexpr uint8_t REG_FIFO_ADDR_PTR
Definition RFM95.hpp:66
~RFM95()
Destructor.
Definition RFM95.cpp:40
static constexpr uint8_t IRQ_RX_TIMEOUT_MASK
Definition RFM95.hpp:108
float getBandwidth()
Get current bandwidth in kHz.
Definition RFM95.cpp:194
bool calibrateTemperature(float actual_temp)
Calibrate temperature sensor with a reference temperature.
Definition RFM95.cpp:662
bool getTxDone()
Check if TX done flag is set.
Definition RFM95.cpp:331
void clearIRQFlags()
Clear all IRQ flags.
Definition RFM95.cpp:306
static constexpr uint8_t MODE_SLEEP
Definition RFM95.hpp:96
bool getRxError()
Check if RX error flag is set.
Definition RFM95.cpp:336
static constexpr uint8_t REG_DIO_MAPPING_2
Definition RFM95.hpp:91
void setInvertIQ(bool invert=false)
Set IQ inversion (used for LoRaWAN downlinks)
Definition RFM95.cpp:232
void standbyMode()
Set standby mode.
Definition RFM95.cpp:551
float getRSSI()
Get current RSSI in dBm.
Definition RFM95.cpp:598
static constexpr uint8_t REG_INVERTIQ
Definition RFM95.hpp:86
void setSpreadingFactor(int sf)
Set spreading factor (6-12)
Definition RFM95.cpp:149
void receiveMode()
Put the module in continuous receive mode.
Definition RFM95.cpp:626
static constexpr uint8_t DIO4_RX_DONE
Definition RFM95.hpp:120
static constexpr uint8_t REG_FRF_LSB
Definition RFM95.hpp:61
std::vector< uint8_t > readPayload()
Read received data packet.
Definition RFM95.cpp:578
static constexpr uint8_t IRQ_CAD_DETECTED_MASK
Definition RFM95.hpp:107
void stopBeaconMode()
Stop beacon mode.
Definition RFM95.cpp:758
int getSpreadingFactor()
Get current spreading factor.
Definition RFM95.cpp:169
static constexpr uint8_t REG_FRF_MSB
Definition RFM95.hpp:59
bool begin()
Initialize RFM95 module.
Definition RFM95.cpp:45
static constexpr uint8_t REG_PREAMBLE_MSB
Definition RFM95.hpp:77
uint8_t readRegister(uint8_t address)
Read a register value.
Definition RFM95.cpp:609
void setCodingRate(int denominator)
Set coding rate denominator (5-8, giving rates of 4/5, 4/6, 4/7, 4/8)
Definition RFM95.cpp:202
void resetPtrRx()
Reset RX pointer.
Definition RFM95.cpp:563
static constexpr uint8_t MODE_TX
Definition RFM95.hpp:98
static constexpr uint8_t REG_SYNC_WORD
Definition RFM95.hpp:88
uint8_t getFifoRxCurrentAddr()
Get current RX FIFO address.
Definition RFM95.cpp:568
static constexpr uint8_t IRQ_RX_DONE_MASK
Definition RFM95.hpp:112
static constexpr uint8_t REG_MODEM_CONFIG_1
Definition RFM95.hpp:75
float getSNR()
Get last packet SNR in dB.
Definition RFM95.cpp:603
float getFrequency()
Get current frequency in MHz.
Definition RFM95.cpp:109
uint8_t getSyncWord()
Get current sync word.
Definition RFM95.cpp:258
static constexpr uint8_t REG_RX_NB_BYTES
Definition RFM95.hpp:72
bool testCommunication()
Test basic SPI communication.
Definition RFM95.cpp:796
static constexpr uint8_t REG_FIFO_RX_BASE_ADDR
Definition RFM95.hpp:68
static constexpr uint8_t REG_OP_MODE
Definition RFM95.hpp:58
static constexpr uint8_t MODE_RX_SINGLE
Definition RFM95.hpp:100
static constexpr uint8_t REG_INVERTIQ2
Definition RFM95.hpp:89
int getCodingRate()
Get current coding rate denominator.
Definition RFM95.cpp:212
bool send(const std::vector< uint8_t > &data, bool invert_iq=false)
Send data packet.
Definition RFM95.cpp:376
static constexpr uint8_t REG_PA_DAC
Definition RFM95.hpp:93
static constexpr uint8_t REG_FRF_MID
Definition RFM95.hpp:60
static constexpr uint8_t REG_OCP
Definition RFM95.hpp:64
bool getCADDone()
Check if CAD done flag is set.
Definition RFM95.cpp:346
static constexpr uint8_t DIO3_TX_DONE
Definition RFM95.hpp:119
std::unique_ptr< SPIInterface > spi
Unique pointer to SPI interface implementation.
Definition RFM95.hpp:536
void checkIRQFlags()
Check and print IRQ flags.
Definition RFM95.cpp:771
static constexpr uint8_t REG_PAYLOAD_LENGTH
Definition RFM95.hpp:79
void setPreambleLength(int length)
Set preamble length (6-65535)
Definition RFM95.cpp:219
static constexpr uint8_t REG_RSSI_WIDEBAND
Definition RFM95.hpp:84
uint8_t readVersionRegister()
Read VERSION register (0x42) directly.
Definition RFM95.cpp:808
uint8_t getRxNbBytes()
Get number of received bytes.
Definition RFM95.cpp:573
void end()
Close the connection.
Definition RFM95.cpp:94
static constexpr uint8_t DIO0_RX_DONE
Definition RFM95.hpp:116
static constexpr uint8_t REG_FREQ_ERROR_MSB
Definition RFM95.hpp:81
static constexpr uint8_t DIO1_RX_TIMEOUT
Definition RFM95.hpp:118
static constexpr uint8_t IRQ_VALID_HEADER_MASK
Definition RFM95.hpp:110
static constexpr uint8_t REG_PKT_SNR_VALUE
Definition RFM95.hpp:73
void printRegisters()
Print key registers for debugging.
Definition RFM95.cpp:785
static constexpr uint8_t REG_IRQ_FLAGS_MASK
Definition RFM95.hpp:70
static constexpr uint8_t REG_FREQ_ERROR_MID
Definition RFM95.hpp:82
uint8_t getIRQFlags()
Get current IRQ flags.
Definition RFM95.cpp:311
bool setBeaconMode(int interval_ms, const std::vector< uint8_t > &payload)
Configure beacon mode with automatic periodic transmission.
Definition RFM95.cpp:724
void setSyncWord(uint8_t sync_word)
Set sync word.
Definition RFM95.cpp:253
static constexpr uint8_t REG_VERSION
Definition RFM95.hpp:92
bool getPayloadCRCError()
Check if payload CRC error flag is set.
Definition RFM95.cpp:356
static constexpr uint8_t REG_FIFO
Definition RFM95.hpp:57
int getPreambleLength()
Get current preamble length.
Definition RFM95.cpp:225
void clearIRQFlagTxDone()
Clear TX done flag.
Definition RFM95.cpp:316
static constexpr uint8_t DIO0_TX_DONE
Definition RFM95.hpp:117
static constexpr uint8_t REG_FIFO_RX_CURRENT_ADDR
Definition RFM95.hpp:69
bool getRxDone()
Check if RX done flag is set.
Definition RFM95.cpp:326
static constexpr uint8_t REG_PKT_RSSI_VALUE
Definition RFM95.hpp:74
static constexpr uint8_t REG_DETECTION_THRESHOLD
Definition RFM95.hpp:87
void setLoRaMode(bool enable=true)
Enable or disable LoRa mode.
Definition RFM95.cpp:361
float readTemperature()
Read calibrated temperature.
Definition RFM95.cpp:691
void setAutoAGC(bool enable)
Enable or disable automatic gain control.
Definition RFM95.cpp:289
static constexpr uint8_t REG_MODEM_CONFIG_2
Definition RFM95.hpp:76
static constexpr uint8_t IRQ_TX_TIMEOUT_MASK
Definition RFM95.hpp:113
static constexpr uint8_t IRQ_TX_DONE_MASK
Definition RFM95.hpp:109
int getTxPower()
Get current transmit power level.
Definition RFM95.cpp:139
static constexpr uint8_t REG_PA_CONFIG
Definition RFM95.hpp:62
uint8_t getLNA()
Get current LNA settings.
Definition RFM95.cpp:284
void setBandwidth(float bw_khz)
Set bandwidth in kHz (7.8, 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250, 500)
Definition RFM95.cpp:175
static constexpr uint8_t REG_LNA
Definition RFM95.hpp:65
static constexpr uint8_t DIO_RX_PIN
Definition RFM95.hpp:122
static constexpr uint8_t REG_PA_RAMP
Definition RFM95.hpp:63
bool getInvertIQ()
Check if IQ inversion is enabled.
Definition RFM95.cpp:248
static constexpr uint8_t REG_FIFO_TX_BASE_ADDR
Definition RFM95.hpp:67
void writeRegister(uint8_t address, uint8_t value)
Write a register value.
Definition RFM95.cpp:620
static constexpr uint8_t DIO_TX_PIN
Definition RFM95.hpp:121
bool getCADDetected()
Check if CAD detected flag is set.
Definition RFM95.cpp:351
void setContinuousReceive()
Set continuous receive mode.
Definition RFM95.cpp:522
void setFrequency(float freq_mhz)
Set frequency in MHz.
Definition RFM95.cpp:99
static constexpr uint8_t IRQ_CAD_DONE_MASK
Definition RFM95.hpp:106