器件型号:LP-MSPM0G3519
工具与软件:
大家好、团队成员:
我正在尝试使用 ECC 在数据闪存0x41D00000中一次只写入4字节的数据。
第一次写入是成功的、但当下一个4字节试图写入0x41D00004时、该值会在0x41D00000处被覆盖。
这是否真的要在命令被 CMDBYTEN 传递为0x0000010F 时一次只实现4字节写入?
请帮助我理解我出错了什么地方。
谢谢。
此致、
以斯瓦尔
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 在数据闪存0x41D00000中一次只写入4字节的数据。
第一次写入是成功的、但当下一个4字节试图写入0x41D00004时、该值会在0x41D00000处被覆盖。
这是否真的要在命令被 CMDBYTEN 传递为0x0000010F 时一次只实现4字节写入?
请帮助我理解我出错了什么地方。
谢谢。
此致、
以斯瓦尔
感谢您的答复。
我正在尝试写入已擦除存储器、先写入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 错误。