Other Parts Discussed in Thread: TSC2046, TSC2046E
Hi,
I am trying to read data from tsc2046 with a m3 core of the concerto mcu. Can you lok at my code and see if there is a mistake. The penirq pin is working fine.
I have checked the connections between the tsc2046e and the touch screen
X+ ....X_right
Y+.....Y_top
X-......X_left
Y-......Y_bottom
Also I have measured the voltages without any software running.
not touching
X+......3,3V
Y+......3,3V
X-.......0V
Y-.......3,3V
touching
X+......3,3V
Y+......0V
X-.......0V
Y-.......0V
I have tried with DCLK 5kHz- 25kHZ-775kHz, but the values are not stable.
void tsc2046_read() // this is the main function that writes x to read_data[0] and y to read_data[1]
{
unsigned int i;
if(GPIOPinRead(GPIO_PORTH_BASE, GPIO_PIN_1)==0)
{
read_data[0]=read_value(0xD9);// get x
}
else
{
for(i=0;i<3;i++)
{
read_data[i]=0;
}
}
if(GPIOPinRead(GPIO_PORTH_BASE, GPIO_PIN_1)==0)
{
read_data[1]=read_value(0x99);
}
else
{
for(i=0;i<3;i++)
{
read_data[i]=0; // get y
}
}
}
unsigned long read_value(unsigned int data)
{
unsigned int resh, resl,i;
unsigned long read[3],result;
long d[3];
//X1
SPISS_OFF;
SysCtlDelay(delay);
spiComm(data);
resh = spiComm(0x00) & 0x7F; // clock out 8 zeros - read 1/b11-b5...
resl = spiComm(0x00); // clock out 8 more zeros - read b4-b0 + 3 zeros...
okunan[0] = (resh*256 + resl)>>3;
SysCtlDelay(delay);
SPISS_ON ; // deselect slave
//X2
SPISS_OFF; /
SysCtlDelay(delay);
spiComm(data);
resh = spiComm(0x00) & 0x7F; // clock out 8 zeros - read 1/b11-b5...
resl = spiComm(0x00); // clock out 8 more zeros - read b4-b0 + 3 zeros...
okunan[1] = (resh*256 + resl)>>3;
SysCtlDelay(delay);
SPISS_ON ; // deselect slave
//X3
SPISS_OFF; // slave mode
SysCtlDelay(delay);
spiComm(data-1);
resh = spiComm(0x00) & 0x7F; // clock out 8 zeros - read 1/b11-b5...
resl = spiComm(0x00); // clock out 8 more zeros - read b4-b0 + 3 zeros...
okunan[2] = (resh*256 + resl)>>3;
SysCtlDelay(delay);
SPISS_ON ; // deselect slave
d[0]=read[0]-read[1];
d[1]=read[1]-read[2];
d[2]=read[2]-read[0];
for (i=0;i<3;i++)
{
if(d[i]<0)
{
d[i]=-d[i]; //absolute value of difference
}
}
//Find the closest values
if(d[0]<d[1])
{
if(d[0]<d[2])
{
result = read[0]+read[1];
}
else
{
result = read[0]+read[2];
}
}
else
{
if(d[1]<d[2])
{
result= read[1]+read[2];
}
else
{
result= read[0]+read[2];
}
}
result>>=1;
return result;
}
/*===================================================================
spiComm(): SPI
===================================================================*/
unsigned int spiComm(unsigned int spidata)
{
unsigned int i;
unsigned int spirecv;
spirecv = 0;
for (i=0; i<8; i++)
{
SPISCLK_OFF; // drop SCLK
SysCtlDelay(delay);
//SPIMOSI = spidata & 0x80;
if(spidata & 0x80) // write bit
SPISMOSI_ON;
else
SPISMOSI_OFF;
spidata <<= 1; // shift to next bit
SysCtlDelay(delay);
SPISCLK_ON; // raise SCLK
spirecv <<= 1; // get ready to receive
SysCtlDelay(delay);
spirecv |= SPIMISO; // read bit
SysCtlDelay(delay);
}
SPISCLK_OFF;
return spirecv;
}