TI中文支持网
TI专业的中文技术问题搜集分享网站

C5500 I2C调试问题

在使用c55_csl_3.06 CSL_I2C_CodecTestExample调试过程中,当DSP作为Master模式下,通过添加打印log,发现第一次I2C卡在

statusByte = CSL_FEXT(i2cHandle->i2cRegs->ICSTR,I2C_ICSTR_ICRRDY);下,无法ICRRDY为1的信号。后续在I2C_ICSTR_BB就一直timeout、

时钟输入是按照晶振配置为12M 输出频率为10K。请问有可能是哪里出了问题?

Shine:

请问用的是EVM板还是自己的板子?这个例程是先通过I2C写codec寄存器,再去读这些配置后的寄存器值。您现在的问题是能写不能读?还是写也不行?

东东_Donny:

回复 Shine:

目前是不能写,写入出错都是超时,但是第一次写寄存器和后续写寄存器的超时所卡在步骤是不一样的,如提问中那样

Shine:

回复 东东_Donny:

“无法ICRRDY为1的信号”这个是接收ready信号,发送的话是“ICXRDY”信号。
另外,请说明使用的是EVM板还是自己的板子?如果是自己的板子,codec芯片是否和EVM板一样?

东东_Donny:

回复 Shine:

板子使用的是自己的板子,codec使用的是PCM1864 修改回I2C_ICSTR_ICXRDY验证,结果与之前一致。用示波器抓取SCL,SDA信号都为高电平
另想问下如果为主模式,ownAddr是否需要设置
i2cSetup.ownAddr= CSL_I2C_OWN_ADDR;

Shine:

回复 东东_Donny:

主模式,ownAddr不是必须设的。

先运行一下CSL_I2C_LoopbackExample例程,看内部自环是否可以。

东东_Donny:

回复 Shine:

CSL_I2C_LoopbackExample_Out正常,打印如下:

I2C LOOPBACK TEST!

I2C Loopback Data Write and Read CompleteRead Write Buffers Match!!

I2C LOOPBACK TEST PASSED!!

Shine:

回复 东东_Donny:

请问在GEL文件里有没有设置PSRCR,PRCR寄存器来使能peripheral clocks?

SDA, SCL管脚是否上拉了?

代码打印信息是什么?能运行到下面这块代码么?
CSL_Status CSL_testRegister(int regAddr, int regValue)
{CSL_Statusstatus;Uint16startStop;CSL_Statusresult;Uint16testWrBuffer[2];Uint16testRdBuffer[2];volatile Uint16looper;
result= CSL_I2C_TEST_FAILED;startStop = ((CSL_I2C_START) | (CSL_I2C_STOP));
testWrBuffer[0] = regAddr;testWrBuffer[1] = regValue;
/* Write data */status = I2C_write(testWrBuffer, 2,CSL_I2C_CODEC_ADDR, TRUE, startStop,CSL_I2C_MAX_TIMEOUT);if(status != CSL_SOK){printf("I2C Write Failed!!\n");return(result);}
printf("I2C Write Complete\n");

东东_Donny:

回复 Shine:

没有在GEL文件中设置。请问GEL文件指的具体是哪一个文件,我这边没有看到gel对应后缀的文件

SDA SCL管脚已上拉3.3v

可以运行到CSL_testRegister

以下为我修改的I2C_write函数

CSL_Status I2C_write(Uint16 *i2cWrBuf, Uint16 dataLength, Uint16 slaveAddr, Bool masterMode, Uint16 startStopFlag, Uint16 timeout){ volatile Uint16 looper; Uint16 dataCount; Uint16 statusByte;

if((i2cWrBuf != NULL) && (dataLength !=0)) { /* check for bus busy */ for(looper = 0; looper < timeout; looper++) { statusByte = CSL_FEXT(i2cHandle->i2cRegs->ICSTR, I2C_ICSTR_BB); if(statusByte == FALSE) { printf("bus busy\n"); break; } }

if(looper >= timeout) { printf("bus busy timeout\n"); /* bus busy timeout error */ return(CSL_I2C_BUS_BUSY_ERR); }

/* Set the Tx mode */ CSL_FINST(i2cHandle->i2cRegs->ICMDR, I2C_ICMDR_TRX, SET);

/* Set the data length */ CSL_FINS(i2cHandle->i2cRegs->ICCNT, I2C_ICCNT_ICDC, dataLength);

if(masterMode == TRUE) { printf("masterMode\n"); /* Set the slave address */ CSL_FINS(i2cHandle->i2cRegs->ICSAR, I2C_ICSAR_SADDR, slaveAddr);

/* Enable Master mode */ CSL_FINST(i2cHandle->i2cRegs->ICMDR, I2C_ICMDR_MST, SET);

/* Set the stop bit */ if((startStopFlag & CSL_I2C_STOP) == CSL_I2C_STOP) { printf("set stop bit\n"); CSL_FINST(i2cHandle->i2cRegs->ICMDR, I2C_ICMDR_STP, SET); }

/* Set the start bit */ if((startStopFlag & CSL_I2C_START) == CSL_I2C_START) { printf("set start bit\n"); CSL_FINST(i2cHandle->i2cRegs->ICMDR, I2C_ICMDR_STT, SET); } } else { printf("slave mode\n"); /* Disable Master mode */ CSL_FINST(i2cHandle->i2cRegs->ICMDR, I2C_ICMDR_MST, CLEAR); }

for(dataCount = 0; dataCount < dataLength; dataCount++) { /* Check for ICXRDY status */ for(looper = 0; looper < timeout; looper++) { statusByte = CSL_FEXT(i2cHandle->i2cRegs->ICSTR, I2C_ICSTR_ICXRDY);// statusByte = CSL_FEXT(i2cHandle->i2cRegs->ICSTR,// I2C_ICSTR_ICRRDY); if(statusByte == TRUE) { break; } }

if(looper >= timeout) { printf("CSL_I2C_TIMEOUT_ERROR\n"); return(CSL_I2C_TIMEOUT_ERROR); }

/* Write data to the data Tx register */ CSL_FINS(i2cHandle->i2cRegs->ICDXR, I2C_ICDXR_D, *i2cWrBuf++);

for(looper = 0; looper < timeout; looper++) { /* Check for NACK status */ statusByte = CSL_FEXT(i2cHandle->i2cRegs->ICSTR, I2C_ICSTR_NACK); if(statusByte == FALSE) { break; } }

if(looper >= timeout) { printf("CSL_I2C_NACK_ERR\n"); return(CSL_I2C_NACK_ERR); } } } else { printf("CSL_ESYS_INVPARAMS\n"); return(CSL_ESYS_INVPARAMS); }

return(CSL_SOK);}

第一次可以运行等待data received 超时 后面在bus busy 超时

Log如下

CSL_testRegister

I2C CODEC CONFIGURING IN POLLED MODE TEST!

pscValue:8clock:57CSL_testRegisterbus busymasterModeset stop bitset start bitCSL_I2C_TIMEOUT_ERRORI2C Write Failed!!Read Write Buffers Don't Match for Register:0 with Value:0CSL_testRegister Failed!!

CSL_testRegisterbus busy timeoutI2C Write Failed!!Read Write Buffers Don't Match for Register:65 with Value:81CSL_testRegister Failed

Shine:

回复 东东_Donny:

gel文件在C:\ti\ccsv8\ccs_base\emulation\boards\ezdsp5535_v1目录下,您自己的板子要做相应的修改。

为什么要修改I2C_write源码?I2C_write是CSL库里的API函数。

东东_Donny:

回复 Shine:

那gel文件需要导入操作吗?
I2C_write只添加一些打印,方便调试

赞(0)
未经允许不得转载:TI中文支持网 » C5500 I2C调试问题
分享到: 更多 (0)