fixed Teensy LC SPI error, now works in SPI1

This commit is contained in:
sumotoy 2015-06-09 17:36:06 +02:00
parent 27e7df560a
commit 9fc39798a9
2 changed files with 69 additions and 63 deletions

View file

@ -21,12 +21,15 @@
_sclk = sclk; _sclk = sclk;
} }
#elif defined(__MKL26Z64__) #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; _cs = cspin;
_rs = dcpin; _rs = dcpin;
_rst = rstpin; _rst = rstpin;
_useSPI1 = useSPI1; _mosi = mosi;
_sclk = sclk;
_useSPI1 = false;
if ((_mosi == 0 || _mosi == 21) && (_sclk == 20)) _useSPI1 = true;
} }
#else #else
TFT_ILI9163C::TFT_ILI9163C(uint8_t cspin,uint8_t dcpin,uint8_t rstpin) : Adafruit_GFX(_TFTWIDTH,_TFTHEIGHT) TFT_ILI9163C::TFT_ILI9163C(uint8_t cspin,uint8_t dcpin,uint8_t rstpin) : Adafruit_GFX(_TFTWIDTH,_TFTHEIGHT)
@ -169,45 +172,60 @@
void TFT_ILI9163C::writecommand(uint8_t c) void TFT_ILI9163C::writecommand(uint8_t c)
{ {
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); SPI.beginTransaction(ILI9163C_SPI);
digitalWriteFast(_rs,LOW); digitalWriteFast(_rs,LOW);
digitalWriteFast(_cs,LOW); digitalWriteFast(_cs,LOW);
if (_useSPI1){
SPI1.transfer(c);
} else {
SPI.transfer(c); SPI.transfer(c);
}
digitalWriteFast(_cs,HIGH); digitalWriteFast(_cs,HIGH);
SPI.endTransaction(); SPI.endTransaction();
} }
}
void TFT_ILI9163C::writedata(uint8_t c) void TFT_ILI9163C::writedata(uint8_t c)
{ {
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); SPI.beginTransaction(ILI9163C_SPI);
digitalWriteFast(_rs,HIGH); digitalWriteFast(_rs,HIGH);
digitalWriteFast(_cs,LOW); digitalWriteFast(_cs,LOW);
if (_useSPI1){
SPI1.transfer(c);
} else {
SPI.transfer(c); SPI.transfer(c);
}
digitalWriteFast(_cs,HIGH); digitalWriteFast(_cs,HIGH);
SPI.endTransaction(); SPI.endTransaction();
} }
}
void TFT_ILI9163C::writedata16(uint16_t d) void TFT_ILI9163C::writedata16(uint16_t d)
{ {
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); SPI.beginTransaction(ILI9163C_SPI);
digitalWriteFast(_rs,HIGH); digitalWriteFast(_rs,HIGH);
digitalWriteFast(_cs,LOW); digitalWriteFast(_cs,LOW);
if (_useSPI1){
SPI1.transfer16(d);
} else {
SPI.transfer16(d); SPI.transfer16(d);
}
digitalWriteFast(_cs,HIGH); digitalWriteFast(_cs,HIGH);
SPI.endTransaction(); SPI.endTransaction();
} }
}
void TFT_ILI9163C::setBitrate(uint32_t n) void TFT_ILI9163C::setBitrate(uint32_t n)
{ {
@ -310,13 +328,36 @@ void TFT_ILI9163C::begin(void)
#elif defined(__MKL26Z64__)//Teensy LC (preliminary) #elif defined(__MKL26Z64__)//Teensy LC (preliminary)
pinMode(_rs, OUTPUT); pinMode(_rs, OUTPUT);
pinMode(_cs, OUTPUT); pinMode(_cs, OUTPUT);
if (_useSPI1){ if (_useSPI1){
ILI9163C_SPI = SPISettings(12000000, MSBFIRST, SPI_MODE0); if ((_mosi == 0 || _mosi == 21) && (_sclk == 20)) {//identify alternate SPI channel 1 (24Mhz)
SPI1.begin();
} else {
ILI9163C_SPI = SPISettings(24000000, MSBFIRST, SPI_MODE0); 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 {
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(); SPI.begin();
_useSPI1 = false; //confirm
} else {
bitSet(_initError,0);
return;
}
if (!SPI.pinIsChipSelect(_cs)) {//ERROR
bitSet(_initError,1);
return;
}
} }
digitalWriteFast(_cs, LOW); digitalWriteFast(_cs, LOW);
#elif defined(__MK20DX128__) || defined(__MK20DX256__) #elif defined(__MK20DX128__) || defined(__MK20DX256__)
@ -325,7 +366,7 @@ void TFT_ILI9163C::begin(void)
SPI.setMOSI(_mosi); SPI.setMOSI(_mosi);
SPI.setSCK(_sclk); SPI.setSCK(_sclk);
} else { } else {
bitSet(_initError,1); bitSet(_initError,0);
return; return;
} }
SPI.begin(); SPI.begin();
@ -335,7 +376,7 @@ void TFT_ILI9163C::begin(void)
} else { } else {
pcs_data = 0; pcs_data = 0;
pcs_command = 0; pcs_command = 0;
bitSet(_initError,0); bitSet(_initError,1);
return; return;
} }
#else//all the rest of possible boards #else//all the rest of possible boards

View file

@ -143,7 +143,7 @@ class TFT_ILI9163C : public Adafruit_GFX {
#if defined(__MK20DX128__) || defined(__MK20DX256__) #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); TFT_ILI9163C(uint8_t cspin,uint8_t dcpin,uint8_t rstpin=255,uint8_t mosi=11,uint8_t sclk=13);
#elif defined(__MKL26Z64__) #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 #else
TFT_ILI9163C(uint8_t cspin,uint8_t dcpin,uint8_t rstpin=255); TFT_ILI9163C(uint8_t cspin,uint8_t dcpin,uint8_t rstpin=255);
#endif #endif
@ -183,42 +183,6 @@ class TFT_ILI9163C : public Adafruit_GFX {
volatile uint8_t _Mactrl_Data;//container for the memory access control data volatile uint8_t _Mactrl_Data;//container for the memory access control data
uint8_t _colorspaceData; 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__) #if defined(__AVR__)
void spiwrite(uint8_t); void spiwrite(uint8_t);
volatile uint8_t *dataport, *clkport, *csport, *rsport; volatile uint8_t *dataport, *clkport, *csport, *rsport;
@ -231,11 +195,12 @@ class TFT_ILI9163C : public Adafruit_GFX {
uint32_t datapinmask, clkpinmask, cspinmask, rspinmask; uint32_t datapinmask, clkpinmask, cspinmask, rspinmask;
#elif defined(__MKL26Z64__) #elif defined(__MKL26Z64__)
uint8_t _cs,_rs,_rst; uint8_t _cs,_rs,_rst;
uint8_t _mosi, _sclk;
bool _useSPI1; bool _useSPI1;
#elif defined(__MK20DX128__) || defined(__MK20DX256__) #elif defined(__MK20DX128__) || defined(__MK20DX256__)
uint8_t _cs, _rs, _rst; uint8_t _cs, _rs, _rst;
uint8_t pcs_data, pcs_command; 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 void _setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);//graphic Addressing for Teensy