STMPE811 TouchScreen MCB1700

Dependents:   Touch_Screen_MCB

TS_I2C.cpp

Committer:
fblanc
Date:
2015-02-16
Revision:
2:004e29745d5e
Parent:
1:a1e34dd1f0a0

File content as of revision 2:004e29745d5e:

/**
* @file STM811.c
* @brief library TouchScreen STM811
* @author Frederic BLANC
*/


#include "TS.h"
I2C i2c(P0_10, P0_11);//LPC1768 P0_10 SDA2 P0_11 SCL2 + pull up 3.3k 3.3VCC

int TS_Init (void) {
    int err=0;
//	err+=TS_Write (TS_TSC_CTRL, 0x03);		/* TSC_CTRL register   X, Y only mode, enable             */    
    err+=TS_Write (TS_SYS_CTRL1, 0x02);      /* Reset Touch-screen controller      */
   wait_ms(10);								/* Wait minimum of 10ms               */
    err+=TS_Write (TS_SYS_CTRL2, SYS_CTRL2_TS_OFF | SYS_CTRL2_GPIO_OFF);      /* 1.Enable TSC and ADC                 */
    err+=TS_Write (TS_INT_EN, INT_TOUCH_DET);       	/* 2.Enable Touch detect, FIFO          */
    err+=TS_Write (TS_ADC_CTRL1, 0x69);      /* 3.Set sample time , 12-bit mode      */
    wait_ms(2);									/* Wait minimum of 2ms                */
    err+=TS_Write (TS_ADC_CTRL2, 0x01);      /* 4.ADC frequency 3.25 MHz             */
	err+=TS_Write (TS_GPIO_AF, 0x00);		 /* 5. ALL IO in ADC/TS mode            */
    err+=TS_Write (TS_TSC_CFG, 0xF5);       	/* 6. Set TSC_CFG register               */
    err+=TS_Write (TS_FIFO_TH, 0x01);       	/* 6a.Threshold for FIFO                 */
    err+=TS_Write (TS_FIFO_STA, 0x01);       /* 7.FIFO reset                         */
    err+=TS_Write (TS_FIFO_STA, 0x00);       /* 8.FIFO not reset                     */
    err+=TS_Write (TS_TSC_FRACTION_Z, 0x07); /* 9.Fraction z                         */
    err+=TS_Write (TS_TSC_I_DRIVE, 0x01);    /* 10.Drive 50 mA typical                */
    err+=TS_Write (TS_TSC_CTRL, 0x01);       /* 11.Enable TSC                         */
    err+=TS_Write (TS_INT_STA, 0xFF);			/* 12.Clear interrupt status             */
    err+=TS_Write (TS_INT_CTRL, 0x01);       /* 13.Enable global interrupt            */

    return err;
}

int TS_Write (unsigned char reg,unsigned int val) {
    int err=0;
    int addr =0x82;
    char cmd[2];
    cmd[0] = reg;            // Register to be written
	cmd[1] = val;
    err+=i2c.write(addr, cmd,2); // Send addr cmd val
    return err;
}

unsigned int TS_Read (unsigned char reg, int num) {
    int addr =(0x82 | 0);
    unsigned int idata;
	char* data=(char*) &idata;
	data[1] =data[2] =data[3] =0;
    data[0] = reg;            // Register to be written
    i2c.write(addr, data,1); // Send command string
	do{
		i2c.read (addr, &data[--num], 1);
	}while (num);
	return idata;

}

int ts_XY( int *x,int *y,int *z) {
    int  tch_z   = 0;
    int tch_int  =  0;
    int tch_smpl =  0;
	tch_int = TS_Read (TS_INT_STA, 1);    /* Read Touch-screen interrupt status */
        if (tch_int & 2) {            /* If FIFO is above threshold         */
            tch_smpl = TS_Read (TS_FIFO_SIZE, 1);
            while (--tch_smpl) {
                TS_Read (TS_TSC_DATA_NAI, 4);
            }
		}
            tch_z = TS_Read (TS_TSC_DATA_NAI, 4);  /* Read coordinates                   */
            *x = (tch_z >> 20) & 0x00000FFF;
            *y = (tch_z >>  8) & 0x00000FFF;
            *z = (tch_z >>  0) & 0x0000000F;
    return 0;

}