|
35 | 35 |
|
36 | 36 | #include "Adafruit_SPITFT.h" |
37 | 37 |
|
| 38 | +#if defined(__AVR__) |
| 39 | +#if defined(__AVR_XMEGA__) //only tested with __AVR_ATmega4809__ |
| 40 | +#define AVR_WRITESPI(x) for(SPI0_DATA = (x); (!(SPI0_INTFLAGS & _BV(SPI_IF_bp))); ) |
| 41 | +#else |
| 42 | +#define AVR_WRITESPI(x) for(SPDR = (x); (!(SPSR & _BV(SPIF))); ) |
| 43 | +#endif |
| 44 | +#endif |
| 45 | + |
38 | 46 | #if defined(PORT_IOBUS) |
39 | 47 | // On SAMD21, redefine digitalPinToPort() to use the slightly-faster |
40 | 48 | // PORT_IOBUS rather than PORT (not needed on SAMD51). |
@@ -1220,8 +1228,8 @@ void Adafruit_SPITFT::writeColor(uint16_t color, uint32_t len) { |
1220 | 1228 | #else // !ESP8266 |
1221 | 1229 | while(len--) { |
1222 | 1230 | #if defined(__AVR__) |
1223 | | - for(SPDR = hi; !(SPSR & _BV(SPIF)); ); |
1224 | | - for(SPDR = lo; !(SPSR & _BV(SPIF)); ); |
| 1231 | + AVR_WRITESPI(hi); |
| 1232 | + AVR_WRITESPI(lo); |
1225 | 1233 | #elif defined(ESP32) |
1226 | 1234 | hwspi._spi->write(hi); |
1227 | 1235 | hwspi._spi->write(lo); |
@@ -1828,7 +1836,7 @@ inline void Adafruit_SPITFT::SPI_END_TRANSACTION(void) { |
1828 | 1836 | void Adafruit_SPITFT::spiWrite(uint8_t b) { |
1829 | 1837 | if(connection == TFT_HARD_SPI) { |
1830 | 1838 | #if defined(__AVR__) |
1831 | | - for(SPDR = b; !(SPSR & _BV(SPIF)); ); |
| 1839 | + AVR_WRITESPI(b); |
1832 | 1840 | #elif defined(ESP8266) || defined(ESP32) |
1833 | 1841 | hwspi._spi->write(b); |
1834 | 1842 | #else |
@@ -2055,8 +2063,8 @@ inline bool Adafruit_SPITFT::SPI_MISO_READ(void) { |
2055 | 2063 | void Adafruit_SPITFT::SPI_WRITE16(uint16_t w) { |
2056 | 2064 | if(connection == TFT_HARD_SPI) { |
2057 | 2065 | #if defined(__AVR__) |
2058 | | - for(SPDR = (w >> 8); (!(SPSR & _BV(SPIF))); ); |
2059 | | - for(SPDR = w ; (!(SPSR & _BV(SPIF))); ); |
| 2066 | + AVR_WRITESPI(w >> 8); |
| 2067 | + AVR_WRITESPI(w); |
2060 | 2068 | #elif defined(ESP8266) || defined(ESP32) |
2061 | 2069 | hwspi._spi->write16(w); |
2062 | 2070 | #else |
@@ -2102,10 +2110,10 @@ void Adafruit_SPITFT::SPI_WRITE16(uint16_t w) { |
2102 | 2110 | void Adafruit_SPITFT::SPI_WRITE32(uint32_t l) { |
2103 | 2111 | if(connection == TFT_HARD_SPI) { |
2104 | 2112 | #if defined(__AVR__) |
2105 | | - for(SPDR = (l >> 24); !(SPSR & _BV(SPIF)); ); |
2106 | | - for(SPDR = (l >> 16); !(SPSR & _BV(SPIF)); ); |
2107 | | - for(SPDR = (l >> 8); !(SPSR & _BV(SPIF)); ); |
2108 | | - for(SPDR = l ; !(SPSR & _BV(SPIF)); ); |
| 2113 | + AVR_WRITESPI(l >> 24); |
| 2114 | + AVR_WRITESPI(l >> 16); |
| 2115 | + AVR_WRITESPI(l >> 8); |
| 2116 | + AVR_WRITESPI(l ); |
2109 | 2117 | #elif defined(ESP8266) || defined(ESP32) |
2110 | 2118 | hwspi._spi->write32(l); |
2111 | 2119 | #else |
|
0 commit comments