This is a simple library for the STMPE610 touchscreen controller used by the Adafruit 2.8" TFT LCD shield

Dependents:   EasyCAT_LAB

Revision:
0:b5211f22867b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SPI_STMPE610.cpp	Wed May 26 19:08:27 2021 +0000
@@ -0,0 +1,197 @@
+//********************************************************************************************    
+//                                                                                           *
+// This software is distributed as an example, "AS IS", in the hope that it could            *
+// be useful, WITHOUT ANY WARRANTY of any kind, express or implied, included, but            *
+// not limited,  to the warranties of merchantability, fitness for a particular              *
+// purpose, and non infringiment. In no event shall the authors be liable for any            *    
+// claim, damages or other liability, arising from, or in connection with this software.     *
+//                                                                                           *
+//********************************************************************************************/ 
+
+#include "SPI_STMPE610.h"
+
+
+#define REG_SYS_CTRL1       0x03    // reset control
+
+#define REG_SYS_CTRL2       0x04    // clock control 
+
+#define REG_SPI_CFG         0x08    // SPI interface configuration
+
+#define REG_CFG             0x41    // touchscreen controller configuration
+                                    //
+#define CFG_1SAMPLE         0x00    //
+#define CFG_2SAMPLE         0x40    //
+#define CFG_4SAMPLE         0x80    //
+#define CFG_8SAMPLE         0xC0    //
+                                    //
+#define CFG_DELAY_10US      0x00    //
+#define CFG_DELAY_50US      0x08    //
+#define CFG_DELAY_100US     0x10    //
+#define CFG_DELAY_500US     0x18    //
+#define CFG_DELAY_1MS       0x20    //
+#define CFG_DELAY_5MS       0x28    //
+#define CFG_DELAY_10MS      0x30    //
+#define CFG_DELAY_50MS      0x38    //
+                                    //
+#define CFG_SETTLE_10US     0x00    //
+#define CFG_SETTLE_100US    0x01    //
+#define CFG_SETTLE_500US    0x02    //
+#define CFG_SETTLE_1MS      0x03    //
+#define CFG_SETTLE_5MS      0x04    //
+#define CFG_SETTLE_10MS     0x05    //
+#define CFG_SETTLE_50MS     0x06    //
+#define CFG_SETTLE_100MS    0x07    //
+
+#define REG_CTRL            0x40    // touchscreen controller control
+                                    //
+#define CTRL_EN             0x01    //
+#define CTRL_XY             0x02    //
+
+#define REG_FIFO_SIZE       0x4C    // FIFO size 
+
+#define REG_FIFO_STA        0x4B    // FIFO control/status
+
+#define REG_DATA_X          0x4D    // X point value
+#define REG_DATA_Y          0x4F    // Y point value
+
+                                    
+
+#define X_OFFSET    180
+#define X_GAIN      0.090
+
+#define Y_OFFSET    207
+#define Y_GAIN      0.066
+
+
+SPI_STMPE610::SPI_STMPE610(PinName mosi, PinName miso, PinName sclk, PinName cs) :
+                           m_spi(mosi, miso, sclk), m_cs(cs, 1) 
+{
+
+    m_spi.frequency(1000000) ;                      // SPI mode 0 - 8 bit - 1MHz
+    m_spi.format(8, 0);                             //
+
+    Write8(REG_SYS_CTRL1, 0x02) ;                   // soft reset
+    #if (MBED_MAJOR_VERSION != 2)                   //
+        ThisThread::sleep_for(10ms);                //
+    #else                                           //
+        wait_ms(10);                                //
+    #endif                                          //
+ 
+    Write8(REG_SYS_CTRL2, 0x00) ;                   // turn on clocks
+    
+    Write8(REG_SPI_CFG, 0x04);                      // autoincrement on
+    
+                                                    // touchscreen parameters
+    Write8(REG_CFG, CFG_8SAMPLE | CFG_DELAY_1MS | CFG_SETTLE_5MS ) ;
+        
+    Write8(REG_CTRL, CTRL_XY | CTRL_EN);            // enable the touchscreen
+                                                    // we don't use pressure reporting        
+}
+
+
+                                            //--- write an 8 bits register -----
+                                            //
+void SPI_STMPE610::Write8(uint8_t Addr, uint8_t Data)
+{
+    m_cs = 0;
+    m_spi.write(0x7F & Addr);
+    m_spi.write(Data);    
+    m_cs = 1;
+}
+
+
+                                            //--- read an 8 bits register ------ 
+                                            //
+uint8_t SPI_STMPE610::Read8(uint8_t Addr)
+{
+    uint8_t Data;
+    
+    m_cs = 0;
+    m_spi.write(0x80 | Addr);
+    Data = m_spi.write(0x00);    
+    m_cs = 1;   
+
+    return(Data);
+}
+
+                                            //--- read a 16 bits register ------ 
+                                            //
+uint16_t SPI_STMPE610::Read16(uint8_t Addr)
+{
+    uint16_t Data;
+    
+    m_cs = 0;
+    m_spi.write(0x80 | Addr);
+    Data = m_spi.write(0x80); 
+    Data = (Data << 8) & 0xFF00;   
+    Data |= m_spi.write(0x00);     
+    m_cs = 1;   
+
+    return(Data);    
+}
+
+
+                                            //--- get a raw point -------------- 
+                                            //
+bool SPI_STMPE610::GetRawPoint(uint16_t *X, uint16_t *Y)
+{                                                
+    if(Read8(REG_FIFO_SIZE))                // if some data is available in the fifo 
+    {                                    
+        *Y = Read16(REG_DATA_X);            // read X value
+        *X = Read16(REG_DATA_Y);            // read Y value
+                                            // X and Y are exchanged because the display is horizontal
+                                          
+        Write8(REG_FIFO_STA, 0x01);         // reset the fifo
+        Write8(REG_FIFO_STA, 0x00);         //  "       "
+                                          
+        //printf("X raw %d\n", *X);           
+        //printf("Y raw %d\n\n", *Y);       
+                                         
+        return true;                        // exit with a valid point
+    }  
+     
+    else                                   
+    {                                       
+        return false;                       // exit with no valid point
+    }                                       
+}
+
+
+                                            //--- get a normalized point ------- 
+                                            //
+bool SPI_STMPE610::GetPoint(uint16_t *X, uint16_t *Y)
+{
+    uint16_t RawX, RawY;
+    
+    if(GetRawPoint (&RawX, &RawY))          // if a point is available
+    {                    
+        RawX = RawX - X_OFFSET;             // remove the offset 
+        if ((int16_t)RawX < 0)              //
+            RawX = 0;                       //
+                                            //
+        RawY = RawY - Y_OFFSET;             //
+        if ((int16_t)RawY < 0)              //
+            RawY = 0;                       //                           
+     
+        *X = X_GAIN * (float)RawX;          // apply the gain factor
+        *Y = Y_GAIN * (float)RawY;          //
+        
+        *Y = 240 - *Y;                      // we want the 0,0 point in the upper left corner
+        if ((int16_t)*Y < 0)                // so Y must be inverted
+            *Y = 0;                         //
+        
+        //printf("X %d\n", *X);
+        //printf("Y %d\n\n", *Y);  
+                      
+        return true;                        // exit with a valid point
+    }
+        
+    else
+    {
+        return false;                       // exit with no valid point
+    }           
+}
+
+ 
+
+