SPI transaction for Arduino's

This commit is contained in:
sumotoy 2015-03-05 22:01:23 +01:00
parent 4f28c07c0d
commit 97a9d77fa7
2 changed files with 42 additions and 0 deletions

View file

@ -36,25 +36,43 @@ inline void TFT_ILI9163C::spiwrite(uint8_t c){
} }
void TFT_ILI9163C::writecommand(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 *rsport &= ~rspinmask;//low
*csport &= ~cspinmask;//low *csport &= ~cspinmask;//low
spiwrite(c); spiwrite(c);
*csport |= cspinmask;//hi *csport |= cspinmask;//hi
#ifdef SPI_HAS_TRANSACTION
SPI.endTransaction();
#endif
} }
void TFT_ILI9163C::writedata(uint8_t c){ void TFT_ILI9163C::writedata(uint8_t c){
#ifdef SPI_HAS_TRANSACTION
SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0));
#endif
*rsport |= rspinmask; *rsport |= rspinmask;
*csport &= ~cspinmask; *csport &= ~cspinmask;
spiwrite(c); spiwrite(c);
*csport |= cspinmask; *csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
SPI.endTransaction();
#endif
} }
void TFT_ILI9163C::writedata16(uint16_t d){ void TFT_ILI9163C::writedata16(uint16_t d){
#ifdef SPI_HAS_TRANSACTION
SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0));
#endif
*rsport |= rspinmask; *rsport |= rspinmask;
*csport &= ~cspinmask; *csport &= ~cspinmask;
spiwrite(d >> 8); spiwrite(d >> 8);
spiwrite(d); spiwrite(d);
*csport |= cspinmask; *csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
SPI.endTransaction();
#endif
} }
void TFT_ILI9163C::setBitrate(uint32_t n){ 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){ void TFT_ILI9163C::writecommand(uint8_t c){
#ifdef SPI_HAS_TRANSACTION
SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0));
#endif
rsport->PIO_CODR |= rspinmask;//LO rsport->PIO_CODR |= rspinmask;//LO
csport->PIO_CODR |= cspinmask;//LO csport->PIO_CODR |= cspinmask;//LO
spiwrite(c); spiwrite(c);
csport->PIO_SODR |= cspinmask;//HI csport->PIO_SODR |= cspinmask;//HI
#ifdef SPI_HAS_TRANSACTION
SPI.endTransaction();
#endif
} }
void TFT_ILI9163C::writedata(uint8_t c){ void TFT_ILI9163C::writedata(uint8_t c){
#ifdef SPI_HAS_TRANSACTION
SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0));
#endif
rsport->PIO_SODR |= rspinmask;//HI rsport->PIO_SODR |= rspinmask;//HI
csport->PIO_CODR |= cspinmask;//LO csport->PIO_CODR |= cspinmask;//LO
spiwrite(c); spiwrite(c);
csport->PIO_SODR |= cspinmask;//HI csport->PIO_SODR |= cspinmask;//HI
#ifdef SPI_HAS_TRANSACTION
SPI.endTransaction();
#endif
} }
void TFT_ILI9163C::writedata16(uint16_t d){ void TFT_ILI9163C::writedata16(uint16_t d){
#ifdef SPI_HAS_TRANSACTION
SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0));
#endif
rsport->PIO_SODR |= rspinmask;//HI rsport->PIO_SODR |= rspinmask;//HI
csport->PIO_CODR |= cspinmask;//LO csport->PIO_CODR |= cspinmask;//LO
spiwrite(d >> 8); spiwrite(d >> 8);
spiwrite(d); spiwrite(d);
csport->PIO_SODR |= cspinmask;//HI csport->PIO_SODR |= cspinmask;//HI
#ifdef SPI_HAS_TRANSACTION
SPI.endTransaction();
#endif
} }
@ -126,9 +162,11 @@ void TFT_ILI9163C::begin(void) {
cspinmask = digitalPinToBitMask(_cs); cspinmask = digitalPinToBitMask(_cs);
rspinmask = digitalPinToBitMask(_rs); rspinmask = digitalPinToBitMask(_rs);
SPI.begin(); SPI.begin();
#if !defined (SPI_HAS_TRANSACTION)
SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz
SPI.setBitOrder(MSBFIRST); SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0); SPI.setDataMode(SPI_MODE0);
#endif
// toggle RST low to reset; CS low so it'll listen to us // toggle RST low to reset; CS low so it'll listen to us
*csport &= ~cspinmask; *csport &= ~cspinmask;
#elif defined(__SAM3X8E__) #elif defined(__SAM3X8E__)
@ -139,9 +177,11 @@ void TFT_ILI9163C::begin(void) {
cspinmask = digitalPinToBitMask(_cs); cspinmask = digitalPinToBitMask(_cs);
rspinmask = digitalPinToBitMask(_rs); rspinmask = digitalPinToBitMask(_rs);
SPI.begin(); SPI.begin();
#if !defined (SPI_HAS_TRANSACTION)
SPI.setClockDivider(11); // 8 MHz SPI.setClockDivider(11); // 8 MHz
SPI.setBitOrder(MSBFIRST); SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0); SPI.setDataMode(SPI_MODE0);
#endif
// toggle RST low to reset; CS low so it'll listen to us // toggle RST low to reset; CS low so it'll listen to us
csport ->PIO_CODR |= cspinmask; // Set control bits to LOW (idle) csport ->PIO_CODR |= cspinmask; // Set control bits to LOW (idle)
#elif defined(__MK20DX128__) || defined(__MK20DX256__) #elif defined(__MK20DX128__) || defined(__MK20DX256__)

View file

@ -120,9 +120,11 @@ Done!
#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) #define pgm_read_byte(addr) (*(const unsigned char *)(addr))
#define pgm_read_word(addr) (*(const unsigned short *)(addr)) #define pgm_read_word(addr) (*(const unsigned short *)(addr))
typedef unsigned char prog_uchar; typedef unsigned char prog_uchar;
#define SPICLOCK 8000000
#endif #endif
#ifdef __AVR__ #ifdef __AVR__
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
#define SPICLOCK 8000000
#endif #endif
#if defined(__MK20DX128__) || defined(__MK20DX256__) #if defined(__MK20DX128__) || defined(__MK20DX256__)
#define SPICLOCK 30000000 #define SPICLOCK 30000000