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.

[参考译文] TMS570LS1224:CPU 从闪存中读取错误的数据

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1016267/tms570ls1224-cpu-reads-wrong-data-from-the-flash-memory

器件型号:TMS570LS1224

您好!

我已经根据 SPNU501H 和 SPNA148对擦除/写入闪存功能进行了编程。 它工作正常–存储器被擦除并重新编程。 之后、我 希望以相同的方式将 CRC 值写入闪存。

但是–当我读取 CRC 值(比如0xF9A1)应该在哪里的位置(蓝色突出显示)时、有0xFFFF。 这似乎是 ECC 错误、但...  

有趣的是、当我读取(在 CCS 存储器浏览器中)一个不同的位置时(只有当我单击 Enter 选择它时、滚动不会产生这种影响)、然后我返回并读取正确的位置- voila - CRC 值就在那里。 当我复位 CPU 时也会发生同样的情况- CRC 值在那里-即使在启动期间启用 ECC 检查也是如此。

直到 CRC 值被正确读取–写入 CRC 位置会给出 OK_STATUS (如果我在这些尝试期间修改 CRC 值、则在读取 CRC 值之后–这是我尝试写入的第一个值)。

CRC 可以正确读取之后(由我在上面描述的方式引起)–写入 CRC 位置会产生错误–数据已存在。

完成擦除和写入操作后、我清空流水线。 我在仅使用 F021应用程序时未遇到相同的错误、另一方面 、可能是另一个导致此问题的代码更改。

您是否有什么想法会导致这种神秘的行为? 数据似乎已经在这里、但 CPU 无法读取它们... 仅在 CCS 存储器浏览器中发生复位或同时读取其他位置时才会发生。

此致、

Tomas

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

    更新:
    1) 1)当我在写入 CRC 之前关闭 ECC 校验时、一切都正常。 但 专用 ECC 存储器中的 ECC 片段(我想它是0xF0402000)对我来说似乎是可以的-对于第一个非空数据字为0x2E、对于空白数据剩余部分为0xFF。

    2) 2)是否使用 F021 API 不起作用。

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

    Tomas、您好!

    1:Flash 存储 器只允许将1更改为0、因此编程前应该擦除存储器。 将数据写入未擦除的闪存位置不会将新数据正确编程到闪存中。

    调用 F021闪存 API 时: Fapi_issueProgrammingCommand (...) 若要对数据进行编程、如果 启用了 Fapi_AutoGeneration、则会计算 ECC 并将其编程到相应的 ECC 区域。  

    3.我不知道 CCS 存储器浏览器为什么不显示闪存内容。 关闭/重新打开内存浏览器是否有帮助? 您可以读回代码中的数据、以确保数据被成功写入。

      FLASH_DATA = *(uint32_t *) Flash_Address;

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

    QJ Wang、您好!

    感谢您的回答!

    1) 1)这很清楚

    2) 2)我根据  SPNA148使用我自己的函数、它的工作原理是 -如 下图所示、0x10010和其他位置被擦除和重新编程:

    0x10000 (CRC 位置)也被擦除、但尚未编程

    3) 3)我使用类似的语法、谢谢。 关闭并重新打开内存浏览器也会有所帮助。

    我会用不同 的语言来表达问题 -

    (a) I 编程 CRC 值

    (b)在 CCS 存储器浏览器中、我可以看到0x10000 - 0x10010存储器的 ECC 位发生了变化:

    (C)但在 CCS 存储器浏览器中都不能、在代码中我都看不到 CRC 值(例如0x100)

    (D)如果我尝试将不同的数据(例如0x200)写入 CRC 位置、那么它将不起作用

    (e)由于 在 CCS 存储器浏览器中发生复位或同时读取不同位置后、存在0x100 -现在我可以看到(或代码)可以看到 CRC 值

     

    问题是-为什么我(或代码)在(c)时看不到 CRC 值-有正确的 ECC 位、以及(d)数据在第一次尝试时清楚地写入到位置。 和(e)为什么在 CCS 存储器浏览器中重置或读取其他位置有用?

    此致、

    Tomas

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

    这是我的测试。 我将8字节数据编程为0x10000、将64字节数据编程为0x10100。 闪存 ECC 被禁用:

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

    感谢 QJ Wang -您是否还可以根据  SPNA148中的"对128位数据和16位 ECC 进行编程示例"一章来测试闪存的编程? 因为这是我使用的东西。

    我还没有找到错误、但我发现、如果我将 CRC 值写入从 0x10000 (0x10008)移位的8个字节的位置、则一切正常。 CPU 在 扇区4的开头写入数据是否有问题?

    我还想问一下、如何仅对64位进行编程、然后对闪存组宽度的其他64位进行编程? 我有两个困难:

    1) 1)如果我为 已经 存在的另一个 ECC 字节(我之前写过)用0xFF 填充 FWPWRITE_ECC 寄存器、则它的目的是将1写入0。

    2) 2)如果我尝试读取另 一个 ECC 字节(将其写入 FWPWRITE_ECC 寄存器-以便匹配)、如果位置为空、则可能会导致 ECC 错误。

    此致、

    Tom

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

    您好、Tom、

    写入任何位置、包括扇区的开头都不会有问题。 请使用 F021闪存库向闪存写入数据和 ECC。 随附了我的示例 CCS 工程:

    e2e.ti.com/.../TMS570LS1224_5F00_Flash_5F00_Test.zip