Part Number:AM1808Other 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); #elseIntSystemStatusClear(15); #endifif (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 _TMS320C6XIntEventClear(SYS_INT_I2C0_INT); #elseIntSystemStatusClear(15); #endiftxCompFlag = 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 _TMS320C6XIntEventClear(SYS_INT_I2C0_INT); #elseIntSystemStatusClear(15); #endiftxCompFlag = 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; }
Shine:
请问I2C管脚上的时序正确吗?
,
youjian su:
您的意思是在我调用I2C写传输或读传输的API时用示波器测量SCL、SDA管脚得到时序吗?
,
youjian su:
您好,我用示波器测量了,时序符合TSC2003手册里的I2C时序图
,
Shine:
请跟踪一下代码,看是否有进中断?
,
youjian su:
您好,中断都能正常触发,且代码中没有使用到中断嵌套
,
Shine:
中断能触发的话,能进中断子程序吗?DRR接收寄存器里有数据么?
,
youjian su:
能进入中断子程序,DXR传输寄存器能传输数据,但是DRR接收寄存器里数据一直是0,且我已经设置CNT寄存器接收数据长度为2个字节了,DRR接收寄存器却只接收一个字节,当DDR接收完一个数据字节后进入if (I2CMasterIntStatus(SOC_I2C_0_REGS) & I2C_ICSTR_NACKSNT)这个if语句被判断为真,处理该事件完之后一个测试坐标周期结束。
,
Shine:
建议先设置digital-loopback mode (DLB)自环模式,看是否是AM1808 I2C的配置问题。
,
youjian su:
您好,能提供DLB的例程资料参考吗?
,
Shine:
没有DLB例程,通过寄存器ICMDR位DLB配置。可以看一下TRM文档I2C章节。https://e2echina.ti.com/support/sensors/f/sensors-forum/215588/iwr6843aop-mmwave_demo_visualizer-3-5-0
,
youjian su:
您提供的链接错了吧,没看见有什么I2C章节
,
Shine:
抱歉,贴错了https://www.ti.com/lit/ug/spruh82c/spruh82c.pdf