SPI based library for the ST7735 LCD controller.

Dependents:   RayCastingEngine RETRO_LCD_PerformanceTest RETRO_loop_test RETRO_RickGame ... more

Files at this revision

API Documentation at this revision

Comitter:
taylorza
Date:
Sun Oct 05 22:24:22 2014 +0000
Parent:
4:88d22437119c
Child:
6:67d3d4a953e0
Commit message:
Fixed initialization routine and added fast SPI handling for the LPC11U24

Changed in this revision

LCD_ST7735.cpp Show annotated file Show diff for this revision Revisions of this file
LCD_ST7735.h Show annotated file Show diff for this revision Revisions of this file
--- a/LCD_ST7735.cpp	Sun Sep 21 07:01:15 2014 +0000
+++ b/LCD_ST7735.cpp	Sun Oct 05 22:24:22 2014 +0000
@@ -16,7 +16,7 @@
         _spi(mosiPin, misoPin, clkPin)        
 {        
     _spi.format(8, 3);
-    _spi.frequency(15000000);
+    _spi.frequency(8000000);
     
     initDisplay();
     clearScreen();
@@ -26,7 +26,7 @@
 
 void LCD_ST7735::setOrientation(Orientation orientation, bool flip)
 {
-    const static uint8_t my = 0x80;
+    const static uint8_t my = 0x80; 
     const static uint8_t mx = 0x40;
     const static uint8_t mv = 0x20;
     
@@ -443,11 +443,11 @@
 {
     reset();
     
-    write(CMD_SLPOUT);
+    writeCommand(CMD_SLPOUT);
     
     write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d}, 3);
-    write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d}, 3);
-    write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d, 0x01, 0x2c, 0x2d}, 6);
+    write(CMD_FRMCTR2, (uint8_t[]){0x01, 0x2c, 0x2d}, 3);
+    write(CMD_FRMCTR3, (uint8_t[]){0x01, 0x2c, 0x2d, 0x01, 0x2c, 0x2d}, 6);
     
     write(CMD_INVCTR, (uint8_t[]){0x07}, 1);
     
@@ -498,7 +498,7 @@
     write(CMD_COLMOD, (uint8_t[]){0x05}, 1);            
     
     // Enable display
-    write(CMD_DISPON);            
+    writeCommand(CMD_DISPON);            
     
     setBacklight(true);
 }
@@ -530,78 +530,83 @@
     uint8_t y2h = (uint8_t)(y2 >> 8);
     write(CMD_RASET, (uint8_t[]){y1h, y1l, y2h, y2l}, 4);    
 }
-
-void LCD_ST7735::write(uint8_t cmd)
+        
+void LCD_ST7735::writeCommand(uint8_t cmd)
 {
-    write(cmd, NULL, 0);
+    _cs = 0;
+    _ds = 0;    
+    _spi.fastWrite(cmd);
+    _spi.waitWhileBusy();
+    _spi.clearRx();
+    _cs = 1;
 }
 
 void LCD_ST7735::write(uint8_t cmd, uint8_t data[], int dataLen)
 {
-    _ds = 0;
     _cs = 0;
-    _spi.write(cmd);   
+    _ds = 0;    
+    _spi.fastWrite(cmd);
+    _spi.waitWhileBusy();
     if (data != NULL & dataLen > 0)
     {
         _ds = 1;        
         for(int i = 0; i < dataLen; ++i)
         {            
-            _spi.write(data[i]);
+            _spi.fastWrite(data[i]); 
         }        
+        _spi.waitWhileBusy();
         _ds = 0; 
     }    
-    _cs = 1;    
+    _spi.clearRx();
+    _cs = 1;
 }
 
 void LCD_ST7735::write(uint8_t cmd, uint16_t data)
 {
-    _ds = 0;
-    _cs = 0;
-    _spi.write(cmd);   
-    _ds = 1;        
-    _spi.write(data >> 8);
-    _spi.write(data);
-    _ds = 0; 
+    _cs = 0; 
+    _ds = 0;    
+    _spi.fastWrite(cmd);       
+    _spi.waitWhileBusy();
+    _ds = 1;            
+    _spi.fastWrite(data >> 8);
+    _spi.fastWrite(data);
+    _spi.waitWhileBusy();
+    _spi.clearRx();
+    _ds = 0;     
     _cs = 1;
 }
 
-void LCD_ST7735::writeData(uint8_t data)
-{
-    _ds = 1;
-    _cs = 0;        
-    _spi.write(data);
-    _ds = 0; 
-    _cs = 1; 
-}
-
 void LCD_ST7735::beginBatchCommand(uint8_t cmd)
 {
-    _ds = 0;    
     _cs = 0;
-    _spi.write(cmd);   
+    _ds = 0;        
+    _spi.fastWrite(cmd);   
+    _spi.waitWhileBusy();
     _ds = 1;
 }
 
 void LCD_ST7735::writeBatchData(uint8_t data)
 {
-    _spi.write(data);
+    _spi.fastWrite(data);
 }
 
 void LCD_ST7735::writeBatchData(uint8_t dataHigh, uint8_t dataLow)
 {
-    _spi.write(dataHigh);
-    _spi.write(dataLow);
+    _spi.fastWrite(dataHigh);
+    _spi.fastWrite(dataLow);
 }
 
 
 void LCD_ST7735::writeBatchData(uint16_t data)
 {
-    _spi.write(data >> 8);
-    _spi.write(data); 
+    _spi.fastWrite(data >> 8);
+    _spi.fastWrite(data); 
 }
 
 void LCD_ST7735::endBatchCommand()
 {
+    _spi.waitWhileBusy();
+    _spi.clearRx();
     _ds = 0; 
     _cs = 1; 
 }
--- a/LCD_ST7735.h	Sun Sep 21 07:01:15 2014 +0000
+++ b/LCD_ST7735.h	Sun Oct 05 22:24:22 2014 +0000
@@ -200,10 +200,11 @@
     private:
         void initDisplay();
         void reset();
-        void write(uint8_t cmd);        
+        
+        void writeCommand(uint8_t cmd);
         void write(uint8_t cmd, uint8_t data[], int dataLen);
         void write(uint8_t cmd, uint16_t data);        
-        void writeData(uint8_t data);        
+        
         void beginBatchCommand(uint8_t cmd);
         void writeBatchData(uint8_t data);
         void writeBatchData(uint8_t dataHigh, uint8_t dataLow);
@@ -223,12 +224,50 @@
         uint8_t    _backgroundColorHigh;
         uint8_t    _backgroundColorLow;
         
+    private:
+        class LCDSPI : public SPI
+        {
+            public:
+                LCDSPI(PinName mosi, PinName miso, PinName sclk) :
+                    SPI(mosi, miso, sclk)
+                {
+                }
+                
+                void waitWhileBusy()
+                {
+                    #ifdef TARGET_LPC11U24
+                    while (((_spi.spi->SR) & 0x10) != 0);
+                    #endif
+                }
+                
+                void fastWrite(uint8_t data)
+                {                    
+                    #ifdef TARGET_LPC11U24
+                        while (((_spi.spi->SR) & 0x01) == 0);
+                        _spi.spi->DR = data;
+                    #else
+                        SPI::write(data);
+                    #endif 
+                }       
+                
+                void clearRx()
+                {
+                    #ifdef TARGET_LPC11U24
+                        while (((_spi.spi->SR) & 0x14) != 0)
+                        {
+                            while (((_spi.spi->SR) & 0x04) == 0);
+                            int data = _spi.spi->DR;
+                        }                                         
+                    #endif  
+                }            
+        };
+        
     private:        
         DigitalOut  _backlight;
         DigitalOut  _reset;
         DigitalOut  _ds;
         DigitalOut  _cs;
-        SPI         _spi;
+        LCDSPI      _spi;
         
     private:
         static const uint8_t CMD_SLPOUT     = 0x11;
@@ -255,7 +294,7 @@
         static const uint8_t CMD_GAMCTRP1   = 0xe0;
         static const uint8_t CMD_GAMCTRN1   = 0xe1;
         
-        static const uint8_t CMD_EXTCTRL    = 0xf0;
+        static const uint8_t CMD_EXTCTRL    = 0xf0;                
 };
 
 #endif // __LCD_ST7735__