From 9fc39798a93a5c699d36246e52e859ed99b82dce Mon Sep 17 00:00:00 2001 From: sumotoy Date: Tue, 9 Jun 2015 17:36:06 +0200 Subject: [PATCH] fixed Teensy LC SPI error, now works in SPI1 --- TFT_ILI9163C.cpp | 89 +++++++++++++++++++++++++++++++++++------------- TFT_ILI9163C.h | 43 +++-------------------- 2 files changed, 69 insertions(+), 63 deletions(-) diff --git a/TFT_ILI9163C.cpp b/TFT_ILI9163C.cpp index e7e9a61..3d5e60c 100644 --- a/TFT_ILI9163C.cpp +++ b/TFT_ILI9163C.cpp @@ -21,12 +21,15 @@ _sclk = sclk; } #elif defined(__MKL26Z64__) - TFT_ILI9163C::TFT_ILI9163C(uint8_t cspin,uint8_t dcpin,uint8_t rstpin,bool useSPI1) : Adafruit_GFX(_TFTWIDTH,_TFTHEIGHT) + TFT_ILI9163C::TFT_ILI9163C(uint8_t cspin,uint8_t dcpin,uint8_t rstpin,uint8_t mosi,uint8_t sclk) : Adafruit_GFX(_TFTWIDTH,_TFTHEIGHT) { _cs = cspin; _rs = dcpin; _rst = rstpin; - _useSPI1 = useSPI1; + _mosi = mosi; + _sclk = sclk; + _useSPI1 = false; + if ((_mosi == 0 || _mosi == 21) && (_sclk == 20)) _useSPI1 = true; } #else TFT_ILI9163C::TFT_ILI9163C(uint8_t cspin,uint8_t dcpin,uint8_t rstpin) : Adafruit_GFX(_TFTWIDTH,_TFTHEIGHT) @@ -169,44 +172,59 @@ void TFT_ILI9163C::writecommand(uint8_t c) { - SPI.beginTransaction(ILI9163C_SPI); - digitalWriteFast(_rs,LOW); - digitalWriteFast(_cs,LOW); if (_useSPI1){ + SPI1.beginTransaction(ILI9163C_SPI); + digitalWriteFast(_rs,LOW); + digitalWriteFast(_cs,LOW); SPI1.transfer(c); + digitalWriteFast(_cs,HIGH); + SPI1.endTransaction(); } else { + SPI.beginTransaction(ILI9163C_SPI); + digitalWriteFast(_rs,LOW); + digitalWriteFast(_cs,LOW); SPI.transfer(c); + digitalWriteFast(_cs,HIGH); + SPI.endTransaction(); } - digitalWriteFast(_cs,HIGH); - SPI.endTransaction(); } void TFT_ILI9163C::writedata(uint8_t c) { - SPI.beginTransaction(ILI9163C_SPI); - digitalWriteFast(_rs,HIGH); - digitalWriteFast(_cs,LOW); if (_useSPI1){ + SPI1.beginTransaction(ILI9163C_SPI); + digitalWriteFast(_rs,HIGH); + digitalWriteFast(_cs,LOW); SPI1.transfer(c); + digitalWriteFast(_cs,HIGH); + SPI1.endTransaction(); } else { + SPI.beginTransaction(ILI9163C_SPI); + digitalWriteFast(_rs,HIGH); + digitalWriteFast(_cs,LOW); SPI.transfer(c); + digitalWriteFast(_cs,HIGH); + SPI.endTransaction(); } - digitalWriteFast(_cs,HIGH); - SPI.endTransaction(); } void TFT_ILI9163C::writedata16(uint16_t d) { - SPI.beginTransaction(ILI9163C_SPI); - digitalWriteFast(_rs,HIGH); - digitalWriteFast(_cs,LOW); if (_useSPI1){ + SPI1.beginTransaction(ILI9163C_SPI); + digitalWriteFast(_rs,HIGH); + digitalWriteFast(_cs,LOW); SPI1.transfer16(d); + digitalWriteFast(_cs,HIGH); + SPI1.endTransaction(); } else { + SPI.beginTransaction(ILI9163C_SPI); + digitalWriteFast(_rs,HIGH); + digitalWriteFast(_cs,LOW); SPI.transfer16(d); + digitalWriteFast(_cs,HIGH); + SPI.endTransaction(); } - digitalWriteFast(_cs,HIGH); - SPI.endTransaction(); } void TFT_ILI9163C::setBitrate(uint32_t n) @@ -310,13 +328,36 @@ void TFT_ILI9163C::begin(void) #elif defined(__MKL26Z64__)//Teensy LC (preliminary) pinMode(_rs, OUTPUT); pinMode(_cs, OUTPUT); - if (_useSPI1){ - ILI9163C_SPI = SPISettings(12000000, MSBFIRST, SPI_MODE0); - SPI1.begin(); + if ((_mosi == 0 || _mosi == 21) && (_sclk == 20)) {//identify alternate SPI channel 1 (24Mhz) + ILI9163C_SPI = SPISettings(24000000, MSBFIRST, SPI_MODE0); + SPI1.setMOSI(_mosi); + SPI1.setSCK(_sclk); + SPI1.begin(); + _useSPI1 = true; //confirm + } else { + bitSet(_initError,0); + return; + } + if (!SPI.pinIsChipSelect(_cs)) {//ERROR + bitSet(_initError,1); + return; + } } else { - ILI9163C_SPI = SPISettings(24000000, MSBFIRST, SPI_MODE0); - SPI.begin(); + if ((_mosi == 11 || _mosi == 7) && (_sclk == 13 || _sclk == 14)) {//valid SPI pins? + ILI9163C_SPI = SPISettings(12000000, MSBFIRST, SPI_MODE0); + SPI.setMOSI(_mosi); + SPI.setSCK(_sclk); + SPI.begin(); + _useSPI1 = false; //confirm + } else { + bitSet(_initError,0); + return; + } + if (!SPI.pinIsChipSelect(_cs)) {//ERROR + bitSet(_initError,1); + return; + } } digitalWriteFast(_cs, LOW); #elif defined(__MK20DX128__) || defined(__MK20DX256__) @@ -325,7 +366,7 @@ void TFT_ILI9163C::begin(void) SPI.setMOSI(_mosi); SPI.setSCK(_sclk); } else { - bitSet(_initError,1); + bitSet(_initError,0); return; } SPI.begin(); @@ -335,7 +376,7 @@ void TFT_ILI9163C::begin(void) } else { pcs_data = 0; pcs_command = 0; - bitSet(_initError,0); + bitSet(_initError,1); return; } #else//all the rest of possible boards diff --git a/TFT_ILI9163C.h b/TFT_ILI9163C.h index 0837b84..f00ff7b 100644 --- a/TFT_ILI9163C.h +++ b/TFT_ILI9163C.h @@ -143,7 +143,7 @@ class TFT_ILI9163C : public Adafruit_GFX { #if defined(__MK20DX128__) || defined(__MK20DX256__) TFT_ILI9163C(uint8_t cspin,uint8_t dcpin,uint8_t rstpin=255,uint8_t mosi=11,uint8_t sclk=13); #elif defined(__MKL26Z64__) - TFT_ILI9163C(uint8_t cspin,uint8_t dcpin,uint8_t rstpin=255,bool useSPI1=false); + TFT_ILI9163C(uint8_t cspin,uint8_t dcpin,uint8_t rstpin=255,uint8_t mosi=11,uint8_t sclk=13); #else TFT_ILI9163C(uint8_t cspin,uint8_t dcpin,uint8_t rstpin=255); #endif @@ -182,43 +182,7 @@ class TFT_ILI9163C : public Adafruit_GFX { protected: volatile uint8_t _Mactrl_Data;//container for the memory access control data uint8_t _colorspaceData; - -/* inline void startTransaction(void){ - //__attribute__((always_inline)) { - #if defined(SPI_HAS_TRANSACTION) - SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0)); - #endif - #if defined(__AVR__) - *csport &= ~cspinmask;//low - #elif defined(__SAM3X8E__) - csport->PIO_CODR |= cspinmask;//LO - #elif defined(__MK20DX128__) || defined(__MK20DX256__) - //nop - #elif defined(__MKL26Z64__) - digitalWriteFast(_cs,LOW); - #else - digitalWrite(_cs,LOW); - #endif - } */ - -/* inline void stopTransaction(void){ - //__attribute__((always_inline)) { - #if defined(__AVR__) - *csport |= cspinmask;//hi - #elif defined(__SAM3X8E__) - csport->PIO_SODR |= cspinmask;//HI - #elif defined(__MK20DX128__) || defined(__MK20DX256__) - //nop - #elif defined(__MKL26Z64__) - digitalWriteFast(_cs,HIGH); - #else - digitalWrite(_cs,HIGH); - #endif - #if defined(SPI_HAS_TRANSACTION) - SPI.endTransaction(); - #endif - } - */ + #if defined(__AVR__) void spiwrite(uint8_t); volatile uint8_t *dataport, *clkport, *csport, *rsport; @@ -231,11 +195,12 @@ class TFT_ILI9163C : public Adafruit_GFX { uint32_t datapinmask, clkpinmask, cspinmask, rspinmask; #elif defined(__MKL26Z64__) uint8_t _cs,_rs,_rst; + uint8_t _mosi, _sclk; bool _useSPI1; #elif defined(__MK20DX128__) || defined(__MK20DX256__) uint8_t _cs, _rs, _rst; uint8_t pcs_data, pcs_command; - uint8_t _miso, _mosi, _sclk; + uint8_t _mosi, _sclk; void _setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);//graphic Addressing for Teensy