From 5d764fc09b2e02dfa27dedb092adf7499a36bdca Mon Sep 17 00:00:00 2001 From: David Gauchard Date: Thu, 4 Apr 2019 11:47:04 +0200 Subject: [PATCH 1/2] Hardware SPI BREAKING: unswap mode 2 and 3 for portability use SPI.restoreEsp8266LegacyMode2And3() for former behaviour --- libraries/SPI/SPI.cpp | 8 ++++++++ libraries/SPI/SPI.h | 2 ++ 2 files changed, 10 insertions(+) diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp index f67c6d69fc..329278a759 100644 --- a/libraries/SPI/SPI.cpp +++ b/libraries/SPI/SPI.cpp @@ -42,6 +42,7 @@ typedef union { SPIClass::SPIClass() { useHwCs = false; pinSet = SPI_PINS_HSPI; + legacyMode2and3 = false; } bool SPIClass::pins(int8_t sck, int8_t miso, int8_t mosi, int8_t ss) @@ -161,6 +162,13 @@ void SPIClass::setDataMode(uint8_t dataMode) { bool CPOL = (dataMode & 0x10); ///< CPOL (Clock Polarity) bool CPHA = (dataMode & 0x01); ///< CPHA (Clock Phase) + if(!legacyMode2and3) { + // https://github.com/esp8266/Arduino/issues/2416 + // https://github.com/esp8266/Arduino/pull/2418 + if(CPOL) // Ensure same behavior as + CPHA ^= 1; // SAM, AVR and Intel Boards + } + if(CPHA) { SPI1U |= (SPIUSME); } else { diff --git a/libraries/SPI/SPI.h b/libraries/SPI/SPI.h index e8fb8a3902..fd8e7871a8 100644 --- a/libraries/SPI/SPI.h +++ b/libraries/SPI/SPI.h @@ -58,6 +58,7 @@ class SPIClass { void end(); void setHwCs(bool use); void setBitOrder(uint8_t bitOrder); + void restoreEsp8266LegacyMode2And3(); // must be called *before* setDataMode() void setDataMode(uint8_t dataMode); void setFrequency(uint32_t freq); void setClockDivider(uint32_t clockDiv); @@ -77,6 +78,7 @@ class SPIClass { private: bool useHwCs; uint8_t pinSet; + bool legacyMode2and3; void writeBytes_(const uint8_t * data, uint8_t size); void transferBytes_(const uint8_t * out, uint8_t * in, uint8_t size); void transferBytesAligned_(const uint8_t * out, uint8_t * in, uint8_t size); From df8e6df7610faf949fee3a7eb105307d78c0cbbb Mon Sep 17 00:00:00 2001 From: david gauchard Date: Fri, 5 Apr 2019 23:46:01 +0200 Subject: [PATCH 2/2] remove restoreEsp8266LegacyMode2And3() --- libraries/SPI/SPI.cpp | 11 ++++------- libraries/SPI/SPI.h | 2 -- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp index 329278a759..09336266c4 100644 --- a/libraries/SPI/SPI.cpp +++ b/libraries/SPI/SPI.cpp @@ -42,7 +42,6 @@ typedef union { SPIClass::SPIClass() { useHwCs = false; pinSet = SPI_PINS_HSPI; - legacyMode2and3 = false; } bool SPIClass::pins(int8_t sck, int8_t miso, int8_t mosi, int8_t ss) @@ -162,12 +161,10 @@ void SPIClass::setDataMode(uint8_t dataMode) { bool CPOL = (dataMode & 0x10); ///< CPOL (Clock Polarity) bool CPHA = (dataMode & 0x01); ///< CPHA (Clock Phase) - if(!legacyMode2and3) { - // https://github.com/esp8266/Arduino/issues/2416 - // https://github.com/esp8266/Arduino/pull/2418 - if(CPOL) // Ensure same behavior as - CPHA ^= 1; // SAM, AVR and Intel Boards - } + // https://github.com/esp8266/Arduino/issues/2416 + // https://github.com/esp8266/Arduino/pull/2418 + if(CPOL) // Ensure same behavior as + CPHA ^= 1; // SAM, AVR and Intel Boards if(CPHA) { SPI1U |= (SPIUSME); diff --git a/libraries/SPI/SPI.h b/libraries/SPI/SPI.h index fd8e7871a8..e8fb8a3902 100644 --- a/libraries/SPI/SPI.h +++ b/libraries/SPI/SPI.h @@ -58,7 +58,6 @@ class SPIClass { void end(); void setHwCs(bool use); void setBitOrder(uint8_t bitOrder); - void restoreEsp8266LegacyMode2And3(); // must be called *before* setDataMode() void setDataMode(uint8_t dataMode); void setFrequency(uint32_t freq); void setClockDivider(uint32_t clockDiv); @@ -78,7 +77,6 @@ class SPIClass { private: bool useHwCs; uint8_t pinSet; - bool legacyMode2and3; void writeBytes_(const uint8_t * data, uint8_t size); void transferBytes_(const uint8_t * out, uint8_t * in, uint8_t size); void transferBytesAligned_(const uint8_t * out, uint8_t * in, uint8_t size);