This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320C6678:当 NACK 被发出时、I2C_TRANSFER ()可以永远阻止任务。

Guru**** 2608375 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/585284/tms320c6678-i2c_transfer-can-block-the-task-forever-when-nack-raised

器件型号:TMS320C6678

您好!

我的客户在 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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Naoki、

    根据我对 C66x 器件的代码和 I2C 规范(www.ti.com/.../sprugv3.pdf)第2.9节的理解、当 NACK 被发送时、I2C 应该发送一个 IRQ 并且 Hwi 应该解除对任务的阻断、请参阅 I2C_TRANSFER_V0 ()中的注释:

    /*
    *在此处等待传输完成。
    *可以从这里阻止、因为 I2C 的 Hwi 将解除阻止
    *出错时
    *

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yordan、

    问题是 NACK ISR 可能会发生、但它永远不会处理 NACK 错误、实际上、它在发出 NACK 中断时不会从 ISR 调用回调函数。 因此、传输完成信标将不会被发布。  
    超时可作为 I2C_TRANSF()参数给出,因此从软件设计的角度来看,此问题应在您的末尾得到解决 感谢您的考虑。

    此致、
    Naoki

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Naoki、

    我已就此通知团队。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Naoki、

    是的、我们能够重现此错误情况、并且能够分析驱动程序代码。 我们在驱动程序的 I2C_V0版本中确认了此问题。 如果您查看驱动程序的 I2C_v1实现、您将看到超时的实现与您在变通办法中指定的完全相同。

    我已针对此问题提交了一份错误报告、您可以在发行说明中使用 PRSDK-2207进行跟踪。 2017年第1季度发布的代码冻结时间早在2周前、因此在当前更新中不会修复此问题。 您可以在2017年第2季度的 Processor SDK RTOS 版本中跟踪此问题以解决。

    感谢您的尽职调查、为我们提供重现问题的方法、并提供有关此问题的建议解决方法。

    此致、
    Rahul
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Rahul、

    好的、感谢您的回答。 我关闭线程。

    此致、
    Naoki