FT6206 Library for Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch

Dependents:   ArchPro_TFT ATT_AWS_IoT_demo_v06 ArchPro_TFT TermProject

Committer:
JackB
Date:
Tue Apr 28 21:12:26 2015 +0000
Revision:
11:9e1fc2233b0e
Parent:
10:535d2140db2c
InterruptIn used, when touched

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JackB 4:b9ff3c020e7f 1 /*
JackB 4:b9ff3c020e7f 2 Copyright (c) 2015 Jack Berkhout
JackB 0:d146e986a07f 3
JackB 4:b9ff3c020e7f 4 Permission is hereby granted, free of charge, to any person obtaining a copy
JackB 4:b9ff3c020e7f 5 of this software and associated documentation files (the "Software"), to deal
JackB 4:b9ff3c020e7f 6 in the Software without restriction, including without limitation the rights
JackB 4:b9ff3c020e7f 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
JackB 4:b9ff3c020e7f 8 copies of the Software, and to permit persons to whom the Software is
JackB 4:b9ff3c020e7f 9 furnished to do so, subject to the following conditions:
JackB 4:b9ff3c020e7f 10
JackB 4:b9ff3c020e7f 11 The above copyright notice and this permission notice shall be included in
JackB 4:b9ff3c020e7f 12 all copies or substantial portions of the Software.
JackB 4:b9ff3c020e7f 13
JackB 4:b9ff3c020e7f 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
JackB 4:b9ff3c020e7f 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
JackB 4:b9ff3c020e7f 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
JackB 4:b9ff3c020e7f 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
JackB 4:b9ff3c020e7f 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
JackB 4:b9ff3c020e7f 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
JackB 4:b9ff3c020e7f 20 THE SOFTWARE.
JackB 0:d146e986a07f 21
JackB 4:b9ff3c020e7f 22 This is a library for the Adafruit Capacitive Touch Screens
JackB 4:b9ff3c020e7f 23 ----> http://www.adafruit.com/products/1947
JackB 4:b9ff3c020e7f 24 This chipset uses I2C to communicate
JackB 4:b9ff3c020e7f 25
JackB 11:9e1fc2233b0e 26 Based on code by Limor Fried/Ladyada for Adafruit Industries.
JackB 11:9e1fc2233b0e 27 MIT license, all text above must be included in any redistribution.
JackB 4:b9ff3c020e7f 28
JackB 4:b9ff3c020e7f 29 On the shield, these jumpers were bridged:
JackB 4:b9ff3c020e7f 30 Int - #7 (default)
JackB 4:b9ff3c020e7f 31 SCK - 13 (default)
JackB 4:b9ff3c020e7f 32 SO - 12 (default)
JackB 4:b9ff3c020e7f 33 SI - 11
JackB 4:b9ff3c020e7f 34 SCL - SCL
JackB 4:b9ff3c020e7f 35 SDA - SDA
JackB 4:b9ff3c020e7f 36
JackB 2:35e21af6733c 37 Usage:
JackB 1:43274ec89d1a 38
JackB 3:8e16a8987166 39 #include "mbed.h"
JackB 3:8e16a8987166 40 #include "SPI_TFT_ILI9341.h"
JackB 3:8e16a8987166 41 #include "FT6206.h"
JackB 3:8e16a8987166 42 #include "Arial12x12.h"
JackB 3:8e16a8987166 43
JackB 3:8e16a8987166 44 #define PIN_XP A3
JackB 3:8e16a8987166 45 #define PIN_XM A1
JackB 3:8e16a8987166 46 #define PIN_YP A2
JackB 3:8e16a8987166 47 #define PIN_YM A0
JackB 3:8e16a8987166 48 #define PIN_SCLK D13
JackB 3:8e16a8987166 49 #define PIN_MISO D12
JackB 3:8e16a8987166 50 #define PIN_MOSI D11
JackB 3:8e16a8987166 51 #define PIN_CS_TFT D10 // chip select pin
JackB 3:8e16a8987166 52 #define PIN_DC_TFT D9 // data/command select pin.
JackB 3:8e16a8987166 53 #define PIN_RESET_TFT D8
JackB 3:8e16a8987166 54 //#define PIN_BL_TFT D7
JackB 3:8e16a8987166 55 #define PIN_CS_SD D4
JackB 3:8e16a8987166 56
JackB 3:8e16a8987166 57 #define PORTRAIT 0
JackB 3:8e16a8987166 58 #define LANDSCAPE 1
JackB 3:8e16a8987166 59
JackB 3:8e16a8987166 60 #define PIN_SCL_FT6206 P0_28
JackB 3:8e16a8987166 61 #define PIN_SDA_FT6206 P0_27
JackB 3:8e16a8987166 62 #define PIN_INT_FT6206 D7
JackB 3:8e16a8987166 63
JackB 3:8e16a8987166 64 SPI_TFT_ILI9341 TFT(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TFT, PIN_RESET_TFT, PIN_DC_TFT, "TFT"); // mosi, miso, sclk, cs, reset, dc
JackB 3:8e16a8987166 65 FT6206 FT6206(PIN_SDA_FT6206, PIN_SCL_FT6206, PIN_INT_FT6206); // sda, scl, int
JackB 3:8e16a8987166 66
JackB 3:8e16a8987166 67 int main()
JackB 3:8e16a8987166 68 {
JackB 10:535d2140db2c 69 //Configure the display driver
JackB 10:535d2140db2c 70 TFT.claim(stdout);
JackB 10:535d2140db2c 71 TFT.background(Black);
JackB 10:535d2140db2c 72 TFT.foreground(White);
JackB 10:535d2140db2c 73 TFT.set_orientation(LANDSCAPE);
JackB 10:535d2140db2c 74 TFT.cls();
JackB 10:535d2140db2c 75
JackB 10:535d2140db2c 76 //Print a welcome message
JackB 10:535d2140db2c 77 TFT.set_font((unsigned char*) Arial12x12);
JackB 10:535d2140db2c 78 TFT.locate(0,0);
JackB 10:535d2140db2c 79 TFT.printf("Hello mbed!\n");
JackB 10:535d2140db2c 80
JackB 1:43274ec89d1a 81 while(1) {
JackB 10:535d2140db2c 82 int X1, Y1, X2, Y2;
JackB 7:3896a0daed43 83 TS_Point p;
JackB 7:3896a0daed43 84 if (FT6206.getTouchPoint(p)) {
JackB 8:b6e95d327cd3 85 X1 = X2;
JackB 8:b6e95d327cd3 86 Y1 = Y2;
JackB 8:b6e95d327cd3 87 X2 = p.x;
JackB 8:b6e95d327cd3 88 Y2 = p.y;
JackB 9:fff166330146 89 TFT.locate(0,12);
JackB 9:fff166330146 90 printf("Touch %3d %3d\n", p.x, p.y);
JackB 8:b6e95d327cd3 91 if ((X1 > 0) && (Y1 > 0) && (X2 > 0) && (Y2 > 0)) {
JackB 8:b6e95d327cd3 92 TFT.line(X1, Y1, X2, Y2, RGB(255,128,255));
JackB 8:b6e95d327cd3 93 }
JackB 1:43274ec89d1a 94 }
JackB 1:43274ec89d1a 95 }
JackB 3:8e16a8987166 96 }
JackB 1:43274ec89d1a 97 */
JackB 0:d146e986a07f 98
JackB 0:d146e986a07f 99 #include "FT6206.h"
JackB 0:d146e986a07f 100
JackB 0:d146e986a07f 101 FT6206::FT6206(PinName sda, PinName scl, PinName interrupt) : m_i2c(sda, scl), m_interrupt(interrupt)
JackB 0:d146e986a07f 102 {
JackB 0:d146e986a07f 103 m_addr = (FT6206_ADDR << 1);
JackB 0:d146e986a07f 104 m_i2c.frequency(FT6206_I2C_FREQUENCY);
JackB 11:9e1fc2233b0e 105
JackB 0:d146e986a07f 106 m_interrupt.mode(PullUp);
JackB 11:9e1fc2233b0e 107 m_interrupt.enable_irq();
JackB 11:9e1fc2233b0e 108 m_interrupt.fall(this, &FT6206::checkDataReceived);
JackB 11:9e1fc2233b0e 109
JackB 10:535d2140db2c 110 init();
JackB 11:9e1fc2233b0e 111
JackB 11:9e1fc2233b0e 112 // tick.attach(this, &FT6206::checkDataReceived, 0.00001); // Every 10 us id data was received
JackB 11:9e1fc2233b0e 113
JackB 0:d146e986a07f 114 }
JackB 0:d146e986a07f 115
JackB 5:652684757b6b 116 FT6206::~FT6206()
JackB 5:652684757b6b 117 {
JackB 5:652684757b6b 118
JackB 5:652684757b6b 119 }
JackB 0:d146e986a07f 120
JackB 0:d146e986a07f 121 /**************************************************************************/
JackB 0:d146e986a07f 122 /*!
JackB 0:d146e986a07f 123 @brief Setups the HW
JackB 0:d146e986a07f 124 */
JackB 0:d146e986a07f 125 /**************************************************************************/
JackB 5:652684757b6b 126 bool FT6206::init(uint8_t threshhold) {
JackB 0:d146e986a07f 127 // change threshhold to be higher/lower
JackB 5:652684757b6b 128 writeRegister8(FT6206_REG_THRESHHOLD, FT6206_DEFAULT_THRESSHOLD);
JackB 11:9e1fc2233b0e 129 // writeRegister8(FT6206_REG_POINTRATE, 80);
JackB 0:d146e986a07f 130
JackB 0:d146e986a07f 131 if (readRegister8(FT6206_REG_VENDID) != 17)
JackB 0:d146e986a07f 132 return false;
JackB 0:d146e986a07f 133
JackB 0:d146e986a07f 134 if (readRegister8(FT6206_REG_CHIPID) != 6)
JackB 0:d146e986a07f 135 return false;
JackB 11:9e1fc2233b0e 136
JackB 11:9e1fc2233b0e 137 // printf("Vend ID: %d\n", readRegister8(FT6206_REG_VENDID));
JackB 11:9e1fc2233b0e 138 // printf("Chip ID: %d\n", readRegister8(FT6206_REG_CHIPID));
JackB 11:9e1fc2233b0e 139 // printf("Firm V: %d\n", readRegister8(FT6206_REG_FIRMVERS));
JackB 11:9e1fc2233b0e 140 // printf("Rate Hz: %d\n", readRegister8(FT6206_REG_POINTRATE));
JackB 11:9e1fc2233b0e 141 // printf("Thresh: %d\n", readRegister8(FT6206_REG_THRESHHOLD));
JackB 11:9e1fc2233b0e 142
JackB 0:d146e986a07f 143 // dump all registers
JackB 0:d146e986a07f 144 /*
JackB 0:d146e986a07f 145 for (int16_t i=0; i<0x20; i++) {
JackB 0:d146e986a07f 146 printf("I2C $%02x = 0x %02x\n", i, readRegister8(i));
JackB 0:d146e986a07f 147 }
JackB 0:d146e986a07f 148 */
JackB 0:d146e986a07f 149 return true;
JackB 0:d146e986a07f 150 }
JackB 0:d146e986a07f 151
JackB 0:d146e986a07f 152 bool FT6206::touched(void) {
JackB 0:d146e986a07f 153 uint8_t n = readRegister8(FT6206_REG_NUMTOUCHES);
JackB 0:d146e986a07f 154 if ((n == 1) || (n == 2))
JackB 0:d146e986a07f 155 return true;
JackB 0:d146e986a07f 156 return false;
JackB 0:d146e986a07f 157 }
JackB 0:d146e986a07f 158
JackB 11:9e1fc2233b0e 159 void FT6206::checkDataReceived(void) {
JackB 11:9e1fc2233b0e 160 // InterruptIn pin used
JackB 11:9e1fc2233b0e 161 // // Runs every 0.00001 Sec. in Ticker
JackB 11:9e1fc2233b0e 162 // if (dataReceived()) {
JackB 11:9e1fc2233b0e 163 DataReceived = true;
JackB 11:9e1fc2233b0e 164 // }
JackB 11:9e1fc2233b0e 165 }
JackB 11:9e1fc2233b0e 166
JackB 11:9e1fc2233b0e 167 bool FT6206::getDataReceived(void) {
JackB 11:9e1fc2233b0e 168 bool _DataReceived = DataReceived;
JackB 11:9e1fc2233b0e 169 DataReceived = false;
JackB 11:9e1fc2233b0e 170 return _DataReceived;
JackB 11:9e1fc2233b0e 171 }
JackB 11:9e1fc2233b0e 172
JackB 11:9e1fc2233b0e 173 void FT6206::waitScreenTapped(void) {
JackB 11:9e1fc2233b0e 174 DataReceived = false;
JackB 11:9e1fc2233b0e 175 while (!getDataReceived()) {
JackB 11:9e1fc2233b0e 176 wait(0.01);
JackB 11:9e1fc2233b0e 177 }
JackB 11:9e1fc2233b0e 178 }
JackB 11:9e1fc2233b0e 179
JackB 6:eb7a74dc809f 180 bool FT6206::getTouchPoint(TS_Point &p) {
JackB 11:9e1fc2233b0e 181 // if (touched()) {
JackB 11:9e1fc2233b0e 182 // if (dataReceived()) {
JackB 11:9e1fc2233b0e 183 if (getDataReceived()) {
JackB 6:eb7a74dc809f 184 // Retrieve a point
JackB 6:eb7a74dc809f 185 p = getPoint();
JackB 6:eb7a74dc809f 186 return true;
JackB 6:eb7a74dc809f 187 }
JackB 11:9e1fc2233b0e 188 p = clearPoint();
JackB 6:eb7a74dc809f 189 return false;
JackB 6:eb7a74dc809f 190 }
JackB 6:eb7a74dc809f 191
JackB 0:d146e986a07f 192 /*****************************/
JackB 0:d146e986a07f 193
JackB 0:d146e986a07f 194 void FT6206::readData(uint16_t *x, uint16_t *y) {
JackB 0:d146e986a07f 195 char i2cdat[16];
JackB 0:d146e986a07f 196
JackB 0:d146e986a07f 197 m_i2c.write(m_addr, 0x00, 1);
JackB 0:d146e986a07f 198 m_i2c.read(m_addr, i2cdat, 16);
JackB 0:d146e986a07f 199
JackB 0:d146e986a07f 200 /*
JackB 0:d146e986a07f 201 for (int16_t i=0; i<0x20; i++) {
JackB 0:d146e986a07f 202 printf("I2C %02x = %02x\n", i, i2cdat[i]);;
JackB 0:d146e986a07f 203 }
JackB 0:d146e986a07f 204 */
JackB 0:d146e986a07f 205
JackB 0:d146e986a07f 206 touches = i2cdat[0x02];
JackB 0:d146e986a07f 207
JackB 0:d146e986a07f 208 // printf("touches: %d\n", touches);
JackB 0:d146e986a07f 209 if (touches > 2) {
JackB 0:d146e986a07f 210 touches = 0;
JackB 0:d146e986a07f 211 *x = *y = 0;
JackB 0:d146e986a07f 212 }
JackB 0:d146e986a07f 213 if (touches == 0) {
JackB 0:d146e986a07f 214 *x = *y = 0;
JackB 0:d146e986a07f 215 return;
JackB 0:d146e986a07f 216 }
JackB 0:d146e986a07f 217
JackB 0:d146e986a07f 218 /*
JackB 0:d146e986a07f 219 if (touches == 2) Serial.print('2');
JackB 0:d146e986a07f 220 for (uint8_t i=0; i<16; i++) {
JackB 0:d146e986a07f 221 printf("%02x ", i2cdat[i]);
JackB 0:d146e986a07f 222 }
JackB 0:d146e986a07f 223 printf("\n");
JackB 0:d146e986a07f 224 */
JackB 0:d146e986a07f 225
JackB 0:d146e986a07f 226 /*
JackB 0:d146e986a07f 227 printf("\n");
JackB 0:d146e986a07f 228 if (i2cdat[0x01] != 0x00) {
JackB 0:d146e986a07f 229 printf("Gesture #%d\n", i2cdat[0x01]);
JackB 0:d146e986a07f 230 }
JackB 0:d146e986a07f 231 */
JackB 0:d146e986a07f 232
JackB 0:d146e986a07f 233 //printf("# Touches: %d", touches);
JackB 0:d146e986a07f 234 for (uint8_t i=0; i<2; i++) {
JackB 0:d146e986a07f 235 touchY[i] = i2cdat[0x03 + i*6] & 0x0F;
JackB 0:d146e986a07f 236 touchY[i] <<= 8;
JackB 0:d146e986a07f 237 touchY[i] |= i2cdat[0x04 + i*6];
JackB 0:d146e986a07f 238 touchX[i] = i2cdat[0x05 + i*6] & 0x0F;
JackB 0:d146e986a07f 239 touchX[i] <<= 8;
JackB 0:d146e986a07f 240 touchX[i] |= i2cdat[0x06 + i*6];
JackB 0:d146e986a07f 241 touchID[i] = i2cdat[0x05 + i*6] >> 4;
JackB 0:d146e986a07f 242 }
JackB 0:d146e986a07f 243 /*
JackB 0:d146e986a07f 244 for (uint8_t i=0; i<touches; i++) {
JackB 0:d146e986a07f 245 printf("ID #%d (%d, %d", touchID[i], touchX[i], touchY[i]);
JackB 0:d146e986a07f 246 printf(")\n");
JackB 0:d146e986a07f 247 }
JackB 0:d146e986a07f 248 */
JackB 0:d146e986a07f 249 *x = ILI9341_TFTWIDTH - touchX[0];
JackB 0:d146e986a07f 250 *y = touchY[0];
JackB 0:d146e986a07f 251 }
JackB 0:d146e986a07f 252
JackB 0:d146e986a07f 253 TS_Point FT6206::getPoint(void) {
JackB 0:d146e986a07f 254 uint16_t x, y;
JackB 0:d146e986a07f 255 readData(&x, &y);
JackB 0:d146e986a07f 256 return TS_Point(x, y, 1);
JackB 0:d146e986a07f 257 }
JackB 0:d146e986a07f 258
JackB 11:9e1fc2233b0e 259 TS_Point FT6206::clearPoint(void) {
JackB 11:9e1fc2233b0e 260 uint16_t x = 0, y = 0;
JackB 11:9e1fc2233b0e 261 return TS_Point(x, y, 1);
JackB 11:9e1fc2233b0e 262 }
JackB 11:9e1fc2233b0e 263
JackB 0:d146e986a07f 264 char FT6206::readRegister8(char reg) {
JackB 0:d146e986a07f 265 char val;
JackB 0:d146e986a07f 266 m_i2c.write(m_addr, &reg, 1);
JackB 0:d146e986a07f 267 m_i2c.read(m_addr, &val, 1);
JackB 0:d146e986a07f 268 return val;
JackB 0:d146e986a07f 269 }
JackB 0:d146e986a07f 270
JackB 0:d146e986a07f 271 void FT6206::writeRegister8(char reg, char val) {
JackB 0:d146e986a07f 272 char data[2];
JackB 0:d146e986a07f 273 data[0] = reg;
JackB 0:d146e986a07f 274 data[1] = val;
JackB 0:d146e986a07f 275 m_i2c.write((int)FT6206_ADDR, data, 2);
JackB 0:d146e986a07f 276 }
JackB 0:d146e986a07f 277
JackB 0:d146e986a07f 278 char FT6206::dataReceived(void) {
JackB 0:d146e986a07f 279 return !m_interrupt;
JackB 0:d146e986a07f 280 }
JackB 0:d146e986a07f 281
JackB 0:d146e986a07f 282 /****************/
JackB 0:d146e986a07f 283
JackB 0:d146e986a07f 284 TS_Point::TS_Point(void) {
JackB 0:d146e986a07f 285 x = y = 0;
JackB 0:d146e986a07f 286 }
JackB 0:d146e986a07f 287
JackB 0:d146e986a07f 288 TS_Point::TS_Point(int16_t x0, int16_t y0, int16_t z0) {
JackB 0:d146e986a07f 289 x = x0;
JackB 0:d146e986a07f 290 y = y0;
JackB 0:d146e986a07f 291 z = z0;
JackB 0:d146e986a07f 292 }
JackB 0:d146e986a07f 293
JackB 0:d146e986a07f 294 bool TS_Point::operator==(TS_Point p1) {
JackB 0:d146e986a07f 295 return ((p1.x == x) && (p1.y == y) && (p1.z == z));
JackB 0:d146e986a07f 296 }
JackB 0:d146e986a07f 297
JackB 0:d146e986a07f 298 bool TS_Point::operator!=(TS_Point p1) {
JackB 0:d146e986a07f 299 return ((p1.x != x) || (p1.y != y) || (p1.z != z));
JackB 0:d146e986a07f 300 }