touch example added

This commit is contained in:
ChrisMicro 2017-06-09 10:05:36 +02:00
parent 7407d78d09
commit 800bc41e0e
3 changed files with 492 additions and 0 deletions

View File

@ -0,0 +1,85 @@
/*
Touch example for STM32F476 Discvery
June 2017, ChrisMicro
*/
#include <Wire.h>
#include "stm32_ub_touch_480x272.h"
#include "LTDC_F746_Discovery.h"
LTDC_F746_Discovery tft;
uint8_t UB_I2C3_ReadByte(uint8_t addressI2cDevice, uint8_t registerId)
{
uint8_t result;
addressI2cDevice = addressI2cDevice >> 1;
Wire.beginTransmission( addressI2cDevice );
Wire.write( registerId );
uint8_t error;
error = Wire.endTransmission();
Wire.requestFrom( addressI2cDevice, (uint8_t) 1 , (uint8_t) true );
while ( Wire.available() < 1 );
result = Wire.read() ;
if (error)Serial.println("I2C error");
return result;
}
void setup()
{
Wire.stm32SetInstance(I2C3);
Wire.stm32SetSDA(PH8);
Wire.stm32SetSCL(PH7);
Wire.begin();
UB_Touch_Init();
// The buffer is memory mapped
// You can directly draw on the display by writing to the buffer
uint16_t *buffer = (uint16_t *)malloc(LTDC_F746_ROKOTECH.width * LTDC_F746_ROKOTECH.height);
tft.begin((uint16_t *)buffer);
tft.fillScreen(LTDC_BLACK);
//tft.setRotation(0);
tft.setCursor(0, 0);
tft.setTextColor(LTDC_GREEN); tft.setTextSize(3);
tft.println("STM32F746 Discovery");
delay(3000);
tft.setTextColor(LTDC_YELLOW); tft.setTextSize(2);
}
void loop()
{
if (UB_Touch_Read() == SUCCESS)
{
tft.setCursor(0, 0);
tft.print(Touch_Data.xp); tft.print(" , "); tft.print(Touch_Data.yp);
tft.print(" contacts: "); tft.println( P_Touch_GetContacts() );
if( P_Touch_GetContacts() )
{
tft.setCursor(Touch_Data.xp, Touch_Data.yp);
tft.print("touched");
}
//delay(100);
} else
{
tft.print(".");
delay(200);
}
delay(100);
tft.fillScreen(LTDC_BLACK);
}

View File

@ -0,0 +1,263 @@
// driver found at
// http://mikrocontroller.bplaced.net/wordpress/?page_id=5329
// datasheet:
// https://www.newhavendisplay.com/appnotes/datasheets/touchpanel/FT5336.pdf
//--------------------------------------------------------------
// File : stm32_ub_touch_480x272.c
// Datum : 15.07.2015
// Version : 1.1
// Autor : UB
// EMail : mc-4u(@)t-online.de
// Web : www.mikrocontroller-4u.de
// CPU : STM32F746
// IDE : OpenSTM32
// GCC : 4.9 2015q2
// Module : CubeHAL, STM32_UB_I2C3
// Funktion : Touch-Funktionen
// Touch-Controller (Chip = FT5336GQQ)
//
// Hinweis : Settings :
// I2C-Slave-ADR = [0x70]
// FRQ-Max = 400 kHz
// I2C-3 [SCL=PH7, SDA=PH8]
// Interrupt-Pin = PI13 (wird nicht benutzt)
//
// im H-File einstellen ob Single- oder Multitouch
// benutzt werden soll
//--------------------------------------------------------------
//--------------------------------------------------------------
// Includes
//--------------------------------------------------------------
#include "stm32_ub_touch_480x272.h"
//#include "stm32_ub_i2c3.h"
MultiTouch_Data_t MultiTouch_Data;
Touch_Data_t Touch_Data;
//--------------------------------------------------------------
// interne Funktionen
//--------------------------------------------------------------
uint8_t P_Touch_ReadID(void);
uint8_t P_Touch_GetContacts(void);
uint8_t P_Touch_GetPositions(void);
//--------------------------------------------------------------
uint8_t FT5336_TOUCH_REG[5][4]; // fuer Register Adressen
//--------------------------------------------------------------
// Init vom Touch
// Return_wert :
// -> ERROR , wenn Touch nicht gefunden wurde
// -> SUCCESS , wenn Touch OK
//--------------------------------------------------------------
ErrorStatus UB_Touch_Init(void)
{
uint8_t touch_id=0,n;
Touch_Data.status=TOUCH_RELEASED;
Touch_Data.xp=0;
Touch_Data.yp=0;
MultiTouch_Data.cnt=0;
for(n=0;n<TOUCH_MAX_CONTACT;n++) {
MultiTouch_Data.p[n].xp=0;
MultiTouch_Data.p[n].yp=0;
}
// init der Touch Register Adressen
FT5336_TOUCH_REG[0][0]=FT5336_P1_XL_REG;
FT5336_TOUCH_REG[0][1]=FT5336_P1_XH_REG;
FT5336_TOUCH_REG[0][2]=FT5336_P1_YL_REG;
FT5336_TOUCH_REG[0][3]=FT5336_P1_YH_REG;
FT5336_TOUCH_REG[1][0]=FT5336_P2_XL_REG;
FT5336_TOUCH_REG[1][1]=FT5336_P2_XH_REG;
FT5336_TOUCH_REG[1][2]=FT5336_P2_YL_REG;
FT5336_TOUCH_REG[1][3]=FT5336_P2_YH_REG;
FT5336_TOUCH_REG[2][0]=FT5336_P3_XL_REG;
FT5336_TOUCH_REG[2][1]=FT5336_P3_XH_REG;
FT5336_TOUCH_REG[2][2]=FT5336_P3_YL_REG;
FT5336_TOUCH_REG[2][3]=FT5336_P3_YH_REG;
FT5336_TOUCH_REG[3][0]=FT5336_P4_XL_REG;
FT5336_TOUCH_REG[3][1]=FT5336_P4_XH_REG;
FT5336_TOUCH_REG[3][2]=FT5336_P4_YL_REG;
FT5336_TOUCH_REG[3][3]=FT5336_P4_YH_REG;
FT5336_TOUCH_REG[4][0]=FT5336_P5_XL_REG;
FT5336_TOUCH_REG[4][1]=FT5336_P5_XH_REG;
FT5336_TOUCH_REG[4][2]=FT5336_P5_YL_REG;
FT5336_TOUCH_REG[4][3]=FT5336_P5_YH_REG;
// init vom I2C
// UB_I2C3_Init();
// kleine Pause
HAL_Delay(TOUCH_INIT_DELAY);
touch_id=P_Touch_ReadID();
if(touch_id!=FT5336_ID) return ERROR;
return(SUCCESS);
}
//--------------------------------------------------------------
// auslesen vom Touch-Status und der Touch-Koordinaten
//
// es kann entweder der Single-Touch "Touch_Data"
// oder der Multi-Touch "MultiTouch_Data" benutzt werden
//
// Return_wert :
// -> ERROR , wenn Touch nicht gefunden wurde
// -> SUCCESS , wenn Touch OK
//
// Touch_Data.status : [TOUCH_PRESSED, TOUCH_RELEASED]
// Touch_Data.xp : [0...479]
// Touch_Data.yp : [0...271]
//
// MultiTouch_Data.cnt : [0...5]
// MultiTouch_Data.p[0..4].xp : [0...479]
// MultiTouch_Data.p[0..4].yp : [0...271]
//--------------------------------------------------------------
ErrorStatus UB_Touch_Read(void)
{
uint8_t check,n;
// init
Touch_Data.status=TOUCH_RELEASED;
Touch_Data.xp=0;
Touch_Data.yp=0;
MultiTouch_Data.cnt=0;
for(n=0;n<TOUCH_MAX_CONTACT;n++) {
MultiTouch_Data.p[n].xp=0;
MultiTouch_Data.p[n].yp=0;
}
check=P_Touch_GetContacts();
if(check>TOUCH_MAX_CONTACT) return ERROR;
if(check>0) {
// wenn touch betaetigt
MultiTouch_Data.cnt=check;
Touch_Data.status=TOUCH_PRESSED;
check=P_Touch_GetPositions();
if(check>TOUCH_MAX_CONTACT) {
// fehler beim lesen
Touch_Data.status=TOUCH_RELEASED;
Touch_Data.xp=0;
Touch_Data.yp=0;
MultiTouch_Data.cnt=0;
for(n=0;n<TOUCH_MAX_CONTACT;n++) {
MultiTouch_Data.p[n].xp=0;
MultiTouch_Data.p[n].yp=0;
}
return ERROR;
}
// erste koordinate fuer single touch speichern
Touch_Data.xp=MultiTouch_Data.p[0].xp;
Touch_Data.yp=MultiTouch_Data.p[0].yp;
}
return(SUCCESS);
}
//--------------------------------------------------------------
// interne Funktion
// ID auslesen (mehrmals versuchen)
// bei Fehler -> return = 0
//--------------------------------------------------------------
uint8_t P_Touch_ReadID(void)
{
int16_t i2c_wert;
uint8_t n;
for(n=0;n<5;n++) {
i2c_wert=UB_I2C3_ReadByte(FT5336_I2C_ADDR, FT5336_ID_REG);
if(i2c_wert>0) {
if((i2c_wert&0xFF)==FT5336_ID) return(FT5336_ID);
}
}
return 0;
}
//--------------------------------------------------------------
// interne Funktion
// anzahl der Touch Kontakte ermitteln
// ret_wert : 0...5 = Anzahl der Kontakte
// 99 = Error
//--------------------------------------------------------------
uint8_t P_Touch_GetContacts(void)
{
uint8_t ret_wert=0;
int16_t i2c_wert;
i2c_wert=UB_I2C3_ReadByte(FT5336_I2C_ADDR, FT5336_STATUS_REG);
if(i2c_wert<0) return 99;
// wert maskieren
ret_wert = (uint8_t)(i2c_wert & FT5336_STATUS_MASK);
if(ret_wert>TOUCH_MAX_CONTACT) return 0;
#if USE_MULTITOUCH==0
// bei Singletouch maximal ein Kontakt
if(ret_wert>1) ret_wert=1;
#endif
return(ret_wert);
}
//--------------------------------------------------------------
// interne Funktion
// die Touch positionen von allen Kontakten ermitteln
// ret_wert : 0 = OK
// 99 = Error
//--------------------------------------------------------------
// interne Funktion
uint8_t P_Touch_GetPositions(void)
{
uint8_t n,adr,wert_lo,wert_hi;
int16_t i2c_wert;
uint16_t position;
if(MultiTouch_Data.cnt==0) return 0;
// alle daten einlesen
for(n=0;n<MultiTouch_Data.cnt;n++) {
// x_lo
adr=FT5336_TOUCH_REG[n][0];
i2c_wert=UB_I2C3_ReadByte(FT5336_I2C_ADDR, adr);
if(i2c_wert<0) return 99;
wert_lo = i2c_wert & FT5336_LO_MASK;
// x_hi
adr=FT5336_TOUCH_REG[n][1];
i2c_wert=UB_I2C3_ReadByte(FT5336_I2C_ADDR, adr);
if(i2c_wert<0) return 99;
wert_hi = i2c_wert & FT5336_HI_MASK;
position=(wert_hi<<8)|wert_lo;
if(position>=TOUCH_MAXY) position=(TOUCH_MAXY-1);
MultiTouch_Data.p[n].yp=position;
// y_lo
adr=FT5336_TOUCH_REG[n][2];
i2c_wert=UB_I2C3_ReadByte(FT5336_I2C_ADDR, adr);
if(i2c_wert<0) return 99;
wert_lo = i2c_wert & FT5336_LO_MASK;
// y_hi
adr=FT5336_TOUCH_REG[n][3];
i2c_wert=UB_I2C3_ReadByte(FT5336_I2C_ADDR, adr);
if(i2c_wert<0) return 99;
wert_hi = i2c_wert & FT5336_HI_MASK;
position=(wert_hi<<8)|wert_lo;
if(position>=TOUCH_MAXX) position=(TOUCH_MAXX-1);
MultiTouch_Data.p[n].xp=position;
}
return 0;
}

View File

@ -0,0 +1,144 @@
//--------------------------------------------------------------
// File : stm32_ub_touch_480x272.h
//--------------------------------------------------------------
//--------------------------------------------------------------
#ifndef __STM32F7_UB_TOUCH_480x272_H
#define __STM32F7_UB_TOUCH_480x272_H
//--------------------------------------------------------------
// Includes
//--------------------------------------------------------------
//#include "stm32_ub_system.h"
#include <stdint.h>
//#include "stm32_ub_i2c3.h"
#include "Arduino.h"
uint8_t UB_I2C3_ReadByte(uint8_t addressI2cDevice, uint8_t registerId);
/*
typedef enum {
TOUCH_PRESSED = 0, // Touch ist betaetigt
TOUCH_RELEASED = 1 // Touch ist nicht betaetigt
}ErrorStatus;
*/
//--------------------------------------------------------------
// define ob Multitouch benutzt werden soll oder nicht
// 1 = bis zu 5 Touch-Positionen gleichzeitig
// 0 = nur eine Touchposition
//--------------------------------------------------------------
//#define USE_MULTITOUCH 1 // mit Multitouch
#define USE_MULTITOUCH 0 // nur Single-Touch
//--------------------------------------------------------------
#define TOUCH_INIT_DELAY 200 // 200ms
#define TOUCH_MAX_CONTACT 5 // Multitouch
//--------------------------------------------------------------
#define TOUCH_MAXX 480 // Pixel in X
#define TOUCH_MAXY 272 // Pixel in Y
//--------------------------------------------------------------
// I2C-Adresse
//--------------------------------------------------------------
#define FT5336_I2C_ADDR 0x70
//--------------------------------------------------------------
// Register Adressen
//--------------------------------------------------------------
#define FT5336_STATUS_REG ((uint8_t)0x02)
#define FT5336_P1_XH_REG ((uint8_t)0x03)
#define FT5336_P1_XL_REG ((uint8_t)0x04)
#define FT5336_P1_YH_REG ((uint8_t)0x05)
#define FT5336_P1_YL_REG ((uint8_t)0x06)
#define FT5336_P2_XH_REG ((uint8_t)0x09)
#define FT5336_P2_XL_REG ((uint8_t)0x0A)
#define FT5336_P2_YH_REG ((uint8_t)0x0B)
#define FT5336_P2_YL_REG ((uint8_t)0x0C)
#define FT5336_P3_XH_REG ((uint8_t)0x0F)
#define FT5336_P3_XL_REG ((uint8_t)0x10)
#define FT5336_P3_YH_REG ((uint8_t)0x11)
#define FT5336_P3_YL_REG ((uint8_t)0x12)
#define FT5336_P4_XH_REG ((uint8_t)0x15)
#define FT5336_P4_XL_REG ((uint8_t)0x16)
#define FT5336_P4_YH_REG ((uint8_t)0x17)
#define FT5336_P4_YL_REG ((uint8_t)0x18)
#define FT5336_P5_XH_REG ((uint8_t)0x1B)
#define FT5336_P5_XL_REG ((uint8_t)0x1C)
#define FT5336_P5_YH_REG ((uint8_t)0x1D)
#define FT5336_P5_YL_REG ((uint8_t)0x1E)
#define FT5336_ID_REG ((uint8_t)0xA8)
//--------------------------------------------------------------
// Status-ID
//--------------------------------------------------------------
#define FT5336_ID 0x51
//--------------------------------------------------------------
// Masken
//--------------------------------------------------------------
#define FT5336_STATUS_MASK 0x0F
#define FT5336_LO_MASK 0xFF
#define FT5336_HI_MASK 0x0F
//-----------------------------------------
// Touch-Status
//-----------------------------------------
typedef enum {
TOUCH_PRESSED = 0, // Touch ist betaetigt
TOUCH_RELEASED = 1 // Touch ist nicht betaetigt
}Touch_Status_t;
//-----------------------------------------
// Globale Struktur der Touch-Daten
//-----------------------------------------
typedef struct {
Touch_Status_t status;
uint16_t xp;
uint16_t yp;
}Touch_Data_t;
extern Touch_Data_t Touch_Data;
//-----------------------------------------
// Touch-Position
//-----------------------------------------
typedef struct {
uint16_t xp;
uint16_t yp;
}TP_Point_t;
//-----------------------------------------
// Globale Struktur der Multi-Touch-Daten
//-----------------------------------------
typedef struct {
uint16_t cnt;
TP_Point_t p[TOUCH_MAX_CONTACT];
}MultiTouch_Data_t;
//MultiTouch_Data_t MultiTouch_Data;
//--------------------------------------------------------------
// Globale Funktionen
//--------------------------------------------------------------
ErrorStatus UB_Touch_Init(void);
ErrorStatus UB_Touch_Read(void);
uint8_t P_Touch_GetContacts(void);
//--------------------------------------------------------------
#endif // __STM32F7_UB_TOUCH_480x272_H