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;
}
#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

View file

@ -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