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.

[参考译文] AM2432:重新启动后闪存擦除问题

Guru**** 2872490 points

Other Parts Discussed in Thread: AM2432, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1638751/am2432-flash-erase-problem-after-reboot

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

您好、  

我将 AM2432 与工业 SDK 11.00.00.08 配合使用、

我们的项目涉及使用 S28HS512T 闪存。 我们正在对我们的器件进行断电和上电测试、以验证其行为。 我们观察到、如果在闪存写入操作期间断电、然后在一秒钟后恢复电源、则闪存在重新启动时无法正常工作。

具体来说、读取工作正常、实际上 SBL 和应用程序已正确加载、但擦除会导致进入过度等待(持续时间超过几分钟)的状态。  

该任务执行 Flash_eraseBlk ()-> Flash_norOspiErase ()-> Flash_norOspiWaitReady () 并卡在 FLASH_nor_ospi.c:149-157 的 while 循环中、因为 readStatus 始终为 0x41。 我注意到使用的超时值与 SysConfig 中名为 Flash Busy Timeout 的值相关联、在示例中该值也设置为 256000000。

为什么选择了如此长的超时? 更短、同样可靠的价值是什么? 较短的超时时间可以让我们更快地退出擦除功能、并尝试在不等待几分钟的情况下解决问题。

谢谢您、

此致、

Andrea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid=“623297" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1638751/am2432-flash-erase-problem-after-reboot ]始终为 0x41

    该值与闪存数据表相匹配。

    如果查看闪存数据表中的状态寄存器 1、值 0x41h 表示位 7 和 0 设置为 1。 这意味着:

    1. 先前的编程操作失败
    2. 器件/闪存尚未准备好接受新的编程操作。

    请允许我们稍后再发表评论。

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

    您好、

    因此、需要持续轮询状态寄存器 1、直到位值 1 恢复为 0。 我要讨论的位是 BUSY 位、更正式的是状态寄存器 1 中的 RDYBSY 位 0。

    尝试次数不应是固定值、但 至少应是几秒钟。

    对于您的用例、您可以按如下方式进行更新:

    等待时间应为最大值(当前写入的字节数,写入整个闪存)-->因此写入整个闪存所需的时间+再写入几秒、应该是理想的时间。

    如果您理解我的解释、请告诉我、以便我提出建议并咨询软件开发团队。

    期待您的答复。

    此致、
    Vaibhav

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

    你好、Vaibhav、

    感谢您的答复。 现在我了解了为什么为闪存繁忙超时选择了较长超时。

    同时、我可以更好地了解我的案例中发生的情况:在闪存块擦除操作期间断电。 当应用程序重新启动时、它期望块已成功擦除(因为它读取的是已擦除的第一个字节)、它会尝试执行写入操作但失败、然后尝试擦除块但会卡住等待。

    以下是发生情况的示例:

    status = Flash_offsetToBlkPage(gFlashHandle[0], offset, &blk, &page);
    status = Flash_eraseBlk(gFlashHandle[0], blk);
    status = Flash_write(gFlashHandle[0], offset, buffer, 1000);
    // status = Flash_eraseBlk(gFlashHandle[0], blk); // Here erase operation starts but is not completed because of poweroff
    status = Flash_write(gFlashHandle[0], offset, buffer, 1000); // Here the call fails because the application thinks the block has already been deleted, but it hasn't because of poweroff
    status = Flash_eraseBlk(gFlashHandle[0],blk);  // Here the application get stuck in wait

    现在、我实现了一个解决方案、如果检测到写入错误、则会触发热复位。 这允许应用程序退出等待循环、并在下一次运行时清除块、因为它检测到前几个字节未因部分写入而被擦除。 这似乎解决了问题、但我不确定它是最佳解决方案。

    您对如何解决此问题有什么想法吗?

    谢谢您、

    此致、

    Andrea

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

    您好、Andrea、

    在我们的驱动程序中、我看到对于擦除操作、我们只是等待并检查器件繁忙位、这意味着我们会轮询器件何时(在本例中为我的外部串行 NOR 闪存)准备好接受新操作。

    我想了解您的应用流程、因为我提出了几个问题:

    1. 当您说关闭电源时、是否仅在写入期间关闭? 然后您会面临这一挑战吗? 我相信是的。
    2. 断电是仅针对 SoC、闪存还是仅针对两者关闭? 我想两个。

    此致、

    Vaibhav