From 97a9d77fa710a9f3b18008f2bfd5301a0290f8c7 Mon Sep 17 00:00:00 2001 From: sumotoy Date: Thu, 5 Mar 2015 22:01:23 +0100 Subject: [PATCH] SPI transaction for Arduino's --- TFT_ILI9163C.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ TFT_ILI9163C.h | 2 ++ 2 files changed, 42 insertions(+) diff --git a/TFT_ILI9163C.cpp b/TFT_ILI9163C.cpp index 9c92279..5b09f5d 100644 --- a/TFT_ILI9163C.cpp +++ b/TFT_ILI9163C.cpp @@ -36,25 +36,43 @@ inline void TFT_ILI9163C::spiwrite(uint8_t c){ } void TFT_ILI9163C::writecommand(uint8_t c){ + #ifdef SPI_HAS_TRANSACTION + SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0)); + #endif *rsport &= ~rspinmask;//low *csport &= ~cspinmask;//low spiwrite(c); *csport |= cspinmask;//hi + #ifdef SPI_HAS_TRANSACTION + SPI.endTransaction(); + #endif } void TFT_ILI9163C::writedata(uint8_t c){ + #ifdef SPI_HAS_TRANSACTION + SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0)); + #endif *rsport |= rspinmask; *csport &= ~cspinmask; spiwrite(c); *csport |= cspinmask; + #ifdef SPI_HAS_TRANSACTION + SPI.endTransaction(); + #endif } void TFT_ILI9163C::writedata16(uint16_t d){ + #ifdef SPI_HAS_TRANSACTION + SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0)); + #endif *rsport |= rspinmask; *csport &= ~cspinmask; spiwrite(d >> 8); spiwrite(d); *csport |= cspinmask; + #ifdef SPI_HAS_TRANSACTION + SPI.endTransaction(); + #endif } void TFT_ILI9163C::setBitrate(uint32_t n){ @@ -76,25 +94,43 @@ inline void TFT_ILI9163C::spiwrite(uint8_t c){ } void TFT_ILI9163C::writecommand(uint8_t c){ + #ifdef SPI_HAS_TRANSACTION + SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0)); + #endif rsport->PIO_CODR |= rspinmask;//LO csport->PIO_CODR |= cspinmask;//LO spiwrite(c); csport->PIO_SODR |= cspinmask;//HI + #ifdef SPI_HAS_TRANSACTION + SPI.endTransaction(); + #endif } void TFT_ILI9163C::writedata(uint8_t c){ + #ifdef SPI_HAS_TRANSACTION + SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0)); + #endif rsport->PIO_SODR |= rspinmask;//HI csport->PIO_CODR |= cspinmask;//LO spiwrite(c); csport->PIO_SODR |= cspinmask;//HI + #ifdef SPI_HAS_TRANSACTION + SPI.endTransaction(); + #endif } void TFT_ILI9163C::writedata16(uint16_t d){ + #ifdef SPI_HAS_TRANSACTION + SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0)); + #endif rsport->PIO_SODR |= rspinmask;//HI csport->PIO_CODR |= cspinmask;//LO spiwrite(d >> 8); spiwrite(d); csport->PIO_SODR |= cspinmask;//HI + #ifdef SPI_HAS_TRANSACTION + SPI.endTransaction(); + #endif } @@ -126,9 +162,11 @@ void TFT_ILI9163C::begin(void) { cspinmask = digitalPinToBitMask(_cs); rspinmask = digitalPinToBitMask(_rs); SPI.begin(); + #if !defined (SPI_HAS_TRANSACTION) SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz SPI.setBitOrder(MSBFIRST); SPI.setDataMode(SPI_MODE0); + #endif // toggle RST low to reset; CS low so it'll listen to us *csport &= ~cspinmask; #elif defined(__SAM3X8E__) @@ -139,9 +177,11 @@ void TFT_ILI9163C::begin(void) { cspinmask = digitalPinToBitMask(_cs); rspinmask = digitalPinToBitMask(_rs); SPI.begin(); + #if !defined (SPI_HAS_TRANSACTION) SPI.setClockDivider(11); // 8 MHz SPI.setBitOrder(MSBFIRST); SPI.setDataMode(SPI_MODE0); + #endif // toggle RST low to reset; CS low so it'll listen to us csport ->PIO_CODR |= cspinmask; // Set control bits to LOW (idle) #elif defined(__MK20DX128__) || defined(__MK20DX256__) diff --git a/TFT_ILI9163C.h b/TFT_ILI9163C.h index 3075cab..68bc535 100644 --- a/TFT_ILI9163C.h +++ b/TFT_ILI9163C.h @@ -120,9 +120,11 @@ Done! #define pgm_read_byte(addr) (*(const unsigned char *)(addr)) #define pgm_read_word(addr) (*(const unsigned short *)(addr)) typedef unsigned char prog_uchar; + #define SPICLOCK 8000000 #endif #ifdef __AVR__ #include + #define SPICLOCK 8000000 #endif #if defined(__MK20DX128__) || defined(__MK20DX256__) #define SPICLOCK 30000000