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.

[参考译文] AM2434:TI's i2c 驱动程序在某些情况下卡住

Guru**** 2856480 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1631460/am2434-ti-s-i2c-driver-gets-stuck-in-some-situations

器件型号: AM2434
主题: SysConfig 中讨论的其他器件

您好、

我们在 AM243x 上使用 TI 的 LLD 作为 I2C、以读取定制电路板上一组 IC 的数据。 其中一些 IC 由可由用户关闭的单独电源供电。 当然、在这种情况下、器件在 I2C 上不可用。 有时、这会导致驱动程序代码卡住。 我们使用的是 mcu_plus_sdk_am243x_11_01_00_19。

为了缩小范围、我可以使用修改后的 TI 示例和 AM243x LaunchPad 重现设计。
示例:I2C_TEMPERATURE_INTERRUPT_LLD_am243x-evm_r5fss0-0_nortos_ti-arm-clang
我随函附上了更改的文件 i2c_temperature_interrupt_lld.c 和逻辑分析仪的图片:

i2c_ti_stuck.png

在没有温度传感器的 LaunchPad 上运行代码。 我获得以下输出:

[I2C]在中断模式下启动了 I2C 温度读取测试...!!
错误:I2C_TEMPERATURE_MAIN:105:未在器件地址 0x48 处找到[I2C]温度传感器  
[I2C]样本 0:0.000000(°C)
[I2C]示例 1:0.000000(°C)
[I2C]示例 2:0.000000(°C)
[I2C]示例 3:0.000000(°C)
[I2C]示例 4:0.000000(°C)
[I2C]示例 5:0.000000(°C)
[I2C]示例 6:0.000000(°C)
[I2C]示例 7:0.000000(°C)
[I2C]示例 8:0.000000(°C)
[I2C]示例 9:0.000000(°C)
[I2C]示例 10:0.000000(°C)

从这里、代码被卡住。  

我在代码中所做的更改将执行以下操作:
由于我上述原因、它会跳过器件地址检查。
它在传输第一个字节(器件地址)结束时、模拟具有更高优先级的 ISR 或具有禁用中断 8us 的代码区域。
该时间段如所附图片中的信号 J1_8_PIN 所示。
此后、不会调用传输完成回调、互斥量周围的循环也不会离开。

我的问题:
这是故意的行为吗?
如何避免或打破这种情况?
如何了解失败的交易?  
提前感谢。

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

    您好、

    我可以看到您尚未将任何传感器连接到 I2C、并且 I2C 探头发生故障、日志没有找到传感器。

    此外、您还尝试了读取 10 个样本、然后在 8us 内禁用中断、然后重新启用中断。  

    这里的问题是、这个问题是否仅在您禁用中断后才出现? 还有、这是只有我们有 8us 延迟还是独立于它时才会出现?

    此外、您是否尝试了在仅禁用 I2C 中断的情况下重新生成中断、而不是禁用所有中断?

    此致、

    Tushar

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

    尊敬的 Tushar:

    感谢您的快速响应。 该问题仅在禁用中断后出现。 在本示例中、它处于一个固定的时间点。 在我们的实际用例中、这种情况偶尔会发生、具体取决于在短时间范围内禁用中断的其他任务。 我在 i2c 传输结束时安排了 8us、因为我假定驱动程序代码在这个特定时间点未命中(或清除)中断请求。 否、我没有尝试仅禁用 i2c 中断。 对于我的用例、我只能很少地控制其他任务的作用。

    此致、
    彼得

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

    更准确地说:仅当没有器件确认传输的器件地址 (NAK) 并且 在器件地址传输结束时禁用中断时、才会发生问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在此之后、不会调用传输完成回调、互斥量周围的循环也不会离开。

    您是否在回调模式下配置了 I2C? 您是否也尝试过阻塞模式?

    此致、

    Tushar

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

    我的第一种方法是 回调模式下的 HLD i2c 驱动程序。 在这种设置下,我第一次遇到了这个问题。 在 SysConfig 中启用 i2c 中断后、就会出现该问题。 那么传输模式是回调模式还是阻塞模式无关紧要。 在这两种情况下、都使用了中断。 仅当我在 SysConfig 中禁用 i2c 中断时才无法观察到问题。 但由于我不想阻止代码执行、因此我无法选择。 我错过的是一项 API 服务、它会轮询 i2c 传输是否完成、而不会阻塞或中断。 BTW:你能重现我的例子吗?

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

    尊敬的 Peta:

    在 I2C ISR 中、我们在一个循环中处理所有中断。 它看起来像是在我们不调用的驱动程序代码中  I2C_LLD_COMPLETECurrTransfer() 致命错误的 API。 请应用以下将修改的补丁  I2C_LLD_controllerIsr () API、位于 ${MCU_SDK}\source\drivers\i2c\v0\lld\i2c_v0_lld.c 文件。

    diff --git a/source/drivers/i2c/v0/lld/i2c_v0_lld.c b/source/drivers/i2c/v0/lld/i2c_v0_lld.c
    index 06340347a..a9943563d 100644
    --- a/source/drivers/i2c/v0/lld/i2c_v0_lld.c
    +++ b/source/drivers/i2c/v0/lld/i2c_v0_lld.c
    @@ -1433,6 +1433,10 @@ void I2C_lld_controllerIsr(void *args)
                     I2CControllerIntEnableEx(object->baseAddr, I2C_INT_STOP_CONDITION);
                     /* Issue the stop condition */
                     I2CControllerStop(object->baseAddr);
    +            
    +                /* Finish current transfer */
    +                I2C_lld_completeCurrTransfer(object, xferStatus);
    +                
                     /* Breat out of the interrpt Loop */
                     break;
                 }
    

    应用上述补丁后、重新编译驱动程序。 完成此操作后、重新编译示例工程并测试。  

    上述程序应能解决上述问题。

    此致、

    Tushar

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

    尊敬的  Tushar:

    很抱歉我迟到的回复。 几天之后,我就离开了办公室。 您的补丁程序解决了该问题。 谢谢你。
    该补丁是否会包含在下一个 SDK 中?

    此致、
    Peta

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

    尊敬的 Peta:

    感谢您的确认。 下一个 SDK 版本的内部代码冻结已经完成、不会接受任何新的更改。 此补丁无法集成到下一个 SDK 版本。 我已为此问题创建了内部 Jira 工单、很可能会通过 SDK v12.1 修复。

    此致、

    Tushar