Adafruit_SPITFT_Macros.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #ifndef _ADAFRUIT_SPITFT_MACROS
  2. #define _ADAFRUIT_SPITFT_MACROS
  3. /*
  4. * Control Pins
  5. * */
  6. #ifdef USE_FAST_PINIO
  7. #define SPI_DC_HIGH() *dcport |= dcpinmask
  8. #define SPI_DC_LOW() *dcport &= ~dcpinmask
  9. #define SPI_CS_HIGH() *csport |= cspinmask
  10. #define SPI_CS_LOW() *csport &= ~cspinmask
  11. #else
  12. #define SPI_DC_HIGH() digitalWrite(_dc, HIGH)
  13. #define SPI_DC_LOW() digitalWrite(_dc, LOW)
  14. #define SPI_CS_HIGH() { if(_cs >= 0) digitalWrite(_cs, HIGH); }
  15. #define SPI_CS_LOW() { if(_cs >= 0) digitalWrite(_cs, LOW); }
  16. #endif
  17. /*
  18. * Software SPI Macros
  19. * */
  20. #ifdef USE_FAST_PINIO
  21. #define SSPI_MOSI_HIGH() *mosiport |= mosipinmask
  22. #define SSPI_MOSI_LOW() *mosiport &= ~mosipinmask
  23. #define SSPI_SCK_HIGH() *clkport |= clkpinmask
  24. #define SSPI_SCK_LOW() *clkport &= ~clkpinmask
  25. #define SSPI_MISO_READ() ((*misoport & misopinmask) != 0)
  26. #else
  27. #define SSPI_MOSI_HIGH() digitalWrite(_mosi, HIGH)
  28. #define SSPI_MOSI_LOW() digitalWrite(_mosi, LOW)
  29. #define SSPI_SCK_HIGH() digitalWrite(_sclk, HIGH)
  30. #define SSPI_SCK_LOW() digitalWrite(_sclk, LOW)
  31. #define SSPI_MISO_READ() digitalRead(_miso)
  32. #endif
  33. #define SSPI_BEGIN_TRANSACTION()
  34. #define SSPI_END_TRANSACTION()
  35. #define SSPI_WRITE(v) spiWrite(v)
  36. #define SSPI_WRITE16(s) SSPI_WRITE((s) >> 8); SSPI_WRITE(s)
  37. #define SSPI_WRITE32(l) SSPI_WRITE((l) >> 24); SSPI_WRITE((l) >> 16); SSPI_WRITE((l) >> 8); SSPI_WRITE(l)
  38. #define SSPI_WRITE_PIXELS(c,l) for(uint32_t i=0; i<(l); i+=2){ SSPI_WRITE(((uint8_t*)(c))[i+1]); SSPI_WRITE(((uint8_t*)(c))[i]); }
  39. /*
  40. * Hardware SPI Macros
  41. * */
  42. #define SPI_OBJECT SPI
  43. #if defined (__AVR__) || defined(TEENSYDUINO) || defined(ARDUINO_ARCH_STM32F1)
  44. #define HSPI_SET_CLOCK() SPI_OBJECT.setClockDivider(SPI_CLOCK_DIV2);
  45. #elif defined (__arm__)
  46. #define HSPI_SET_CLOCK() SPI_OBJECT.setClockDivider(11);
  47. #elif defined(ESP8266) || defined(ESP32)
  48. #define HSPI_SET_CLOCK() SPI_OBJECT.setFrequency(_freq);
  49. #elif defined(RASPI)
  50. #define HSPI_SET_CLOCK() SPI_OBJECT.setClock(_freq);
  51. #elif defined(ARDUINO_ARCH_STM32F1)
  52. #define HSPI_SET_CLOCK() SPI_OBJECT.setClock(_freq);
  53. #else
  54. #define HSPI_SET_CLOCK()
  55. #endif
  56. #ifdef SPI_HAS_TRANSACTION
  57. #define HSPI_BEGIN_TRANSACTION() SPI_OBJECT.beginTransaction(SPISettings(_freq, MSBFIRST, SPI_MODE0))
  58. #define HSPI_END_TRANSACTION() SPI_OBJECT.endTransaction()
  59. #else
  60. #define HSPI_BEGIN_TRANSACTION() HSPI_SET_CLOCK(); SPI_OBJECT.setBitOrder(MSBFIRST); SPI_OBJECT.setDataMode(SPI_MODE0)
  61. #define HSPI_END_TRANSACTION()
  62. #endif
  63. #ifdef ESP32
  64. #define SPI_HAS_WRITE_PIXELS
  65. #endif
  66. #if defined(ESP8266) || defined(ESP32)
  67. // Optimized SPI (ESP8266 and ESP32)
  68. #define HSPI_READ() SPI_OBJECT.transfer(0)
  69. #define HSPI_WRITE(b) SPI_OBJECT.write(b)
  70. #define HSPI_WRITE16(s) SPI_OBJECT.write16(s)
  71. #define HSPI_WRITE32(l) SPI_OBJECT.write32(l)
  72. #ifdef SPI_HAS_WRITE_PIXELS
  73. #define SPI_MAX_PIXELS_AT_ONCE 32
  74. #define HSPI_WRITE_PIXELS(c,l) SPI_OBJECT.writePixels(c,l)
  75. #else
  76. #define HSPI_WRITE_PIXELS(c,l) for(uint32_t i=0; i<((l)/2); i++){ SPI_WRITE16(((uint16_t*)(c))[i]); }
  77. #endif
  78. #else
  79. // Standard Byte-by-Byte SPI
  80. #if defined (__AVR__) || defined(TEENSYDUINO)
  81. static inline uint8_t _avr_spi_read(void) __attribute__((always_inline));
  82. static inline uint8_t _avr_spi_read(void) {
  83. uint8_t r = 0;
  84. SPDR = r;
  85. while(!(SPSR & _BV(SPIF)));
  86. r = SPDR;
  87. return r;
  88. }
  89. #define HSPI_WRITE(b) {SPDR = (b); while(!(SPSR & _BV(SPIF)));}
  90. #define HSPI_READ() _avr_spi_read()
  91. #else
  92. #define HSPI_WRITE(b) SPI_OBJECT.transfer((uint8_t)(b))
  93. #define HSPI_READ() HSPI_WRITE(0)
  94. #endif
  95. #define HSPI_WRITE16(s) HSPI_WRITE((s) >> 8); HSPI_WRITE(s)
  96. #define HSPI_WRITE32(l) HSPI_WRITE((l) >> 24); HSPI_WRITE((l) >> 16); HSPI_WRITE((l) >> 8); HSPI_WRITE(l)
  97. #define HSPI_WRITE_PIXELS(c,l) for(uint32_t i=0; i<(l); i+=2){ HSPI_WRITE(((uint8_t*)(c))[i+1]); HSPI_WRITE(((uint8_t*)(c))[i]); }
  98. #endif
  99. #define SPI_BEGIN() if(_sclk < 0){SPI_OBJECT.begin();}
  100. #define SPI_BEGIN_TRANSACTION() if(_sclk < 0){HSPI_BEGIN_TRANSACTION();}
  101. #define SPI_END_TRANSACTION() if(_sclk < 0){HSPI_END_TRANSACTION();}
  102. #define SPI_WRITE16(s) if(_sclk < 0){HSPI_WRITE16(s);}else{SSPI_WRITE16(s);}
  103. #define SPI_WRITE32(l) if(_sclk < 0){HSPI_WRITE32(l);}else{SSPI_WRITE32(l);}
  104. #define SPI_WRITE_PIXELS(c,l) if(_sclk < 0){HSPI_WRITE_PIXELS(c,l);}else{SSPI_WRITE_PIXELS(c,l);}
  105. #endif // _ADAFRUIT_SPITFT_MACROS