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。请问有可能是哪里出了问题?

一直在路上

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

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

    一直在路上

  • 状元 191037 points

    回复 东东_Donny:

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

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

    一直在路上

  • 状元 191037 points

    回复 东东_Donny:

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

    先运行一下CSL_I2C_LoopbackExample例程,看内部自环是否可以。
  • 回复 Shine:

    CSL_I2C_LoopbackExample_Out正常,打印如下:

    I2C LOOPBACK TEST!

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

    I2C LOOPBACK TEST PASSED!!

    一直在路上

  • 状元 191037 points

    回复 东东_Donny:

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

    SDA, SCL管脚是否上拉了?

    代码打印信息是什么?能运行到下面这块代码么?
    CSL_Status CSL_testRegister(int regAddr, int regValue)
    {
    CSL_Status status;
    Uint16 startStop;
    CSL_Status result;
    Uint16 testWrBuffer[2];
    Uint16 testRdBuffer[2];
    volatile Uint16 looper;

    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");
  • 回复 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:8
    clock:57
    CSL_testRegister
    bus busy
    masterMode
    set stop bit
    set start bit
    CSL_I2C_TIMEOUT_ERROR
    I2C Write Failed!!
    Read Write Buffers Don't Match for Register:0 with Value:0
    CSL_testRegister Failed!!

    CSL_testRegister
    bus busy timeout
    I2C Write Failed!!
    Read Write Buffers Don't Match for Register:65 with Value:81
    CSL_testRegister Failed

    一直在路上

  • 状元 191037 points

    回复 东东_Donny:

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

    为什么要修改I2C_write源码?I2C_write是CSL库里的API函数。
  • 回复 Shine:

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

    一直在路上