This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM1808: 关于AM1808使用I2C读取TSC2003坐标的问题

Part Number: AM1808
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;
}