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.

[参考译文] TM4C1290NCPDT:如何对调用到 EEPROMInit 后返回的不成功做出反应

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1340243/tm4c1290ncpdt-how-to-react-to-non-success-returned-from-a-call-to-eeprominit

器件型号:TM4C1290NCPDT

大家好!

我正在努力确认、如果从 TI 驱动程序的 EEPROMInit 函数收到故障代码、我们的固件会适当响应、 在阅读了数据表和勘误表信息之后、我的脑海中还有一个疑问: https://www.ti.com/product/TM4C1290NCPDT#tech-docs  我们使用的是版本3。

数据表8.2.4.1内的"编程中的错误"部分提供了以下信息:

复位后、在向 EEPROM 写入任何数据之前、软件必须读取 EESUPP 寄存器并检查是否存在任何错误状态、该状态可能表示系统由于电压下降而复位、正在进行写入或擦除操作。  如果 PRETRY 位或 ERETRY 位被置位、外设应置位、方法是将 EEPROM 软件复位(SREEPROM)寄存器的 R0位置位并清零、然后等待 EEDONE 寄存器的 WORKING 位清零、之后再重新校验 EESUPP 寄存器的错误指示。  此过程应允许 EEPROM 从写入或擦除错误中恢复。  在少数情况下、EESUPP 寄存器 在执行此操作后可能继续显示错误、此时应重复该复位操作。 从错误中恢复后、该应用程序应重新写入发生初始故障时正在进行编程的数据。

现在、为了进行比较、我将引用8.2.4.2伏中的一部分、

在写入任何 EEPROM 寄存器之前、必须通过 EEPROM 运行模式时钟门控控制寄存器(RCGCEEPROM)(见388页)启用 EEPROM 模块的时钟、并且必须执行以下初始化步骤:

1.插入延迟(6个周期加上函数调用开销)。

2.查询 EEPROM 完成状态(EEDONE)寄存器中的 WORKING 位、直至其清零、表明 EEPROM 已完成上电初始化。 工作= 0时、继续。

3.读取 EEPROM 支持控制和状态(EESUPP)寄存器中的 PRETRY 和 ERETRY 位。 如果任一位置位、则返回错误、否则继续。

4、用系统控制寄存器空间中偏移量0x558处的 EEPROM 软件复位寄存器 SREEPROM 模块复位。

5.插入延迟(6个周期加上函数调用开销)。

6.查询 EEPROM 完成状态(EEDONE)寄存器中的 WORKING 位、确定何时将其清零。 工作= 0时、继续。

7.读取 EESUPP 寄存器中的 PRETRY 和 ERETRY 位。 如果任一位置位、则返回错误、否则 EEPROM 初始化完成、软件可以正常使用外设。

当我阅读我突出显示的两个部分时、似乎存在不匹配情况。  在我引述的第一节中、要点似乎是、如果  PRETRY 或 ERETRY 中遇到错误、最好执行 EEPROM 的软复位。  但在编号步骤列表中、如果    PRETRY 或 ERETRY 中没有遇到错误、则执行复位。  

这对我来说很重要的原因是、我想知道如果 EEPROMInit 返回 EEPROM_INIT_ERROR、我们的应用程序应该怎么做。  如果在步骤3中返回了该错误代码、那么我引用的第一部分表示我们应该执行软复位、然后重试。  (根据此器件勘误表的 MEM#11、我们使用的是 EEPROMInit 的 TI 驱动程序实施、而不是 ROM 实施。  我查看了当前的驱动程序代码、它似乎与第8.2.4.2节中列出的步骤序列相匹配。   从 EEPROMInit 驱动程序源代码  中可以看出、如果我们自己在应用中没有这样做、那么对 EEPROMInit 的下一次调用很可能会在步骤3中再次提前退出。)  

但另一方面,鉴于 MEM#11存在,我不知道数据表中的"编程中的错误"一段(显然是在 MEM#11之前)是否仍然被认为是正确的?

关于这个问题、您能给我一些建议吗?  在下次尝试调用 EEPROMInit 之前、我们是否应该采取措施来执行软复位?  我的一部分人想知道为什么、如果这仍然是建议的做法、EEPROMInit 驱动程序本身不会在遇到这种情况时代表呼叫者执行此操作?

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

    您好!

     EEPROMInit()已经插入了软件复位,并且是正确的。  复位之后、它 将 像在 首次调用 EEPROMInit ()时的开始位置一样轮询_EEPROMWaitForDone 状态。  

    //
    // Make sure the EEPROM has finished any ongoing processing.
    //
    _EEPROMWaitForDone();

    //
    // Read the EESUPP register to see if any errors have been reported.
    //
    ui32Status = HWREG(EEPROM_EESUPP);

    //
    // Did an error of some sort occur during initialization?
    //
    if(ui32Status & (EEPROM_EESUPP_PRETRY | EEPROM_EESUPP_ERETRY))
    {
    return(EEPROM_INIT_ERROR);
    }

    //
    // Perform a second EEPROM reset.
    //
    SysCtlPeripheralReset(SYSCTL_PERIPH_EEPROM0);

    //
    // Wait for the EEPROM to complete its reset processing once again.
    //
    SysCtlDelay(2);
    _EEPROMWaitForDone();

    //
    // Read EESUPP once again to determine if any error occurred.
    //
    ui32Status = HWREG(EEPROM_EESUPP);

    //
    // Was an error reported following the second reset?
    //
    if(ui32Status & (EEPROM_EESUPP_PRETRY | EEPROM_EESUPP_ERETRY))
    {
    return(EEPROM_INIT_ERROR);
    }

    //
    // The EEPROM does not indicate that any error occurred.
    //
    return(EEPROM_INIT_OK);

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

    谢谢你的回复,查尔斯.

    但很抱歉、我不理解您的解释、因为我对 EEPROM_EESUPP_PRETRY 或 EEPROM_EESUPP_ERETRY 置1的情况下该怎么做感兴趣。

    尽管您已用红色突出显示了某个区域、这肯定表示进行了重置、但我们不会(除非我遗漏了某些内容)到达该代码、因为我们到那时已退出该函数、 因为这个提早退出的代码恰好位于您用红色突出显示的代码的上方。

    //
    // Did an error of some sort occur during initialization?
    //
    if(ui32Status & (EEPROM_EESUPP_PRETRY | EEPROM_EESUPP_ERETRY))
    {
    return(EEPROM_INIT_ERROR);
    }[/报价]

    如果这项尽早退出的条款看起来像这样,我脑海中的所有微弱声音将会平静:

    如果(无错误)

    {

     返回 eeprom_init_OK;

    这意味着我们将继续执行重置、如果设置了其中一个位、将与 文档中"编程中的错误"部分的文本对齐、但与8.1.4.2中概述的步骤不符。

    再次感谢您的参与!

    谢谢、

    授予

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

    尊敬的 Grant:

     如果 EEPROMInit 由于错误而无法初始化、则请在再次调用 EEPROMInit 之前、按照8.4.2.1节复位 EEPROM。  

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

    谢谢查尔斯。  我将执行该操作。