From 5846c9d9d9415af21a0de99ee4a79ed8ffc6885a Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 2 Mar 2020 13:25:35 +0100 Subject: [PATCH] [Module] Only initializing default SPI interface (#121) --- src/Module.cpp | 39 ++++++++++++++++++++++++++++++++++++--- src/Module.h | 43 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/Module.cpp b/src/Module.cpp index bce8abd4..409e012e 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -1,11 +1,34 @@ #include "Module.h" +Module::Module(int16_t cs, int16_t irq, int16_t rst) { + _cs = cs; + _rx = NC; + _tx = NC; + _irq = irq; + _rst = rst; + _spi = &SPI; + _spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0); + _initInterface = true; +} + +Module::Module(int16_t cs, int16_t irq, int16_t rst, int16_t gpio) { + _cs = cs; + _rx = gpio; + _tx = NC; + _irq = irq; + _rst = rst; + _spi = &SPI; + _spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0); + _initInterface = true; +} + Module::Module(int16_t rx, int16_t tx, HardwareSerial* useSer, int16_t rst) { _cs = NC; _rx = rx; _tx = tx; _irq = NC; _rst = rst; + _initInterface = true; #ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED ModuleSerial = useSer; @@ -23,6 +46,7 @@ Module::Module(int16_t cs, int16_t irq, int16_t rst, SPIClass& spi, SPISettings _rst = rst; _spi = &spi; _spiSettings = spiSettings; + _initInterface = false; } Module::Module(int16_t cs, int16_t irq, int16_t rst, int16_t gpio, SPIClass& spi, SPISettings spiSettings) { @@ -33,6 +57,7 @@ Module::Module(int16_t cs, int16_t irq, int16_t rst, int16_t gpio, SPIClass& spi _rst = rst; _spi = &spi; _spiSettings = spiSettings; + _initInterface = false; } Module::Module(int16_t cs, int16_t irq, int16_t rst, int16_t rx, int16_t tx, SPIClass& spi, SPISettings spiSettings, HardwareSerial* useSer) { @@ -43,6 +68,7 @@ Module::Module(int16_t cs, int16_t irq, int16_t rst, int16_t rx, int16_t tx, SPI _rst = rst; _spi = &spi; _spiSettings = spiSettings; + _initInterface = false; #ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED ModuleSerial = useSer; @@ -58,14 +84,18 @@ void Module::init(uint8_t interface) { case RADIOLIB_USE_SPI: Module::pinMode(_cs, OUTPUT); Module::digitalWrite(_cs, HIGH); - _spi->begin(); + if(_initInterface) { + _spi->begin(); + } break; case RADIOLIB_USE_UART: + if(_initInterface) { #if defined(ESP32) - ModuleSerial->begin(baudrate, SERIAL_8N1, _rx, _tx); + ModuleSerial->begin(baudrate, SERIAL_8N1, _rx, _tx); #else - ModuleSerial->begin(baudrate); + ModuleSerial->begin(baudrate); #endif + } break; case RADIOLIB_USE_I2C: break; @@ -211,6 +241,7 @@ void Module::SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* da // send SPI register address with access command _spi->transfer(reg | cmd); + delayMicroseconds(120); #ifdef RADIOLIB_VERBOSE if(cmd == SPIwriteCommand) { RADIOLIB_VERBOSE_PRINT('W'); @@ -226,12 +257,14 @@ void Module::SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* da if(cmd == SPIwriteCommand) { for(size_t n = 0; n < numBytes; n++) { _spi->transfer(dataOut[n]); + delayMicroseconds(120); RADIOLIB_VERBOSE_PRINT(dataOut[n], HEX); RADIOLIB_VERBOSE_PRINT('\t'); } } else if (cmd == SPIreadCommand) { for(size_t n = 0; n < numBytes; n++) { dataIn[n] = _spi->transfer(0x00); + delayMicroseconds(120); RADIOLIB_VERBOSE_PRINT(dataIn[n], HEX); RADIOLIB_VERBOSE_PRINT('\t'); } diff --git a/src/Module.h b/src/Module.h index cb688435..ddc43c51 100644 --- a/src/Module.h +++ b/src/Module.h @@ -27,14 +27,38 @@ class Module { \param serial HardwareSerial to be used on platforms that do not support SoftwareSerial. Defaults to Serial1. - \param rst Arduino pin to be used as hardware reset for the module. Defaults to -1 (unused). + \param rst Arduino pin to be used as hardware reset for the module. Defaults to NC (unused). */ #ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED - Module(int16_t tx, int16_t rx, HardwareSerial* serial = &Serial1, int16_t rst = -1); + Module(int16_t tx, int16_t rx, HardwareSerial* serial = &Serial1, int16_t rst = NC); #else - Module(int16_t tx, int16_t rx, HardwareSerial* serial = nullptr, int16_t rst = -1); + Module(int16_t tx, int16_t rx, HardwareSerial* serial = nullptr, int16_t rst = NC); #endif + /*! + \brief SPI-based module constructor. Will use the default SPI interface automatically initialize it. + + \param cs Arduino pin to be used as chip select. + + \param irq Arduino pin to be used as interrupt/GPIO. + + \param rst Arduino pin to be used as hardware reset for the module. + */ + Module(int16_t cs, int16_t irq, int16_t rst); + + /*! + \brief Extended SPI-based module constructor. Will use the default SPI interface automatically initialize it. + + \param cs Arduino pin to be used as chip select. + + \param irq Arduino pin to be used as interrupt/GPIO. + + \param rst Arduino pin to be used as hardware reset for the module. + + \param gpio Arduino pin to be used as additional interrupt/GPIO. + */ + Module(int16_t cs, int16_t irq, int16_t rst, int16_t gpio); + /*! \brief SPI-based module constructor. @@ -44,11 +68,11 @@ class Module { \param rst Arduino pin to be used as hardware reset for the module. - \param spi SPI interface to be used. Defaults to Arduino hardware SPI interface, can also use software SPI implementations. + \param spi SPI interface to be used, can also use software SPI implementations. - \param spiSettings SPI interface settings. Defaults to 2 MHz clock, MSB first, mode 0. + \param spiSettings SPI interface settings. */ - Module(int16_t cs, int16_t irq, int16_t rst, SPIClass& spi = SPI, SPISettings spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0)); + Module(int16_t cs, int16_t irq, int16_t rst, SPIClass& spi, SPISettings spiSettings); /*! \brief Extended SPI-based module constructor. @@ -61,11 +85,11 @@ class Module { \param gpio Arduino pin to be used as additional interrupt/GPIO. - \param spi SPI interface to be used. Defaults to Arduino hardware SPI interface, can also use software SPI implementations. + \param spi SPI interface to be used, can also use software SPI implementations. - \param spiSettings SPI interface settings. Defaults to 2 MHz clock, MSB first, mode 0. + \param spiSettings SPI interface settings. */ - Module(int16_t cs, int16_t irq, int16_t rst, int16_t gpio, SPIClass& spi = SPI, SPISettings spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0)); + Module(int16_t cs, int16_t irq, int16_t rst, int16_t gpio, SPIClass& spi, SPISettings spiSettings); /*! \brief Generic module constructor. @@ -344,6 +368,7 @@ class Module { int16_t _irq; int16_t _rst; + bool _initInterface; SPIClass* _spi; SPISettings _spiSettings;