From aa29b351d19d99b30ec82f318c2e1c3f102e044d Mon Sep 17 00:00:00 2001 From: ladyada Date: Thu, 11 Sep 2025 12:04:40 -0400 Subject: [PATCH 1/3] clean up ifdefs --- Adafruit_SPIDevice.cpp | 73 ++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 46 deletions(-) diff --git a/Adafruit_SPIDevice.cpp b/Adafruit_SPIDevice.cpp index dc3672b..f92956f 100644 --- a/Adafruit_SPIDevice.cpp +++ b/Adafruit_SPIDevice.cpp @@ -2,6 +2,24 @@ // #define DEBUG_SERIAL Serial + +#ifdef BUSIO_USE_FAST_PINIO +#define BUSIO_SET_CLOCK_LOW() (*clkPort = *clkPort & ~clkPinMask) +#define BUSIO_SET_CLOCK_HIGH() (*clkPort = *clkPort | clkPinMask) +#define BUSIO_READ_MISO() (*misoPort & misoPinMask) +#define BUSIO_WRITE_MOSI(value) do { \ + if (value) \ + *mosiPort = *mosiPort | mosiPinMask; \ + else \ + *mosiPort = *mosiPort & ~mosiPinMask; \ +} while(0) +#else +#define BUSIO_SET_CLOCK_LOW() digitalWrite(_sck, LOW) +#define BUSIO_SET_CLOCK_HIGH() digitalWrite(_sck, HIGH) +#define BUSIO_READ_MISO() digitalRead(_miso) +#define BUSIO_WRITE_MOSI(value) digitalWrite(_mosi, value) +#endif + /*! * @brief Create an SPI device with the given CS pin and settings * @param cspin The arduino pin number to use for chip select @@ -181,77 +199,40 @@ void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) { if (_dataMode == SPI_MODE0 || _dataMode == SPI_MODE2) { towrite = send & b; if ((_mosi != -1) && (lastmosi != towrite)) { -#ifdef BUSIO_USE_FAST_PINIO - if (towrite) - *mosiPort = *mosiPort | mosiPinMask; - else - *mosiPort = *mosiPort & ~mosiPinMask; -#else - digitalWrite(_mosi, towrite); -#endif + BUSIO_WRITE_MOSI(towrite); lastmosi = towrite; } -#ifdef BUSIO_USE_FAST_PINIO - *clkPort = *clkPort | clkPinMask; // Clock high -#else - digitalWrite(_sck, HIGH); -#endif + BUSIO_SET_CLOCK_HIGH(); if (bitdelay_us) { delayMicroseconds(bitdelay_us); } if (_miso != -1) { -#ifdef BUSIO_USE_FAST_PINIO - if (*misoPort & misoPinMask) { -#else - if (digitalRead(_miso)) { -#endif + if (BUSIO_READ_MISO()) reply |= b; } } -#ifdef BUSIO_USE_FAST_PINIO - *clkPort = *clkPort & ~clkPinMask; // Clock low -#else - digitalWrite(_sck, LOW); -#endif + BUSIO_SET_CLOCK_LOW(); + } else { // if (_dataMode == SPI_MODE1 || _dataMode == SPI_MODE3) -#ifdef BUSIO_USE_FAST_PINIO - *clkPort = *clkPort | clkPinMask; // Clock high -#else - digitalWrite(_sck, HIGH); -#endif + BUSIO_SET_CLOCK_HIGH(); if (bitdelay_us) { delayMicroseconds(bitdelay_us); } if (_mosi != -1) { -#ifdef BUSIO_USE_FAST_PINIO - if (send & b) - *mosiPort = *mosiPort | mosiPinMask; - else - *mosiPort = *mosiPort & ~mosiPinMask; -#else - digitalWrite(_mosi, send & b); -#endif + BUSIO_WRITE_MOSI(send & b); } -#ifdef BUSIO_USE_FAST_PINIO - *clkPort = *clkPort & ~clkPinMask; // Clock low -#else - digitalWrite(_sck, LOW); -#endif + BUSIO_SET_CLOCK_LOW(); if (_miso != -1) { -#ifdef BUSIO_USE_FAST_PINIO - if (*misoPort & misoPinMask) { -#else - if (digitalRead(_miso)) { -#endif + if (BUSIO_READ_MISO()) { reply |= b; } } From fb9022189249a0ce2e822584c5d70441ccd6b52a Mon Sep 17 00:00:00 2001 From: ladyada Date: Thu, 11 Sep 2025 12:20:44 -0400 Subject: [PATCH 2/3] fix mode 3 --- Adafruit_SPIDevice.cpp | 57 +++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/Adafruit_SPIDevice.cpp b/Adafruit_SPIDevice.cpp index f92956f..75b521d 100644 --- a/Adafruit_SPIDevice.cpp +++ b/Adafruit_SPIDevice.cpp @@ -195,51 +195,74 @@ void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) { if (bitdelay_us) { delayMicroseconds(bitdelay_us); } - + if (_dataMode == SPI_MODE0 || _dataMode == SPI_MODE2) { towrite = send & b; if ((_mosi != -1) && (lastmosi != towrite)) { BUSIO_WRITE_MOSI(towrite); lastmosi = towrite; } - + BUSIO_SET_CLOCK_HIGH(); - + if (bitdelay_us) { delayMicroseconds(bitdelay_us); } - + if (_miso != -1) { if (BUSIO_READ_MISO()) reply |= b; - } } - + BUSIO_SET_CLOCK_LOW(); - - } else { // if (_dataMode == SPI_MODE1 || _dataMode == SPI_MODE3) - - BUSIO_SET_CLOCK_HIGH(); - + + } else if (_dataMode == SPI_MODE3) { + + if (_mosi != -1) { // transmit on falling edge + BUSIO_WRITE_MOSI(send & b); + } + + BUSIO_SET_CLOCK_LOW(); + if (bitdelay_us) { delayMicroseconds(bitdelay_us); } - + + BUSIO_SET_CLOCK_HIGH(); + + if (bitdelay_us) { + delayMicroseconds(bitdelay_us); + } + + if (_miso != -1) { // read on rising edge + if (BUSIO_READ_MISO()) { + reply |= b; + } + } + + } else { // || _dataMode == SPI_MODE1) + + BUSIO_SET_CLOCK_HIGH(); + + if (bitdelay_us) { + delayMicroseconds(bitdelay_us); + } + if (_mosi != -1) { BUSIO_WRITE_MOSI(send & b); } - + BUSIO_SET_CLOCK_LOW(); - + if (_miso != -1) { if (BUSIO_READ_MISO()) { reply |= b; } } } - if (_miso != -1) { - buffer[i] = reply; - } + } + if (_miso != -1) { + buffer[i] = reply; } } return; From bd4135b50c40f12a037c9d3930ec7e2ca3be936c Mon Sep 17 00:00:00 2001 From: ladyada Date: Thu, 11 Sep 2025 12:21:47 -0400 Subject: [PATCH 3/3] clang --- Adafruit_SPIDevice.cpp | 56 +++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/Adafruit_SPIDevice.cpp b/Adafruit_SPIDevice.cpp index 75b521d..3283de6 100644 --- a/Adafruit_SPIDevice.cpp +++ b/Adafruit_SPIDevice.cpp @@ -2,17 +2,17 @@ // #define DEBUG_SERIAL Serial - #ifdef BUSIO_USE_FAST_PINIO #define BUSIO_SET_CLOCK_LOW() (*clkPort = *clkPort & ~clkPinMask) #define BUSIO_SET_CLOCK_HIGH() (*clkPort = *clkPort | clkPinMask) #define BUSIO_READ_MISO() (*misoPort & misoPinMask) -#define BUSIO_WRITE_MOSI(value) do { \ - if (value) \ - *mosiPort = *mosiPort | mosiPinMask; \ - else \ - *mosiPort = *mosiPort & ~mosiPinMask; \ -} while(0) +#define BUSIO_WRITE_MOSI(value) \ + do { \ + if (value) \ + *mosiPort = *mosiPort | mosiPinMask; \ + else \ + *mosiPort = *mosiPort & ~mosiPinMask; \ + } while (0) #else #define BUSIO_SET_CLOCK_LOW() digitalWrite(_sck, LOW) #define BUSIO_SET_CLOCK_HIGH() digitalWrite(_sck, HIGH) @@ -195,65 +195,65 @@ void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) { if (bitdelay_us) { delayMicroseconds(bitdelay_us); } - + if (_dataMode == SPI_MODE0 || _dataMode == SPI_MODE2) { towrite = send & b; if ((_mosi != -1) && (lastmosi != towrite)) { BUSIO_WRITE_MOSI(towrite); lastmosi = towrite; } - + BUSIO_SET_CLOCK_HIGH(); - + if (bitdelay_us) { delayMicroseconds(bitdelay_us); } - + if (_miso != -1) { if (BUSIO_READ_MISO()) reply |= b; } - + BUSIO_SET_CLOCK_LOW(); - + } else if (_dataMode == SPI_MODE3) { - - if (_mosi != -1) { // transmit on falling edge + + if (_mosi != -1) { // transmit on falling edge BUSIO_WRITE_MOSI(send & b); } - + BUSIO_SET_CLOCK_LOW(); - + if (bitdelay_us) { delayMicroseconds(bitdelay_us); } - + BUSIO_SET_CLOCK_HIGH(); - + if (bitdelay_us) { delayMicroseconds(bitdelay_us); } - - if (_miso != -1) { // read on rising edge + + if (_miso != -1) { // read on rising edge if (BUSIO_READ_MISO()) { reply |= b; } } - - } else { // || _dataMode == SPI_MODE1) - + + } else { // || _dataMode == SPI_MODE1) + BUSIO_SET_CLOCK_HIGH(); - + if (bitdelay_us) { delayMicroseconds(bitdelay_us); } - + if (_mosi != -1) { BUSIO_WRITE_MOSI(send & b); } - + BUSIO_SET_CLOCK_LOW(); - + if (_miso != -1) { if (BUSIO_READ_MISO()) { reply |= b;