器件型号: TMS320F28388D
大家好:
我正在不使用 FIFO 的情况下实现多字节 I2C 寄存器读取。 我编写了以下函数来从从器件读取多个字节:
#define CMI2C_DELAY_IN_US = 50;
//
// cmi2c 单个寄存器读取
//
uint8_t cmi2c_ReadReg (uint8_t slave、uint8_t reg、uint8_t data[]、uint8_t len)
{
uint8_t d = 1、err;
//等待总线空闲
Err = cmi2c_isMasterBusy ();
if (I2C_OK!= err)
{
返回错误;
}
//发送从设备地址
I2C_setSlaveAddress (I2C0_BASE、SLAVE、I2C_MASTER_WRITE);
I2C_putMasterData (I2C0_BASE、reg);
I2C_setMasterConfig (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);
//等待总线空闲
Err = cmi2c_isMasterBusy ();
if (I2C_OK!= err)
{
返回错误;
}
DEVICE_DELAY_US (CMI2C_DELAY_IN_US);
//读取第一个字节
I2C_setSlaveAddress (I2C0_BASE、SLAVE、I2C_MASTER_READ);
I2C_setMasterConfig (I2C0_BASE、I2C_MASTER_CMD_BURST_RECEIVE_START);
//等待总线空闲
Err = cmi2c_isMasterBusy ();
if (I2C_OK!= err)
{
返回错误;
}
DATA[0]= I2C_getMasterData (I2C0_BASE);
DEVICE_DELAY_US (CMI2C_DELAY_IN_US);
对于(;d < len - 1;d++)
{
I2C_setMasterConfig (I2C0_BASE、I2C_MASTER_CMD_BURST_RECEIVE_CONT);
//等待总线空闲
Err = cmi2c_isMasterBusy ();
if (I2C_OK!= err)
{
返回错误;
}
DATA[d]= I2C_getMasterData (I2C0_BASE);
DEVICE_DELAY_US (CMI2C_DELAY_IN_US);
}
DEVICE_DELAY_US (CMI2C_DELAY_IN_US);
//读取最后一个字节
I2C_setMasterConfig (I2C0_BASE、I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
//等待总线空闲
Err = cmi2c_isMasterBusy ();
if (I2C_OK!= err)
{
返回错误;
}
DATA[len - 1]= I2C_getMasterData (I2C0_BASE);
返回 I2C_OK;
}
问题:
-
在逻辑分析仪上、I2C 事务看起来正确(起始,地址,重复启动和数据字节均正常)。
-
但是、存储在缓冲区
data[]() 中的数据组织不正确、有时甚至不正确。 -
有趣的是、代码完美地运行 调试模式 、但在中失败或给出不一致的结果 正常运行模式 。
这个代码中的问题是什么。