Forked from Peter Drescher lib, using always 16bit spi, init values for chinese red pcb, added read cmds and some mess here and there
Fork of SPI_TFT_ILI9341 by
Diff: SPI_TFT_ILI9341.cpp
- Revision:
- 9:1d3d41128693
- Parent:
- 8:a9d849c3dad0
- Child:
- 10:4b70a6915f06
--- a/SPI_TFT_ILI9341.cpp Wed Apr 23 18:20:33 2014 +0000 +++ b/SPI_TFT_ILI9341.cpp Tue Aug 19 21:16:56 2014 +0000 @@ -31,6 +31,8 @@ orientation = 0; char_x = 0; _reset = 0; + _spi.format(16,0); // 16 bit spi mode 0 + _spi.frequency(10000000); // 10 Mhz SPI clock tft_reset(); } @@ -72,123 +74,89 @@ // write command to tft register - void SPI_TFT_ILI9341::wr_cmd(unsigned char cmd) { _dc = 0; // _cs = 0; - _spi.write(cmd); // mbed lib + _spi.write(cmd); // write 16bit, 00 (NOP cmd) then 8bit cmd // _cs = 1; } - - +// write 8bit data/parameter void SPI_TFT_ILI9341::wr_8(unsigned char value) { _dc = 1; // _cs = 0; + _spi.format(8,0); // changing format takes time but wr_8 is used only for init and set orientation _spi.write(value); // mbed lib + _spi.format(16,0); // _cs = 1; } +// write 16bit data/parameter void SPI_TFT_ILI9341::wr_16(unsigned int value) { _dc = 1; // _cs = 0; - // #if defined TARGET_KL25Z // 8 Bit SPI - _spi.write(value >> 8); - _spi.write(value & 0xff); -// #else - // _spi.format(16,0); // switch to 16 bit Mode 3, but it takes some time - // _spi.write(value); // mbed lib -// _spi.format(8,0); -// #endif + _spi.write(value); // _cs = 1; } // the ILI9341 can read - +// for cmd that returs 8bits (dummy cycle not needed) char SPI_TFT_ILI9341::wr_cmd_rd8(unsigned char cmd) { - char r; + unsigned char r; _dc = 0; // _cs = 0; _spi.write(cmd); // mbed lib _dc = 1; // fixed - r = _spi.write(0); + r = _spi.write(0) >> 8; // _cs = 1; return(r); } -// read 24 bit +// for cmd that return 24bits (need a dummy cycle after cmd) int SPI_TFT_ILI9341::wr_cmd_rd24(unsigned char cmd) { - int d = 0; - char r; + unsigned int d = 0; + unsigned short r; _dc = 0; // _cs = 0; -#if defined TARGET_NXP - d = cmd; - d = d << 1; - _spi.format(9,0); // we have to add a dummy clock cycle - _spi.write(d); - _spi.format(8,0); -#else _spi.write(cmd); -#endif _dc = 1; - r = _spi.write(0); + r = _spi.write(0); // we get only 15bit valid, first bit was the dummy cycle d = r; r = _spi.write(0); - d = (d << 8) | r; - r = _spi.write(0); - d = (d << 8) | r; -#if !defined TARGET_NXP - // workaraound for not 9bit, get 1 bit more - r = _spi.write(0); - d = (d << 1) | (r>>7); - // we clocked 7 more bit so ILI waiting for 8th, resetting spi + d = (d << 16) | r; + d = d >> 7; + // we clocked 7 more bit so ILI waiting for 8th, we need to rest spi _cs = 1; _cs = 0; -#endif // _cs = 0; return(d); } -// read 32 bit +// for cmd that return 32bits (need a dummy cycle after cmd) int SPI_TFT_ILI9341::wr_cmd_rd32(unsigned char cmd) { - int d; - char r; + unsigned int d = 0; + unsigned short r; _dc = 0; // _cs = 0; -#if defined TARGET_NXP - d = cmd; - d = d << 1; - _spi.format(9,0); // we have to add a dummy clock cycle - _spi.write(d); - _spi.format(8,0); -#else _spi.write(cmd); -#endif _dc = 1; - r = _spi.write(0); + r = _spi.write(0); // we get only 15bit valid, first bit was the dummy cycle d = r; r = _spi.write(0); - d = (d << 8) | r; - r = _spi.write(0); - d = (d << 8) | r; + d = (d << 16) | r; r = _spi.write(0); - d = (d << 8) | r; -#if !defined TARGET_NXP - // workaraound for not 9bit, get 1 bit more - r = _spi.write(0); - d = (d << 1) | (r>>7); - // we clocked 7 more bit so ILI waiting for 8th, resetting spi + d = (d << 1) | (r >> 15); + // we clocked 15 more bit so ILI waiting for 16th, we need to rest spi _cs = 1; _cs = 0; -#endif // _cs = 1; return(d); } +// undocumented cmd 0xD9 found in some code example char SPI_TFT_ILI9341::Read_Register(char Addr, char xParameter) { char data=0; @@ -219,9 +187,10 @@ // broken on 9341 int SPI_TFT_ILI9341::Read_ID4(void){ int r; - r = wr_cmd_rd24(0xD3); + r = wr_cmd_rd24(0xD3); // BF for ili9481, give a try return(r); } +// read status register int SPI_TFT_ILI9341::Read_STS(void){ int r; r = wr_cmd_rd32(0x09); @@ -231,8 +200,8 @@ // HW reset void SPI_TFT_ILI9341::tft_reset() { - _spi.format(8,0); // 8 bit spi mode 3 - _spi.frequency(10000000); // 10 Mhz SPI clock +// _spi.format(8,0); // 8 bit spi mode 0 +// _spi.frequency(10000000); // 10 Mhz SPI clock _cs = 1; // cs high _dc = 1; // dc high @@ -250,7 +219,7 @@ } - // init for chinese 2.2" red PCB 1580005661C + // init for 2.2" red PCB 1580005661C with Tianma TM022HDH26 display void SPI_TFT_ILI9341::tft_init_redPCBtm22() { /* Start Initial Sequence ----------------------------------------------------*/ @@ -374,7 +343,7 @@ void SPI_TFT_ILI9341::pixel(int x, int y, int color) { wr_cmd(0x2A); - wr_16(x); // set only start column, end colum have been set by windows funct + wr_16(x); // set only start column, end colum set by window() funct wr_cmd(0x2B); // set only start page wr_16(y); wr_cmd(0x2C); // send pixel