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.

[参考译文] AM263P4-Q1:通过 WDT 进行软件复位后、从 EEPROM 读取(I2C 通信)失败。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1630399/am263p4-q1-after-a-software-reset-via-wdt-reading-from-the-eeprom-i2c-communication-fails

器件型号: AM263P4-Q1

在 WDT(看门狗计时器)触发并且软件复位后、对 EEPROM_Read 函数的第一次调用会导致程序在 i2c_v1_LLD.c 中的 I2C_LLD_primeTransferPoll 函数的循环中停止(见下文)

这种现象大约每 10 次发生一次。

请告诉我可能的原因和对策(例如每次软件重置后应执行的操作)。

注意:使用的 SDK 为 AM263Px MCU+ SDK 09.02.00。

不可回避的循环:
        /*等待总线忙*/
        while ((status == I2C_STS_Success)&&
        (I2CControllerBusBusy (object->baseAddr)== 0))
        {
          if (( object->Clock_getTicks()- object->startTicks)>
              object->Clock_uskoTicks ((uint64_t)(object->currentMsg -> timeout))
          {
            STATUS = I2C_STS_ERR_TIMEOUT;
          }
        }

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

    尊敬的 Imoaka:  

    您能详细说明一下您在这里要做什么吗? 您使用 WDG 触发软件复位的频率如何? 您的软件复位是否包括模块取消初始化和重新初始化? 您是否也可以阐明 WDG 是否使用 EEPROM 触发了复位中间事务?

    此致、  
    Pranav Siddappa.

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

    您好 Pranav、

    >您使用 WDG 触发软件重置的频率如何?

    为了进行验证、我们特意使用 WDG 触发软件复位、否则不会发生复位。

    >您的软件重置是否包括模块取消初始化和重新初始化?

    不执行取消初始化。 软件复位后执行 Re 初始化。

    >您是否也可以说明 WDG 是否使用 EEPROM 触发了复位中间事务?

    是的、WDG 可以在使用 EEPROM 的事务期间触发复位。 此外、在复位期间会维持外部 EEPROM 的电源。

    此致、

    Imaoka.

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

    尊敬的 Imoaka:  

    是的、WDG 可以在与 EEPROM 进行事务期间触发复位。 此外、外部 EEPROM 的电源在复位期间保持不变。[/报价]

    在事务中触发复位可能是此处的问题。 执行软件复位时、I2C 主器件将复位、但目标[外部 EEPROM]仍需要完成未发生的正在进行的事务。 因此、它保持该线路不允许新的传输。  

    软件复位后、是否也可以复位 EEPROM?  

    如果这个问题没有解决、您也可以将 I2C 控制器取消初始化。 这样、 当控制器和目标都准备好进行新的传输时、您就可以开始新的事务。   

    此致、  
    Pranav Siddappa.

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

    您好 Pranav、

    软件复位后、我在初始化前调用了 I2C_DEINIT ()、但它没有解决问题。 (程序在与之前相同的循环中停止。) 您能否提供复位 EEPROM 的具体过程?

    另外、您能告诉我如何取消 I2C 控制器的初始化吗?

    此致、

    Imaoka.

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

    你好、Imaoka、  

    您能否在程序卡住时检查 I2C Clk/数据线是否保持低电平?
    如果无限期地保持低电平、则说明其是总线故障导致的。 当 WDG 执行复位而终止传输时、作为目标的 EEPROM 需要更多数据。 由于它需要更多数据、因此它现在将保持线路状态、并导致总线卡滞情况。  

    如果总线卡滞、您可以参考此文档以获得修复: https://www.ti.com/lit/an/scpa069/scpa069.pdf?ts = 1775813319637&ref_url=https%253A%252F%252Fwww.google.com%252F

    此致、  
    Pranav Siddappa.