diff --git a/api/HardwareSPI.h b/api/HardwareSPI.h index 7f6aea2b..c3a5519b 100644 --- a/api/HardwareSPI.h +++ b/api/HardwareSPI.h @@ -34,33 +34,39 @@ typedef enum { SPI_MODE3 = 3, } SPIMode; +typedef enum { + SPI_CONTROLLER = 0, + SPI_PERIPHERAL = 1, +} SPIBusMode; + class SPISettings { public: - SPISettings(uint32_t clock, BitOrder bitOrder, SPIMode dataMode) { + SPISettings(uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode = SPI_CONTROLLER) { if (__builtin_constant_p(clock)) { - init_AlwaysInline(clock, bitOrder, dataMode); + init_AlwaysInline(clock, bitOrder, dataMode, busMode); } else { - init_MightInline(clock, bitOrder, dataMode); + init_MightInline(clock, bitOrder, dataMode, busMode); } } - SPISettings(uint32_t clock, BitOrder bitOrder, int dataMode) { + SPISettings(uint32_t clock, BitOrder bitOrder, int dataMode, SPIBusMode busMode = SPI_CONTROLLER) { if (__builtin_constant_p(clock)) { - init_AlwaysInline(clock, bitOrder, (SPIMode)dataMode); + init_AlwaysInline(clock, bitOrder, (SPIMode)dataMode, busMode); } else { - init_MightInline(clock, bitOrder, (SPIMode)dataMode); + init_MightInline(clock, bitOrder, (SPIMode)dataMode, busMode); } } // Default speed set to 4MHz, SPI mode set to MODE 0 and Bit order set to MSB first. - SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); } + SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, SPI_CONTROLLER); } bool operator==(const SPISettings& rhs) const { if ((this->clockFreq == rhs.clockFreq) && (this->bitOrder == rhs.bitOrder) && - (this->dataMode == rhs.dataMode)) { + (this->dataMode == rhs.dataMode) && + (this->busMode == rhs.busMode)) { return true; } return false; @@ -80,22 +86,27 @@ class SPISettings { BitOrder getBitOrder() const { return (bitOrder); } + SPIBusMode getBusMode() const { + return busMode; + } private: - void init_MightInline(uint32_t clock, BitOrder bitOrder, SPIMode dataMode) { - init_AlwaysInline(clock, bitOrder, dataMode); + void init_MightInline(uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode) { + init_AlwaysInline(clock, bitOrder, dataMode, busMode); } // Core developer MUST use an helper function in beginTransaction() to use this data - void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, SPIMode dataMode) __attribute__((__always_inline__)) { + void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode) __attribute__((__always_inline__)) { this->clockFreq = clock; this->dataMode = dataMode; this->bitOrder = bitOrder; + this->busMode = busMode; } uint32_t clockFreq; SPIMode dataMode; BitOrder bitOrder; + SPIBusMode busMode; friend class HardwareSPI; };