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

C6455的I2C读写问题。

    请教下各位大牛。我在使用C6455的I2C对slave device 进行读写时,写数据有ACK回应,读数据总是读不到。我使用的6455的CSL库,loopmode设置为disable。DSP时钟为1GHZ,其中时钟设置为:

#define CSL_I2C_CLOCK_PRESCALAR 0x13
#define CSL_I2C_CLOCK_CLKL 0x23
#define CSL_I2C_CLOCK_CLKH 0x24

即设置为100KHZ。

I2C设置为:

hwSetup.mode = CSL_I2C_MODE_MASTER;
hwSetup.dir = CSL_I2C_DIR_TRANSMIT;
hwSetup.addrMode = CSL_I2C_ADDRSZ_SEVEN;
hwSetup.sttbyteen = CSL_I2C_STB_DISABLE;
hwSetup.ownaddr = CSL_I2C_SLAVE_ADDR;
hwSetup.ackMode = CSL_I2C_ACK_ENABLE;
hwSetup.runMode = CSL_I2C_FREE_MODE_DISABLE;
hwSetup.repeatMode = CSL_I2C_REPEAT_MODE_DISABLE;
hwSetup.loopBackMode = CSL_I2C_DLB_DISABLE;
hwSetup.freeDataFormat = CSL_I2C_FDF_DISABLE;
hwSetup.resetMode = CSL_I2C_IRS_ENABLE;
hwSetup.bcm = CSL_I2C_BCM_DISABLE;
hwSetup.inten = 0x00; hwSetup.clksetup = &clksetup;

这里的ownaddr好像是自己的地址设置,所以我又单独设置了slave address。I2C_ICSAR = CSL_I2C_SLAVE_ADDR。

在进行完写操作后,SDA和SCL总是会被一直拉低。进行读操作是,发送出设备地址读后,一直没有返回数据。

请问是什么原因?

按照CSL库中,其中读写操作里的

/* Clear the flag */
cmd_arg = CSL_I2C_CLEAR_XRDY;
if (CSL_i2cHwControl(hI2c,CSL_I2C_CMD_CLEAR_STATUS,&cmd_arg) != CSL_SOK) {
return;
}

/* Clear the receive ready flag */
cmd_arg = CSL_I2C_CLEAR_RRDY;
if (CSL_i2cHwControl(hI2c,CSL_I2C_CMD_CLEAR_STATUS,&cmd_arg) !=
CSL_SOK) {
return;
}

这两处分别是写的那个寄存器?

Shine:

请问loopback mode下可以收发数据吗?外接的是什么slave器件?会不会是时序没有匹配?

Shine:

回复 Shine:

/* Clear the flag */cmd_arg = CSL_I2C_CLEAR_XRDY;if (CSL_i2cHwControl(hI2c,CSL_I2C_CMD_CLEAR_STATUS,&cmd_arg) != CSL_SOK) {return;}

/* Clear the receive ready flag */cmd_arg = CSL_I2C_CLEAR_RRDY;if (CSL_i2cHwControl(hI2c,CSL_I2C_CMD_CLEAR_STATUS,&cmd_arg) !=CSL_SOK) {return;这两句清的是ICSTR寄存器的ICXRDY和ICRRDY位。 

hao wang26:

回复 Shine:

loopback mode下可以正常收发数据。外接的一个rapidio switch芯片IDT的CPS1616。接上示波器后可以看到,写数据有ACK响应,读数据时只发了slave address+读写标志,然后就是SDA和SCL都被一直拉低。且每次写数据完成后,SDA和SCL都被一直拉低。始终读不到数据。

还一个问题,每次读或者写一个数据后,必须要清除ICSTR寄存器相应的ICXRDY或CRRDY吗?

Shine:

回复 hao wang26:

SDA, SCL都接上拉电阻了吗?

赞(0)
未经允许不得转载:TI中文支持网 » C6455的I2C读写问题。
分享到: 更多 (0)