Skip to content

Commit 3736ebf

Browse files
committed
refactor for better sw spi only support
1 parent e89ae64 commit 3736ebf

File tree

2 files changed

+45
-15
lines changed

2 files changed

+45
-15
lines changed

Adafruit_SPIDevice.cpp

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
#include "Adafruit_SPIDevice.h"
22

3-
#if !defined(SPI_INTERFACES_COUNT) || \
4-
(defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0))
5-
63
//#define DEBUG_SERIAL Serial
74

85
/*!
@@ -17,6 +14,7 @@
1714
Adafruit_SPIDevice::Adafruit_SPIDevice(int8_t cspin, uint32_t freq,
1815
BusIOBitOrder dataOrder,
1916
uint8_t dataMode, SPIClass *theSPI) {
17+
#ifdef BUSIO_HAS_HW_SPI
2018
_cs = cspin;
2119
_sck = _mosi = _miso = -1;
2220
_spi = theSPI;
@@ -25,6 +23,14 @@ Adafruit_SPIDevice::Adafruit_SPIDevice(int8_t cspin, uint32_t freq,
2523
_freq = freq;
2624
_dataOrder = dataOrder;
2725
_dataMode = dataMode;
26+
#else
27+
// unused, but needed to suppress compiler warns
28+
(void)cspin;
29+
(void)freq;
30+
(void)dataOrder;
31+
(void)dataMode;
32+
(void)theSPI;
33+
#endif
2834
}
2935

3036
/*!
@@ -68,14 +74,15 @@ Adafruit_SPIDevice::Adafruit_SPIDevice(int8_t cspin, int8_t sckpin,
6874
_dataOrder = dataOrder;
6975
_dataMode = dataMode;
7076
_begun = false;
71-
_spiSetting = new SPISettings(freq, dataOrder, dataMode);
72-
_spi = nullptr;
7377
}
7478

7579
/*!
7680
* @brief Release memory allocated in constructors
7781
*/
78-
Adafruit_SPIDevice::~Adafruit_SPIDevice() { delete _spiSetting; }
82+
Adafruit_SPIDevice::~Adafruit_SPIDevice() {
83+
if (_spiSetting)
84+
delete _spiSetting;
85+
}
7986

8087
/*!
8188
* @brief Initializes SPI bus and sets CS pin high
@@ -89,7 +96,9 @@ bool Adafruit_SPIDevice::begin(void) {
8996
}
9097

9198
if (_spi) { // hardware SPI
99+
#ifdef BUSIO_HAS_HW_SPI
92100
_spi->begin();
101+
#endif
93102
} else {
94103
pinMode(_sck, OUTPUT);
95104

@@ -120,9 +129,11 @@ bool Adafruit_SPIDevice::begin(void) {
120129
* @param len The number of bytes to transfer
121130
*/
122131
void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) {
132+
//
133+
// HARDWARE SPI
134+
//
123135
if (_spi) {
124-
// hardware SPI is easy
125-
136+
#ifdef BUSIO_HAS_HW_SPI
126137
#if defined(SPARK)
127138
_spi->transfer(buffer, buffer, len, nullptr);
128139
#elif defined(STM32)
@@ -133,8 +144,12 @@ void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) {
133144
_spi->transfer(buffer, len);
134145
#endif
135146
return;
147+
#endif
136148
}
137149

150+
//
151+
// SOFTWARE SPI
152+
//
138153
uint8_t startbit;
139154
if (_dataOrder == SPI_BITORDER_LSBFIRST) {
140155
startbit = 0x1;
@@ -145,9 +160,7 @@ void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) {
145160
bool towrite, lastmosi = !(buffer[0] & startbit);
146161
uint8_t bitdelay_us = (1000000 / _freq) / 2;
147162

148-
// for softSPI we'll do it by hand
149163
for (size_t i = 0; i < len; i++) {
150-
// software SPI
151164
uint8_t reply = 0;
152165
uint8_t send = buffer[i];
153166

@@ -269,7 +282,9 @@ uint8_t Adafruit_SPIDevice::transfer(uint8_t send) {
269282
*/
270283
void Adafruit_SPIDevice::beginTransaction(void) {
271284
if (_spi) {
285+
#ifdef BUSIO_HAS_HW_SPI
272286
_spi->beginTransaction(*_spiSetting);
287+
#endif
273288
}
274289
}
275290

@@ -278,7 +293,9 @@ void Adafruit_SPIDevice::beginTransaction(void) {
278293
*/
279294
void Adafruit_SPIDevice::endTransaction(void) {
280295
if (_spi) {
296+
#ifdef BUSIO_HAS_HW_SPI
281297
_spi->endTransaction();
298+
#endif
282299
}
283300
}
284301

@@ -489,5 +506,3 @@ bool Adafruit_SPIDevice::write_and_read(uint8_t *buffer, size_t len) {
489506

490507
return true;
491508
}
492-
493-
#endif // SPI exists

Adafruit_SPIDevice.h

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,14 @@
55

66
#if !defined(SPI_INTERFACES_COUNT) || \
77
(defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0))
8-
8+
// HW SPI available
99
#include <SPI.h>
10+
#define BUSIO_HAS_HW_SPI
11+
#else
12+
// SW SPI ONLY
13+
enum { SPI_MODE0, SPI_MODE1, SPI_MODE2, _SPI_MODE4 };
14+
typedef uint8_t SPIClass;
15+
#endif
1016

1117
// some modern SPI definitions don't have BitOrder enum
1218
#if (defined(__AVR__) && !defined(ARDUINO_ARCH_MEGAAVR)) || \
@@ -77,10 +83,15 @@ typedef uint32_t BusIO_PortMask;
7783
/**! The class which defines how we will talk to this device over SPI **/
7884
class Adafruit_SPIDevice {
7985
public:
86+
#ifdef BUSIO_HAS_HW_SPI
8087
Adafruit_SPIDevice(int8_t cspin, uint32_t freq = 1000000,
8188
BusIOBitOrder dataOrder = SPI_BITORDER_MSBFIRST,
8289
uint8_t dataMode = SPI_MODE0, SPIClass *theSPI = &SPI);
83-
90+
#else
91+
Adafruit_SPIDevice(int8_t cspin, uint32_t freq = 1000000,
92+
BusIOBitOrder dataOrder = SPI_BITORDER_MSBFIRST,
93+
uint8_t dataMode = SPI_MODE0, SPIClass *theSPI = nullptr);
94+
#endif
8495
Adafruit_SPIDevice(int8_t cspin, int8_t sck, int8_t miso, int8_t mosi,
8596
uint32_t freq = 1000000,
8697
BusIOBitOrder dataOrder = SPI_BITORDER_MSBFIRST,
@@ -104,8 +115,13 @@ class Adafruit_SPIDevice {
104115
void endTransactionWithDeassertingCS();
105116

106117
private:
118+
#ifdef BUSIO_HAS_HW_SPI
107119
SPIClass *_spi;
108120
SPISettings *_spiSetting;
121+
#else
122+
uint8_t *_spi = nullptr;
123+
uint8_t *_spiSetting = nullptr;
124+
#endif
109125
uint32_t _freq;
110126
BusIOBitOrder _dataOrder;
111127
uint8_t _dataMode;
@@ -119,5 +135,4 @@ class Adafruit_SPIDevice {
119135
bool _begun;
120136
};
121137

122-
#endif // has SPI defined
123138
#endif // Adafruit_SPIDevice_h

0 commit comments

Comments
 (0)