RadioLib
Universal wireless communication library for Arduino
Loading...
Searching...
No Matches
Module.h
1#if !defined(_RADIOLIB_MODULE_H)
2#define _RADIOLIB_MODULE_H
3
4#include "TypeDef.h"
5#include "Hal.h"
6#include "utils/Utils.h"
7
8#if defined(RADIOLIB_BUILD_ARDUINO)
9 #include <SPI.h>
10#endif
11
12// Keep this SubGhz include here to fix Platformio LDO (#718).
13#if defined(STM32WLxx)
14 #include <SubGhz.h>
15#endif
16
21#define END_OF_MODE_TABLE { Module::MODE_END_OF_TABLE, {} }
22
28#define RFSWITCH_PIN_FLAG (0x01UL << 31)
29
36#define RADIOLIB_MODULE_SPI_COMMAND_READ (0)
37
39#define RADIOLIB_MODULE_SPI_COMMAND_WRITE (1)
40
42#define RADIOLIB_MODULE_SPI_COMMAND_NOP (2)
43
45#define RADIOLIB_MODULE_SPI_COMMAND_STATUS (3)
46
57#define RADIOLIB_MODULE_SPI_WIDTH_ADDR (0)
58
60#define RADIOLIB_MODULE_SPI_WIDTH_CMD (1)
61
63#define RADIOLIB_MODULE_SPI_WIDTH_STATUS (2)
64
74class Module {
75 public:
83 static const size_t RFSWITCH_MAX_PINS = 5;
84
92 uint8_t mode;
93
96 };
97
122
123 #if defined(RADIOLIB_BUILD_ARDUINO)
131 Module(uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio = RADIOLIB_NC);
132
142 Module(uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio, SPIClass& spi, SPISettings spiSettings = RADIOLIB_DEFAULT_SPI_SETTINGS);
143 #endif
144
153 Module(RadioLibHal *hal, uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio = RADIOLIB_NC);
154
159 Module(const Module& mod);
160
165 Module& operator=(const Module& mod);
166
167 // public member variables
170
172 typedef int16_t (*SPIparseStatusCb_t)(uint8_t in);
173
175 typedef int16_t (*SPIcheckStatusCb_t)(Module* mod);
176
177 enum BitWidth_t {
178 BITS_0 = 0,
179 BITS_8 = 8,
180 BITS_16 = 16,
181 BITS_24 = 24,
182 BITS_32 = 32,
183 };
184
189 struct SPIConfig_t {
191 bool stream;
192
194 int16_t err;
195
197 uint16_t cmds[4];
198
200 BitWidth_t widths[3];
201
203 uint8_t statusPos;
204
207
210
213 };
214
217 .stream = false,
219 .cmds = { 0x00, 0x80, 0x00, 0x00 },
220 .widths = { Module::BITS_8, Module::BITS_0, Module::BITS_8 },
221 .statusPos = 0,
222 .parseStatusCb = nullptr,
223 .checkStatusCb = nullptr,
224 .timeout = 1000,
225 };
226
227 #if RADIOLIB_INTERRUPT_TIMING
228
232 typedef void (*TimerSetupCb_t)(uint32_t len);
233
237 TimerSetupCb_t TimerSetupCb = nullptr;
238
242 volatile bool TimerFlag = false;
243
244 #endif
245
246 // basic methods
247
251 void init();
252
256 void term();
257
258 // SPI methods
259
267 int16_t SPIgetRegValue(uint32_t reg, uint8_t msb = 7, uint8_t lsb = 0);
268
280 int16_t SPIsetRegValue(uint32_t reg, uint8_t value, uint8_t msb = 7, uint8_t lsb = 0, uint8_t checkInterval = 2, uint8_t checkMask = 0xFF, bool force = false);
281
288 void SPIreadRegisterBurst(uint32_t reg, size_t numBytes, uint8_t* inBytes);
289
295 uint8_t SPIreadRegister(uint32_t reg);
296
303 void SPIwriteRegisterBurst(uint32_t reg, const uint8_t* data, size_t numBytes);
304
310 void SPIwriteRegister(uint32_t reg, uint8_t data);
311
320 void SPItransfer(uint16_t cmd, uint32_t reg, const uint8_t* dataOut, uint8_t* dataIn, size_t numBytes);
321
326 int16_t SPIcheckStream();
327
337 int16_t SPIreadStream(uint16_t cmd, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
338
349 int16_t SPIreadStream(const uint8_t* cmd, uint8_t cmdLen, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
350
360 int16_t SPIwriteStream(uint16_t cmd, const uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
361
372 int16_t SPIwriteStream(const uint8_t* cmd, uint8_t cmdLen, const uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
373
385 int16_t SPItransferStream(const uint8_t* cmd, uint8_t cmdLen, bool write, const uint8_t* dataOut, uint8_t* dataIn, size_t numBytes, bool waitForGpio);
386
387 // pin number access methods
388 // getCs is omitted on purpose, as it can interfere when accessing the SPI in a concurrent environment
389 // so it is considered to be part of the SPI pins and hence not accessible from outside
390 // see https://github.com/jgromes/RadioLib/discussions/1364
391
396 uint32_t getIrq() const { return(irqPin); }
397
402 uint32_t getRst() const { return(rstPin); }
403
408 uint32_t getGpio() const { return(gpioPin); }
409
426 void setRfSwitchPins(uint32_t rxEn, uint32_t txEn);
427
490 void setRfSwitchTable(const uint32_t (&pins)[RFSWITCH_MAX_PINS], const RfSwitchMode_t table[]);
491
499 const RfSwitchMode_t *findRfSwitchMode(uint8_t mode) const;
500
505 void setRfSwitchState(uint8_t mode);
506
515
516 #if RADIOLIB_DEBUG
523 void regdump(const char* level, uint16_t start, size_t len);
524 #endif
525
526#if !RADIOLIB_GODMODE
527 private:
528#endif
529 uint32_t csPin = RADIOLIB_NC;
530 uint32_t irqPin = RADIOLIB_NC;
531 uint32_t rstPin = RADIOLIB_NC;
532 uint32_t gpioPin = RADIOLIB_NC;
533
534 // RF switch pins and table
535 uint32_t rfSwitchPins[RFSWITCH_MAX_PINS] = { RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC };
536 const RfSwitchMode_t *rfSwitchTable = nullptr;
537
538 #if RADIOLIB_INTERRUPT_TIMING
539 uint32_t prevTimingLen = 0;
540 #endif
541};
542
543#endif
Implements all common low-level methods to control the wireless module. Every module class contains o...
Definition Module.h:74
static const size_t RFSWITCH_MAX_PINS
The maximum number of pins supported by the RF switch code. Note: It is not recommended to use this c...
Definition Module.h:83
void SPIwriteRegisterBurst(uint32_t reg, const uint8_t *data, size_t numBytes)
SPI burst write method.
Definition Module.cpp:157
int16_t(* SPIcheckStatusCb_t)(Module *mod)
Callback for validation SPI status.
Definition Module.h:175
int16_t SPItransferStream(const uint8_t *cmd, uint8_t cmdLen, bool write, const uint8_t *dataOut, uint8_t *dataIn, size_t numBytes, bool waitForGpio)
SPI single transfer method for modules with stream-type SPI interface (SX126x, SX128x etc....
Definition Module.cpp:330
void SPItransfer(uint16_t cmd, uint32_t reg, const uint8_t *dataOut, uint8_t *dataIn, size_t numBytes)
SPI single transfer method.
Definition Module.cpp:189
int16_t SPIgetRegValue(uint32_t reg, uint8_t msb=7, uint8_t lsb=0)
SPI read method that automatically masks unused bits. This method is the preferred SPI read mechanism...
Definition Module.cpp:61
SPIConfig_t spiConfig
SPI configuration structure. The default configuration corresponds to register-access modules,...
Definition Module.h:216
RadioLibHal * hal
Hardware abstraction layer to be used.
Definition Module.h:169
void term()
Terminate low-level module control.
Definition Module.cpp:56
int16_t SPIwriteStream(uint16_t cmd, const uint8_t *data, size_t numBytes, bool waitForGpio=true, bool verify=true)
Method to perform a write transaction with SPI stream.
Definition Module.cpp:279
Module & operator=(const Module &mod)
Overload for assignment operator.
Definition Module.cpp:27
uint32_t getGpio() const
Access method to get the pin number of second interrupt/GPIO.
Definition Module.h:408
const RfSwitchMode_t * findRfSwitchMode(uint8_t mode) const
Find a mode in the RfSwitchTable.
Definition Module.cpp:527
OpMode_t
Constants to use in a mode table set be setRfSwitchTable. These constants work for most radios,...
Definition Module.h:106
@ MODE_TX
Transmission mode.
Definition Module.h:120
@ MODE_IDLE
Idle mode.
Definition Module.h:114
@ MODE_RX
Receive mode.
Definition Module.h:117
@ MODE_END_OF_TABLE
End of table marker, use END_OF_MODE_TABLE constant instead. Value is zero to ensure zero-initialized...
Definition Module.h:111
int16_t SPIcheckStream()
Method to check the result of last SPI stream transfer.
Definition Module.cpp:307
void SPIwriteRegister(uint32_t reg, uint8_t data)
SPI basic write method. Use of this method is reserved for special cases, SPIsetRegValue should be us...
Definition Module.cpp:173
void setRfSwitchPins(uint32_t rxEn, uint32_t txEn)
Some modules contain external RF switch controlled by pins. This function gives RadioLib control over...
Definition Module.cpp:503
void waitForMicroseconds(RadioLibTime_t start, RadioLibTime_t len)
Wait for time to elapse, either using the microsecond timer, or the TimerFlag. Note that in interrupt...
Definition Module.cpp:470
int16_t(* SPIparseStatusCb_t)(uint8_t in)
Callback for parsing SPI status.
Definition Module.h:172
uint8_t SPIreadRegister(uint32_t reg)
SPI basic read method. Use of this method is reserved for special cases, SPIgetRegValue should be use...
Definition Module.cpp:139
uint32_t getIrq() const
Access method to get the pin number of interrupt/GPIO.
Definition Module.h:396
void setRfSwitchTable(const uint32_t(&pins)[RFSWITCH_MAX_PINS], const RfSwitchMode_t table[])
Some modules contain external RF switch controlled by pins. This function gives RadioLib control over...
Definition Module.cpp:519
void SPIreadRegisterBurst(uint32_t reg, size_t numBytes, uint8_t *inBytes)
SPI burst read method.
Definition Module.cpp:123
void init()
Initialize low-level module control.
Definition Module.cpp:48
uint32_t getRst() const
Access method to get the pin number of hardware reset pin.
Definition Module.h:402
int16_t SPIreadStream(uint16_t cmd, uint8_t *data, size_t numBytes, bool waitForGpio=true, bool verify=true)
Method to perform a read transaction with SPI stream.
Definition Module.cpp:251
int16_t SPIsetRegValue(uint32_t reg, uint8_t value, uint8_t msb=7, uint8_t lsb=0, uint8_t checkInterval=2, uint8_t checkMask=0xFF, bool force=false)
Overwrite-safe SPI write method with verification. This method is the preferred SPI write mechanism.
Definition Module.cpp:71
void setRfSwitchState(uint8_t mode)
Set RF switch state.
Definition Module.cpp:538
Hardware abstraction library base interface.
Definition Hal.h:18
#define RADIOLIB_ERR_UNKNOWN
There was an unexpected, unknown error. If you see this, something went incredibly wrong....
Definition TypeDef.h:115
unsigned long RadioLibTime_t
Type used for durations in RadioLib.
Definition TypeDef.h:679
Description of RF switch pin states for a single mode. See setRfSwitchTable for details.
Definition Module.h:90
uint8_t mode
RF switching mode, one of OpMode_t or a custom radio-defined value.
Definition Module.h:92
uint32_t values[RFSWITCH_MAX_PINS]
Output pin values.
Definition Module.h:95
SPI configuration structure.
Definition Module.h:189
bool stream
Whether the SPI module is stream-type (SX126x/8x) or registrer access type (SX127x,...
Definition Module.h:191
RadioLibTime_t timeout
Timeout in ms when waiting for GPIO signals.
Definition Module.h:212
uint16_t cmds[4]
SPI commands.
Definition Module.h:197
uint8_t statusPos
Byte position of status command in SPI stream.
Definition Module.h:203
BitWidth_t widths[3]
Bit widths of SPI addresses, commands and status bytes.
Definition Module.h:200
SPIparseStatusCb_t parseStatusCb
Callback for parsing SPI status.
Definition Module.h:206
SPIcheckStatusCb_t checkStatusCb
Callback for validation SPI status.
Definition Module.h:209
int16_t err
Last recorded SPI error - only updated for modules that return status during SPI transfers.
Definition Module.h:194