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.

[参考译文] LP-MSPM0G3507:DriverLib - I2C 外设错误处理

Guru**** 2528720 points
Other Parts Discussed in Thread: MSPM0G3507

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1552081/lp-mspm0g3507-driverlib---i2c-peripheral-error-handling

器件型号:LP-MSPM0G3507
Thread 中讨论的其他器件:MSPM0G3507

工具/软件:

您好:

我尝试熟悉 DriverLib 中的 I2C 外设。 我正在使用以下示例程序来帮助我:  I2C_CONTROLLER_RW_multibyte_fifo_poll_LP_MSPM0G3507_nortos_gcc

该示例看起来很简单、不太复杂、难以理解、但我对出现故障时的代码行为提出了一些问题。

在 测试代码时、我忘记为与我连接的器件设置正确的 I2C 从器件地址。 因此、我注意到软件卡在 for 循环中、它等待 RX FIFO 填充从节点预期的数据(请参阅下图)。

这对于我的用例来说是个问题,因为这在技术上现在是一个无限循环,会使程序的其余部分饿死 — 不好。 这似乎可以通过在继续读取数据之前检查目标从动器件的 ACK 状态来缓解。

话虽如此、  

  • 是否有办法检查传感器在读取事务的写入部分期间是否 NACK? 这样您就可以安全地防止软件尝试从那里没有的东西读取。 我浏览了 DriverLib 文档、没有找到任何内容。
  • DriverLib 似乎不提供有关每个事务状态的任何反馈。 是否可以调用任何函数来获取此信息?

另一方面、示例程序使用此 while 循环来确保 I2C 外设不会繁忙、然后再执行下一步。 在什么情况下软件会陷入困境、以及有哪些解决方案可以解决此问题。  

最后、从传感器读取时、写入和读取事务之间是否应该发生一定的延迟?

感谢您的帮助! 非常感谢。

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

    尊敬的 Adan:

    这对我的用例来说是个问题,因为从技术上讲,这是一个无限循环,程序的其余部分都会饿死 — 不好。

    这是因为本演示使用固定的数据长度、因此在“for"循环“循环结束之前、应该始终有 RXFIFO 中的数据、否则表示传输(读取)未完成。

    通常、为了避免这种情况、我们需要使用中断示例工程、您可以参考它。

    另一方面、示例程序使用此 while 循环来确保 I2C 外设在执行下一步之前处于不忙状态。 在什么情况下软件会陷入困境、以及有哪些解决方案可以解决此问题。  [/报价]

    请检查 I2C 总线状态、有时 I2C 总线卡滞(从器件强制 SCL 为低电平)将使 I2C 保持忙状态。

    B.R.

    Sal

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

    SAL、

    很抱歉晚才回复。

    通常情况下、为避免这种情况、我们需要使用中断示例工程、也许您可以参考它。

    因此、您说的从 I2C 总线获取反馈的唯一方法是使用中断? 没有其他方法?

    请检查 I2C 总线状态、有时 I2C 总线卡住(从器件强制 SCL 为低电平)将使 I2C 保持繁忙状态。

    在这种情况下、while 循环内是否应该存在超时?

    Adan

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

    这些示例(故意)很简单、以便展示最重要的步骤。

    在本例中、我建议您在循环 (Rx 和 Tx) 中添加与此类似的内容:

        if ((DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_ERROR))
           break;  // We won't progress any further

    几乎在每种情况下、ERR 位都意味着 NACK。 在所有情况下、这意味着您的交易已结束。

    在 Tx+ERR 情况下、您可能应该清除 TX FIFO。

    【编辑:轻微澄清】

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

    尊敬的 Adan:

    那么、从 I2C 总线获取反馈的唯一方法是使用中断? 没有其他方法?

    中断是一种方便的方法、因为它可以轻松地中断 while 循环、不需要轮询状态来检查。 使用轮询方法检查其总线状态也有效。

    按照 Bruce 的建议、错误位可用于检查 NACK 条件(从器件地址 NACK 或 TX 数据 NACK)。 BUSY 位可用于检查总线状态。  

    在这种情况下、while 循环内是否应该有超时?

    您可以使用以下功能来检测是否存在 SCL 超时:

    或者、使用通用计时器并读取 SCL/SDA 时间(如果它在特定时间内保持低电平)、则触发超时。 我们支持通过 I2C 寄存器读取 SDA/SCL 状态。

    B.R.

    Sal