您好!
我的客户在 PDK I2C 驱动程序中提供的 I2C_TRANSFER ()有问题。 当在 I2C 主器件传输模式中产生 NACK 错误时、I2C_TRANSFER ()可以永久阻止 SYS/BIOS 任务运行环境。
例如、如果您在 C6678 EVM 上的任务函数中执行 I2C_transfer、即使我使用超时值执行该操作、后者也会永久阻止当前 TSK 上下文。
//应该是 OK i2cTransaction.writeBuf = writebuf; i2cTransaction.writeCount = sizeof writebuf; i2cTransaction.readBuf = readbuf; i2cTransaction.ReadCount = sizeof readbuf; i2cTransaction.slaveAddress = 0x50;//正确的从器件地址 = readbuf ;i2cTransaction.Read挂起 = i2cife.NULL;i2cTransaction.if;i2ifore.i2cTransfer=i2ife.i2cife.NULL;i2cifore.i2cTransaction=i2cifor.ifor.if // 将返回(成功)//错误 i2cTransaction.writeBuf = writebuf;i2cTransaction.writeCount = sizeof writebuf;i2cTransaction.readBuf = readbuf;i2cTransaction.ReadCount = sizeof readbuf;i2cTransaction.slaveAddress = 0x60;正确的从地址/。 这将调用 NACK 中断。 i2cTransaction.arg = NULL; i2cTransaction.nextPtr = NULL; i2cTransaction.timeout = 1000; res = I2C_transfer (i2c、&i2cTransaction);//这将永远阻止此上下文。 未返回错误。
问题是、驱动程序代码正在使用具有永久性的硬契约超时值来实现其传输完成信标。 我只是这样修改(请参阅,#if 1),似乎没有出现问题。
后一代码返回0 (超时故障)。
C:\ti\pdk_c667x_2_0_3\packages/ti\drv\i2c\src\V0\I2C_V0.c
if (object->operMode = I2C_Oper_mode_blocking){
I2C_drv_log1 ("\n I2C:(0x%x)在传输完成信标上挂起\n"、
hwAttrs->baseAddr);
/*
*在此处等待传输完成。
*可以从这里阻止、因为 I2C 的 Hwi 将解除阻止
*出错时
*/
#if 1.
SemaphoreP_Status semStatus;
semStatus = I2C_osalPendLock (object->transferComplete、transaction->timeout);
#else
I2C_osalPendLock (object->transferComplete、SemaphoreP_WAIT_Forever);
#endif
i2C_drv_log1 ("\n I2C:(0x%x)事务已完成\n"、hwAttrs->baseAddr);
/* Hwi 句柄已发布错误的"传输完成"检查*/
if (object->mode =I2C_IDLE_MODE){
i2C_drv_log1 ("\n I2C:(0x%x)传输确定\n"、hwAttrs->baseAddr);
RET =(int16_t) I2C_STS_SUCCESS;
}
#if 1.
if (semStatus = SemaphoreP_TIMEOUT){
RET =(int16_t) I2C_STS_ERR;
}
#endif
}
请注意、上述驱动程序代码是 从 pdk_c667x_2_0_3中提供的、您知道它不是 PDK 的最新版本。 但是、即使在最新的 PDK 中、我相信也会出现相同的问题、并且应该在未来的版本中修复代码。 请确认这是相关的修复、并将其提供给您的代码库以供将来发布。
此致、
Naoki