Other Parts Discussed in Thread: TSC2003
在AM1808开发板中使用其硬件I2C进行读取TSC2003触摸屏数据,发现一直读取不到数据,不知道为什么原因,请教一下各位大佬,谢谢!
#include "tsc2003.h"
#include "i2c.h"
#include "soc_AM1808.h"
#include "def.h"
#define I2C0IsBusy() I2CMasterBusBusy(SOC_I2C_0_REGS)
volatile unsigned int slaveData[3];
volatile unsigned int dataIdx = 0;
volatile unsigned int txCompFlag = 1;
/*
** Initializes the I2C interface for a slave
*/
void I2C0IfConfig(unsigned int slaveAddr, unsigned int speed)
{
/* Put i2c in reset/disabled state */
I2CMasterDisable(SOC_I2C_0_REGS);
/* Configure i2c bus speed to 100khz */
I2CMasterInitExpClk(SOC_I2C_0_REGS, 24000000, 8000000, speed);
/* Set i2c slave address */
I2CMasterSlaveAddrSet(SOC_I2C_0_REGS, slaveAddr);
I2CMasterEnable(SOC_I2C_0_REGS);
}
/*
** Function to send data through i2c
*/
void I2C0SendBlocking(unsigned int dataCnt)
{
txCompFlag = 1;
dataIdx = 0;
while(I2C0IsBusy());
I2CSetDataCount(SOC_I2C_0_REGS, dataCnt);
I2CMasterControl(SOC_I2C_0_REGS, I2C_CFG_MST_TX | I2C_CFG_STOP);
I2CMasterIntEnableEx(SOC_I2C_0_REGS, I2C_INT_TRANSMIT_READY
| I2C_INT_STOP_CONDITION
| I2C_INT_NO_ACK);
I2CMasterStart(SOC_I2C_0_REGS);
/* Wait till the data is sent */
while(txCompFlag);
while(I2C0IsBusy());
}
/*
** Function to receive data from the Codec through I2C bus
*/
void I2C0RcvBlocking(unsigned int dataCnt)
{
txCompFlag = 1;
dataIdx = 0;
while(I2C0IsBusy());
I2CSetDataCount(SOC_I2C_0_REGS, dataCnt);
I2CMasterControl(SOC_I2C_0_REGS, I2C_CFG_MST_RX | I2C_CFG_STOP);
I2CMasterIntEnableEx(SOC_I2C_0_REGS, I2C_INT_DATA_READY
| I2C_INT_STOP_CONDITION
| I2C_INT_NO_ACK);
I2CMasterStart(SOC_I2C_0_REGS);
/* Wait till data is received fully */
while(txCompFlag);
while(I2C0IsBusy());
}
/*
** ISR to handler i2c interrupts
*/
void I2CIsr(void)
{
volatile unsigned int intCode = 0;
/* Get interrupt vector code */
intCode = I2CInterruptVectorGet(SOC_I2C_0_REGS);
while(intCode!=0)
{
/* Clear status of interrupt */
#ifdef _TMS320C6X
IntEventClear(SYS_INT_I2C0_INT);
#else
IntSystemStatusClear(15);
#endif
if (intCode == I2C_INTCODE_TX_READY)
{
I2CMasterDataPut(SOC_I2C_0_REGS, slaveData[dataIdx]);
dataIdx++;
}
if(intCode == I2C_INTCODE_RX_READY)
{
slaveData[dataIdx] = I2CMasterDataGet(SOC_I2C_0_REGS);
dataIdx++;
}
if (intCode == I2C_INTCODE_STOP)
{
I2CMasterIntDisableEx(SOC_I2C_0_REGS, I2C_INT_TRANSMIT_READY |
I2C_INT_DATA_READY |
I2C_INT_NO_ACK |
I2C_INT_STOP_CONDITION);
txCompFlag = 0;
}
if (intCode == I2C_INTCODE_NACK)
{
I2CMasterIntDisableEx(SOC_I2C_0_REGS, I2C_INT_TRANSMIT_READY |
I2C_INT_DATA_READY |
I2C_INT_NO_ACK |
I2C_INT_STOP_CONDITION);
/* Generate a STOP */
I2CMasterStop(SOC_I2C_0_REGS);
I2CStatusClear(SOC_I2C_0_REGS, I2C_CLEAR_STOP_CONDITION);
/* Clear interrupt, if we missed any, in case of error */
#ifdef _TMS320C6X
IntEventClear(SYS_INT_I2C0_INT);
#else
IntSystemStatusClear(15);
#endif
txCompFlag = 0;
}
if (I2CMasterIntStatus(SOC_I2C_0_REGS) & I2C_ICSTR_NACKSNT)
{
I2CMasterIntDisableEx(SOC_I2C_0_REGS, I2C_INT_TRANSMIT_READY |
I2C_INT_DATA_READY |
I2C_INT_NO_ACK |
I2C_INT_STOP_CONDITION);
/* Generate a STOP */
I2CMasterStop(SOC_I2C_0_REGS);
I2CStatusClear(SOC_I2C_0_REGS, (I2C_CLEAR_NO_ACK_SENT |
I2C_CLEAR_STOP_CONDITION));
/* Clear interrupt, if we missed any, in case of error */
#ifdef _TMS320C6X
IntEventClear(SYS_INT_I2C0_INT);
#else
IntSystemStatusClear(15);
#endif
txCompFlag = 0;
}
intCode = I2CInterruptVectorGet(SOC_I2C_0_REGS);
}
}
/*
** Writes a slave register with the given data value
*/
void I2C0SlaveRegWrite(unsigned char regAddr, unsigned char regData)
{
/* Send the register address and data */
slaveData[0] = regAddr;
slaveData[1] = regData;
I2C0SendBlocking(2);
}
/*
** Reads a slave register contents
*/
unsigned char I2C0SlaveRegRead(unsigned char regAddr)
{
/* Send the register address */
slaveData[0] = regAddr;
I2C0SendBlocking(1);
/* Receive the register contents in slaveData */
I2C0RcvBlocking(1);
return (slaveData[0]);
}
/*
** Sets I2C slave register bit specified in the bit mask
*/
void I2C0SlaveRegBitSet(unsigned char regAddr, unsigned char bitMask)
{
/* Send the register address */
slaveData[0] = regAddr;
I2C0SendBlocking(1);
/* Receive the register contents in slaveData */
I2C0RcvBlocking(1);
slaveData[1] = slaveData[0] | bitMask;
slaveData[0] = regAddr;
I2C0SendBlocking(2);
}
/*
** Clears slave register bits specified in the bit mask
*/
void I2C0SlaveRegBitClr(unsigned char regAddr, unsigned char bitMask)
{
/* Send the register address */
slaveData[0] = regAddr;
I2C0SendBlocking(1);
/* Receive the register contents in slaveData */
I2C0RcvBlocking(1);
slaveData[1] = slaveData[0] & ~bitMask;
slaveData[0] = regAddr;
I2C0SendBlocking(2);
}
void myI2C0SlaveRegWrite(unsigned char regAddr)
{
/* Send the register address and data */
slaveData[0] = regAddr;
I2C0SendBlocking(1);
}
void myI2C0SlaveRegRead(unsigned char regAddr)
{
/* Send the register address */
slaveData[0] = regAddr;
I2C0SendBlocking(1);
/* Receive the register contents in slaveData */
I2C0RcvBlocking(2);
/*这里打印的坐标数据都是0*/
printf("slaveData[0] = 0x%02x, slaveData[1] = 0x%02x\r\n", slaveData[0], slaveData[1]);
printf( "x = %d\n\n", (slaveData[1] >> 4) | ((U16)(slaveData[0] << 4)) );
//return (slaveData[0]);
}
void TouchDisplay_Task(void *prio)
{
U16 data;
I2CPinMuxSetup(0);
I2C0IfConfig(0x48, 100000);
myI2C0SlaveRegWrite(0xC0);
#if 1
while(1)
{
if(AAFLAG == 1 && GPIOPinRead(SOC_GPIO_0_REGS, 3)==0)
{
/*点击屏幕任何位置读取到的坐标数据都是0*/
myI2C0SlaveRegRead(0xC0);
//myI2C0SlaveRegWrite(0xD0);
AAFLAG = 0;
}
}
#endif
}
int main()
{
/*
I2C中断和触摸管脚中断注册到中断向量表了
...
*/
OSTaskCreate(TouchDisplay_Task, (void *)0, (OS_STK *)&SYS_Task_Stack[STACKSIZE-1], SYS_Task_Prio);
OSStart();
return 0;
}