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 Peter Drescher

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