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.

[参考译文] AM2431:断电期间发生 OSPI 故障

Guru**** 2457760 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1474379/am2431-ospi-malfunction-during-power-off

器件型号:AM2431

工具与软件:

OSPI 连接到闪存、并与单个 I/O 总线一同使用。

OSPI 仅在引导期间读取。

该程序旨在仅在插入 USB 时才将 USB 数据写入闪存。

当前、由于未插入 USB、因此在引导后无法访问。

在这种状态下、如果电源关闭、则可能存在 OSPI 访问。

我在断电期间用一个示波器检查了被发送至闪存存储器的命令。

在大多数情况下、该命令为读取命令(03h)或 (00h)。

在极少情况下、发送写入使能命令(06h)和页编程命令(02h)。

由于页面程序在断电期间发生、因此会在中途切断电源、并且闪存中的数据会损坏。

在访问闪存或不在断电期间、电源电压似乎没有差异。

问题1。 在断电期间、CPU 是否不可避免地发生故障并访问闪存?

如果在断电期间执行读取命令、则不是问题。 但是、我希望避免执行页面程序。

问题2: 是否有办法避免这种情况?

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

    您好!

    在此状态下、如果电源关闭、则可能存在 OSPI 访问。

    首先、我想了解的是、关闭电源后、如何访问 OSPI? 不应该发生任何事情对吗?

    Unknown 说:
    由于页面程序是在断电期间发生的、电源会在中间切断、闪存中的数据会损坏。

    我的理解: 这意味着写入操作尚未正确完成、因此发生了数据损坏。 尽管信标将负责原子写入、但由于电源在中间切断、因此出现了问题。

    此致、

    Vaibhav

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

    您好!

    我们预计在系统断电时不会进行 OSPI 访问。  

    但是、在断电过程中会意外发生 OSPI 访问。

    我们怀疑 CPU 中可能存在导致故障的错误。

    在断电过程中、页面程序会意外执行、且写入操作未完成、从而导致数据损坏。

    此致、

    二师

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

    尊敬的 Vaibhav:

    如果您需要更多详细信息、或者需要 Kawarazaki-San 提供的 OSPI 引脚/闪存相关原理图、请告知他。

    此致、

    Mari Tsunoda.

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

    您好!

    Unknown 说:
    单路 I/O 总线。

    这实质上意味着1s-1s - 1s 运行模式、对吧?

    我想在我的 TI EVM 设置中了解这是否符合预期(实际上不符合预期)。 但对我来说、找到 TI EVM 本身将是一件好事。

    仅供参考、 出现了与当前客户无关的另一个问题、我将在该问题中探测 AM64x 并检查数据线。

    我将关闭电源并在结束时检查多个周期的行为、如果看不到类似的行为、则需要您的原理图以便硬件团队进行审查。

    当我使用 TI EVM 的 OSPI 数据线焊接时、我将能够这样做。 一旦完成,我会让你张贴在这里。

    感谢您的耐心。

    此致、

    Vaibhav

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

    您好!

    这基本上意味着1s-1s - 1s 模式的运行。

    如果您需要电路图、请告诉我。  

    以下是参考信息。

    我测试了三种类型的 PCB。

    两种类型的 PCB 会出现此问题。

    使用一种类型的 PCB 时、不会发生该问题。

    我相信、断电过程中的电源电压差异是导致某些 PCB 出现问题的原因、而另一些 PCB 不会出现问题。

    此致、

    二师

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

    您好!

    当 OSPI_CONFIG_REG 中的 ENB_SPI_FLD 位设置为0时、在断电期间不会访问 OPSI。

    我正在考虑实施以下控制措施以避免出现此问题:

    ・使用 OSPI 时、将 ENB_SPI_FLD 位设置为1。

    ・ 后、将 ENB_SPI_FLD 位设置为0。

    您能告诉我此控制是否有任何问题吗?

    我担心在不使用时将 ENB_SPI_FLD 位设置为0是否会产生负面影响。

    此致、

    二师

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

    尊敬的 Vaibhav:

    您能回答 Kawarazaki-San 的问题吗?

    [报价 userid="550444" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1474379/am2431-ospi-malfunction-during-power-off/5672278 #5672278"]

    我正在考虑实施以下控制措施以避免出现此问题:

    ・使用 OSPI 时、将 ENB_SPI_FLD 位设置为1。

    ・ 后、将 ENB_SPI_FLD 位设置为0。

    您能告诉我此控制是否有任何问题吗?

    [报价]

    您是否能够在自己的终端上进行测试?

    当我使用 TI EVM 的 OSPI 数据线焊接时、我将能够做到这一点。 一旦完成,我会让你在这里张贴。[/报价]

    此致、

    Mari

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

    您好!

    非常感谢您的耐心。

    [报价 userid="550444" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1474379/am2431-ospi-malfunction-during-power-off/5672278 #5672278"]

    我正在考虑实施以下控制措施以避免出现此问题:

    ・使用 OSPI 时、将 ENB_SPI_FLD 位设置为1。

    ・ 后、将 ENB_SPI_FLD 位设置为0。

    [报价]

    有趣的信息、让我快速浏览 TRM 并在 OSPI 操作结束后在结束时检查此位字段。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    进展如何?

    请在本周结束之前提供有关解决方法的回复。

    此致、

    二师

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

    您好!

    在应用级别、SPI ENB FLD 始终设置为1。 我在运行仅从闪存写入和读取的 OSPI 应用程序时观察到的情况、这里不会将其清零。 原因是该位的复位值本身为1。

    我还观察到、即使在驱动程序关闭时、也没有将其设置为0。

    我想您可以继续将其设置为0、但将其设置为0/1意味着以下含义:

    当 ENB_SPI_FLD = 0时、控制器在完成当前事务后停止使用八进制 SPI。

    当 ENB_SPI_FLD = 1时、八通道 SPI 接口被启用并主动用于通信。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    问题1。 您认为执行以下控制时可能会出现任何问题吗?

    ・使用 OSPI 时、将 ENB_SPI_FLD 位设置为1。

    ・ 后、将 ENB_SPI_FLD 位设置为0。

    问题2:  您是否观察到在断电期间执行 OSPI 访问的现象?

    问题3。  你有没有弄清楚原因?

    我希望在本周结束之前收到对问题1的答复。

    此致、

    二师

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

    您好!

    我将按照您所问的顺序回答您的问题。

    [报价 userid="550444" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1474379/am2431-ospi-malfunction-during-power-off/5693569 #5693569"]

    问题1。 您认为执行以下控制时可能会出现任何问题吗?

    ・使用 OSPI 时、将 ENB_SPI_FLD 位设置为1。

    ・ 后、将 ENB_SPI_FLD 位设置为0。

    [报价]

    应该不会有任何问题、因为到目前为止、其他线程都不会调用 OSPI 操作(考虑到您使用的是多线程环境/设置)。

     您是否观察到在断电期间执行 OSPI 访问的现象?

    我根本没有观察到这种现象、因为一旦我关闭 TI EVM 电源、我就看到所有线路都刚刚恢复到其原始状态、例如全部线路都变为低电平。 这里所说的所有线路都是指用于 OSPI 通信的时钟、CS 和数据线路以及其他线路。

    在我的设置中、上电后没有发生页面程序/未定义的操作。

    Q3。  您是否找出了原因?

    至少在我的设置中、没有任何这样的东西可以找到、因为在我的设置中、它不可重现。 我在回答您的第二个问题时强调了这一点。

    [报价 userid="550444" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1474379/am2431-ospi-malfunction-during-power-off "]该程序旨在仅在插入 USB 时才将 USB 数据写入闪存。[/QUOT]

    但我们可以围绕这一点找出一些东西。 请参阅我的后续答复。

    此致、

    Vaibhav

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

    将我的后续回复分开、以确保它得到正确突出显示。

    [报价 userid="550444" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1474379/am2431-ospi-malfunction-during-power-off "]

    OSPI 仅在引导期间读取。

    该程序旨在仅在插入 USB 时才将 USB 数据写入闪存。

    [报价]

    我假设发生的读取操作是在低级别调用 OSPI_readDirect () API,而对于写入,则调用 OSPI_writeIndirect ()。

    您能确认相同吗? 还需说明您正在用于开发的 MCU PLUS SDK 版本。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    OSPI_readDirect()和 OSPI_writeIndirect ()被调用。

    MCU PLUS SDK 版本为 08.03.00.18

    此致、

    二师

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

    您好!

    感谢您的耐心。

    我鼓励您继续使用最新的 SDK、因为在 OSPI 以及其他驱动器中进行了大量改进。

    但是、如果您想继续使用当前 SDK、我会回到之前的 SDK、检查读取和写入的实现方式。

    请允许我稍后再谈这个问题。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    我想使用版本08.03.00.18 、因为它已经用于已交付的产品中。

    此致、

    二师

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

    您好!

    感谢您的答复。

    我想继续使用版本08.03.00.18 、因为它已经用于已发运的产品中。

    好的,我明白你要坚持到提到的版本.

    我已经检查了8.03的源代码、并将其与最新的 SDK 产品进行了比较、API readDirect 和 writeIndirect 没有太大差异。

    因此、从软件的角度来看、我可以说这种突然的页面编程应该没有发生。

    但是、您可以尝试合并一项更改、并告诉我它是否有一定的帮助。

    我希望您转到 API OSPI_readDirect 并进行以下更改:

    int32_t OSPI_readDirect(OSPI_Handle handle, OSPI_Transaction *trans)
    {
        int32_t status = SystemP_SUCCESS;
        const OSPI_Attrs *attrs = ((OSPI_Config *)handle)->attrs;
        OSPI_Object *obj = ((OSPI_Config *)handle)->object;
        const CSL_ospi_flash_cfgRegs *pReg = (const CSL_ospi_flash_cfgRegs *)(attrs->baseAddr);
    
        uint8_t *pSrc;
        uint8_t *pDst;
        uint32_t addrOffset;
    
        addrOffset = trans->addrOffset;
        pDst = (uint8_t *) trans->buf;
    
        /* Enable Direct Access Mode */
        CSL_REG32_FINS(&pReg->CONFIG_REG,
                       OSPI_FLASH_CFG_CONFIG_REG_ENB_DIR_ACC_CTLR_FLD,
                       1);
        CSL_REG32_WR(&pReg->IND_AHB_ADDR_TRIGGER_REG, 0x04000000);
    
        pSrc = (uint8_t *)(attrs->dataBaseAddr + addrOffset);
    
        /* DMA Copy fails when copying to to certain memory regions. So in this case we switch to normal memcpy
           for copying even if dmaEnable is true. Also do DMA copy only if size > 1KB*/
        uint32_t isDmaCopy = (attrs->dmaEnable == TRUE) &&
                             (OSPI_isDmaRestrictedRegion(handle, (uint32_t)pDst) == FALSE) &&
                             (trans->count > OSPI_DMA_COPY_LOWER_LIMIT);
    
        if(isDmaCopy == TRUE)
        {
            uint8_t *tempSrc = pSrc;
            uint8_t *tempDst = pDst;
            uint32_t remainingBytes = trans->count;
    
            /* Check for 32B alignment of source address */
            if(((uint32_t)pSrc % OSPI_DMA_COPY_SRC_ALIGNMENT) != 0)
            {
                uint32_t initResidualBytes = OSPI_DMA_COPY_SRC_ALIGNMENT - (((uint32_t)pSrc) % OSPI_DMA_COPY_SRC_ALIGNMENT);
    
                /* Do CPU copy for the initial residual bytes */
                memcpy(pDst, pSrc, initResidualBytes);
    
                tempDst = (uint8_t *)((uint32_t)pDst + initResidualBytes);
                tempSrc = (uint8_t *)((uint32_t)pSrc + initResidualBytes);
                remainingBytes -= initResidualBytes;
            }
    
            /* Do DMA copy for 32B-aligned bytes */
            uint32_t unalignedBytes = (remainingBytes % OSPI_DMA_COPY_SIZE_ALIGNMENT);
    
            if(attrs->phyEnable == TRUE)
            {
                /* Enable PHY pipeline */
                CSL_REG32_FINS(&pReg->CONFIG_REG,
                       OSPI_FLASH_CFG_CONFIG_REG_PIPELINE_PHY_FLD,
                       TRUE);
            }
    
            OSPI_dmaCopy(obj->ospiDmaHandle, tempDst, tempSrc, remainingBytes - unalignedBytes);
    
            if(attrs->phyEnable == TRUE)
            {
                /* Disable PHY pipeline */
                CSL_REG32_FINS(&pReg->CONFIG_REG,
                       OSPI_FLASH_CFG_CONFIG_REG_PIPELINE_PHY_FLD,
                       FALSE);
            }
    
            /* Do a CPU copy of unaligned bytes if any */
            if(unalignedBytes > 0)
            {
                tempDst += (remainingBytes - unalignedBytes);
                tempSrc += (remainingBytes - unalignedBytes);
                memcpy(tempDst, tempSrc, unalignedBytes);
            }
        }
        else
        {
            memcpy(pDst, pSrc, trans->count);
        }
    
        // disable dac mode(newly added as of 03/11/2025)
        CSL_REG32_FINS(&pReg->CONFIG_REG,
                        OSPI_FLASH_CFG_CONFIG_REG_ENB_DIR_ACC_CTLR_FLD,
                        0U);
        CSL_REG32_WR(&pReg->IND_AHB_ADDR_TRIGGER_REG, 0);
    
        return status;
    }

    请注意、API 末尾有一个小的变化、在读取操作完成后、我禁用 DAC 模式。 我这样做了,因为这应该是怎样的,也是最新的提供这样做。

    请按照所述进行更改、并使用以下命令重新构建库:

    请告诉我这是否有助于解决问题。

    否则、这与软件代码本身没有关系、必须为以下代码或其他代码。

    我认为断电过程中电源电压的差异是导致某些 PCB 出现问题的原因所在、而不是其它 PCB 出现问题的原因

    期待您的答复。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    由于更改了 OSPI_readDirect、断电时不会访问 OSPI。

    问题1。 DAC 是否出现故障?

    问题2: 禁用 DAC 模式是否会产生任何影响?

    问题3。  是否有必要在牢记 DAC 模式被禁用的情况下修改更高级别控制?

    此致、

    二师

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

    尊敬的 Vaibhav:

    除了以上内容、请告诉我以下几点:

    问题4。 如果将评估环境中的 SDK 降级到版本08.03.00.18、是否会发生此问题

    此致、

    二师

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="550444" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1474379/am2431-ospi-malfunction-during-power-off/5708609 #5708609"]

    由于更改了 OSPI_readDirect、断电时不会访问 OSPI。

    问题1。 DAC 是否出现故障?

    问题2: 禁用 DAC 模式是否会产生任何影响?

    问题3。  是否有必要在牢记 DAC 模式被禁用的情况下修改更高级别控制?

    [报价]

    我很高兴我提议的修复不再出现问题。

    引入 DAC 禁用的原因是、当 DAC 启用时、我们已经看到对闪存进行了一些访问、因此最好在我们退出 OSPI_readDirect 后将其禁用。

    [报价 userid="550444" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1474379/am2431-ospi-malfunction-during-power-off/5713849 #5713849"]Q4。 如果将评估环境中的 SDK 降级到版本08.03.00.18、会发生此问题吗?[/QUOT]

    是的、如果我降级、会发生这种情况。

    但它在最新的版本中得到了修复。

    如果我的上述回答对您有帮助、请将其标记为已解决。

    此致、

    Vaibhav