1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-19 09:42:11 +03:00

Add SPI transactions to TFT library.

This commit is contained in:
David A. Mellis
2015-04-26 17:28:19 -04:00
parent b10417505f
commit 0c7f9234df
2 changed files with 52 additions and 2 deletions

View File

@ -73,6 +73,9 @@ inline void Adafruit_ST7735::spiwrite(uint8_t c) {
void Adafruit_ST7735::writecommand(uint8_t c) { void Adafruit_ST7735::writecommand(uint8_t c) {
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.beginTransaction(spisettings);
#endif
*rsport &= ~rspinmask; *rsport &= ~rspinmask;
*csport &= ~cspinmask; *csport &= ~cspinmask;
@ -80,10 +83,16 @@ void Adafruit_ST7735::writecommand(uint8_t c) {
spiwrite(c); spiwrite(c);
*csport |= cspinmask; *csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.endTransaction();
#endif
} }
void Adafruit_ST7735::writedata(uint8_t c) { void Adafruit_ST7735::writedata(uint8_t c) {
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.beginTransaction(spisettings);
#endif
*rsport |= rspinmask; *rsport |= rspinmask;
*csport &= ~cspinmask; *csport &= ~cspinmask;
@ -91,6 +100,9 @@ void Adafruit_ST7735::writedata(uint8_t c) {
spiwrite(c); spiwrite(c);
*csport |= cspinmask; *csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.endTransaction();
#endif
} }
@ -331,6 +343,9 @@ void Adafruit_ST7735::commonInit(const uint8_t *cmdList) {
if(hwSPI) { // Using hardware SPI if(hwSPI) { // Using hardware SPI
SPI.begin(); SPI.begin();
#ifdef SPI_HAS_TRANSACTION
spisettings = SPISettings(4000000L, MSBFIRST, SPI_MODE0);
#else
#if defined(ARDUINO_ARCH_SAM) #if defined(ARDUINO_ARCH_SAM)
SPI.setClockDivider(24); // 4 MHz (half speed) SPI.setClockDivider(24); // 4 MHz (half speed)
#else #else
@ -338,6 +353,7 @@ void Adafruit_ST7735::commonInit(const uint8_t *cmdList) {
#endif #endif
SPI.setBitOrder(MSBFIRST); SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0); SPI.setDataMode(SPI_MODE0);
#endif // SPI_HAS_TRANSACTION
} else { } else {
pinMode(_sclk, OUTPUT); pinMode(_sclk, OUTPUT);
pinMode(_sid , OUTPUT); pinMode(_sid , OUTPUT);
@ -413,6 +429,9 @@ void Adafruit_ST7735::setAddrWindow(uint8_t x0, uint8_t y0, uint8_t x1,
void Adafruit_ST7735::pushColor(uint16_t color) { void Adafruit_ST7735::pushColor(uint16_t color) {
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.beginTransaction(spisettings);
#endif
*rsport |= rspinmask; *rsport |= rspinmask;
*csport &= ~cspinmask; *csport &= ~cspinmask;
@ -421,6 +440,9 @@ void Adafruit_ST7735::pushColor(uint16_t color) {
spiwrite(color); spiwrite(color);
*csport |= cspinmask; *csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.endTransaction();
#endif
} }
void Adafruit_ST7735::drawPixel(int16_t x, int16_t y, uint16_t color) { void Adafruit_ST7735::drawPixel(int16_t x, int16_t y, uint16_t color) {
@ -429,6 +451,9 @@ void Adafruit_ST7735::drawPixel(int16_t x, int16_t y, uint16_t color) {
setAddrWindow(x,y,x+1,y+1); setAddrWindow(x,y,x+1,y+1);
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.beginTransaction(spisettings);
#endif
*rsport |= rspinmask; *rsport |= rspinmask;
*csport &= ~cspinmask; *csport &= ~cspinmask;
@ -438,6 +463,9 @@ void Adafruit_ST7735::drawPixel(int16_t x, int16_t y, uint16_t color) {
spiwrite(color); spiwrite(color);
*csport |= cspinmask; *csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.endTransaction();
#endif
} }
@ -452,6 +480,9 @@ void Adafruit_ST7735::drawFastVLine(int16_t x, int16_t y, int16_t h,
if (tabcolor == INITR_BLACKTAB) color = swapcolor(color); if (tabcolor == INITR_BLACKTAB) color = swapcolor(color);
uint8_t hi = color >> 8, lo = color; uint8_t hi = color >> 8, lo = color;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.beginTransaction(spisettings);
#endif
*rsport |= rspinmask; *rsport |= rspinmask;
*csport &= ~cspinmask; *csport &= ~cspinmask;
while (h--) { while (h--) {
@ -459,6 +490,9 @@ void Adafruit_ST7735::drawFastVLine(int16_t x, int16_t y, int16_t h,
spiwrite(lo); spiwrite(lo);
} }
*csport |= cspinmask; *csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.endTransaction();
#endif
} }
@ -473,6 +507,9 @@ void Adafruit_ST7735::drawFastHLine(int16_t x, int16_t y, int16_t w,
if (tabcolor == INITR_BLACKTAB) color = swapcolor(color); if (tabcolor == INITR_BLACKTAB) color = swapcolor(color);
uint8_t hi = color >> 8, lo = color; uint8_t hi = color >> 8, lo = color;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.beginTransaction(spisettings);
#endif
*rsport |= rspinmask; *rsport |= rspinmask;
*csport &= ~cspinmask; *csport &= ~cspinmask;
while (w--) { while (w--) {
@ -480,6 +517,9 @@ void Adafruit_ST7735::drawFastHLine(int16_t x, int16_t y, int16_t w,
spiwrite(lo); spiwrite(lo);
} }
*csport |= cspinmask; *csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.endTransaction();
#endif
} }
@ -504,6 +544,9 @@ void Adafruit_ST7735::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
setAddrWindow(x, y, x+w-1, y+h-1); setAddrWindow(x, y, x+w-1, y+h-1);
uint8_t hi = color >> 8, lo = color; uint8_t hi = color >> 8, lo = color;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.beginTransaction(spisettings);
#endif
*rsport |= rspinmask; *rsport |= rspinmask;
*csport &= ~cspinmask; *csport &= ~cspinmask;
for(y=h; y>0; y--) { for(y=h; y>0; y--) {
@ -514,6 +557,9 @@ void Adafruit_ST7735::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
} }
*csport |= cspinmask; *csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.endTransaction();
#endif
} }

View File

@ -26,6 +26,7 @@
#include "WProgram.h" #include "WProgram.h"
#endif #endif
#include "Adafruit_GFX.h" #include "Adafruit_GFX.h"
#include <SPI.h>
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
// some flags for initR() :( // some flags for initR() :(
@ -135,6 +136,9 @@ class Adafruit_ST7735 : public Adafruit_GFX {
//uint8_t spiread(void); //uint8_t spiread(void);
boolean hwSPI; boolean hwSPI;
#ifdef SPI_HAS_TRANSACTION
SPISettings spisettings;
#endif
#if defined(ARDUINO_ARCH_SAM) #if defined(ARDUINO_ARCH_SAM)
volatile uint32_t *dataport, *clkport, *csport, *rsport; volatile uint32_t *dataport, *clkport, *csport, *rsport;
uint32_t _cs, _rs, _rst, _sid, _sclk, uint32_t _cs, _rs, _rst, _sid, _sclk,