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-MSPM0G3519:仅对数据闪存中带 ECC 的4字节进行编程

Guru**** 2462060 points
Other Parts Discussed in Thread: LP-MSPM0G3519

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1479875/lp-mspm0g3519-program-for-only-4-byte-with-ecc-in-data-flash

器件型号:LP-MSPM0G3519

工具与软件:

大家好、团队成员:

我正在尝试使用 ECC 在数据闪存0x41D00000中一次只写入4字节的数据。

第一次写入是成功的、但当下一个4字节试图写入0x41D00004时、该值会在0x41D00000处被覆盖。

这是否真的要在命令被 CMDBYTEN 传递为0x0000010F 时一次只实现4字节写入?

请帮助我理解我出错了什么地方。

谢谢。

此致、

以斯瓦尔  

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

    擦除后、闪存以全部为0xFF、之后您只能将1更改为0、不能将0更改为1。 您必须先擦除全部0xFF。

    这是您看到的吗?

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

    感谢您的答复。

    我正在尝试写入已擦除存储器、先写入0xFF、然后仅触发写入操作。

    首先、我尝试在地址0x41D00000处写入0xABCDEF00 -成功写入并反映在存储器中。

    然后是地址0x41D00004处的0x12345678;此处结束输出为值0x0204 4600、即0x41D00000处的两个值。

    因此、是的、值从1变为0。

    要写入0x41D00004的数据在0x41D00000重叠的原因何在?

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

    尊敬的 Eswaran:  

    您是否正在使用我们的 driverlib API 将数据写入存储器? 还是手动写入寄存器?  

    您可以一次写入闪存的32位而不会重叠数据、这在我看来像是一个实现错误。

    如果要一次写入32位、CMDBYTEN 看起来应该为0x0000000F。 我建议您查看 dl_flashctl.c 和 dl_flashctl.h 中的源代码、以了解有关如何发出此类闪存控制器命令的示例。

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

    尊敬的 Dylan:

    感谢您的答复。

    我使用此函数、使用现有的 driverlib API 来编写 DL_FlashCTL_programMemory32 of dl_flashctl.c 初始文本文件。

    每次写入后、我都会将地址递增+4、以使用上述相同的函数将其写入下一个地址。  

    但在执行该操作时、可以观察到重叠。

    使用替代方法:  

    在查看数据表时、我们提到只能写入8个字节、即使用户希望一次写入2个字节或4个字节也是如此

    应按照下图所示使用 CMDBYTEN、CMDAA0以及 CMDAA1。

    虽然有这一个引用,我能够一次写入4字节,但必须做它下面的 snip。 现在、写入成功、但在读取 ECC 时会引发问题、并在默认处理程序中挂起。

    这两个函数之间的区别在于、将调用函数流程下具有8个字节的地址对齐。 在成功完成后、写入会成功、但读取仍然是问题。

    请向我提供您对此的反馈。

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

    Eswaran,

    读回我们的文档时、看起来您需要向闪存控制器传递一个8字节对齐的地址、然后使用 CMDBYTEN 屏蔽要写入的字节。  

    您从 TRM 中获得的第一个屏幕截图是正确的。 我看不到您对所有新测试函数的定义、但是如果您按照上面列出的过程操作、并且能够看到内存按预期发生变化、那么我认为您可以继续操作。 我将注意到、我们确实需要检查 flashctl 源代码、因为所提供的 API 似乎只能写入一个字的低32、16、8位。

    我想您会发现 ECC 存在问题、因为您写入闪存字而不需要先进行擦除。 ECC 中的一些位可能在第一次写入时被清除、然后在第二次写入时需要对其进行设置。 由于写入只能清除位、因此该位保持清零状态、因此该字整体未通过 ECC 校验。  

    解决此问题的最简单方法是在写入前擦除或一次仅写入64位。 您可以在 SRAM 中保留一个缓冲区、以便在写入之前先保存前32位、然后保存后32位、从而避免 ECC 错误。