Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of SPI_TFT_ILI9341 by
Diff: SPI_TFT_ILI9341.cpp
- Revision:
- 9:1d3d41128693
- Parent:
- 8:a9d849c3dad0
- Child:
- 10:4b70a6915f06
diff -r a9d849c3dad0 -r 1d3d41128693 SPI_TFT_ILI9341.cpp
--- 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
