请教下各位大牛。我在使用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都接上拉电阻了吗?