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.

[参考译文] CCS/TMS320F28377D:代码中的闪存读取问题

Guru**** 2535150 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/602912/ccs-tms320f28377d-flash-reading-issue-from-code

器件型号:TMS320F28377D

工具/软件:Code Composer Studio

您好!

我正在开发一个代码、将一些数据存储到闪存中以用于配置。 我使用的是闪存 F021 API。 我能够存储我需要的所有参数、并且可以在 CPU 复位后读取其中的大部分参数。 该问题出现在一些闪存地址、在这些地址中、我能够从 CCS 的内存浏览器选项卡中看到正确的值、但当该值被复制到局部变量时、一个位被设置为1 (如果不擦除整个闪存扇区、这是不可能的):


uint16_t u16TempBuf;

u16TempBuf =* ptInstance->pu16ReadPoint;

 为 pu16ReadPoint 是指向所需闪存地址的指针。 例如、如果闪存中的值为0x0010、当它被复制到变量 u16TempBuf 时、我将读取0x0410。

这种情况只在某些地址发生、并且是重复的、因此每次我加载代码时、相同的地址都会受到影响(我始终存储相同的数据)。

为了获得可靠的读取、我需要做一些特别的事情来读取闪存地址上的内容?

谢谢!

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

    如何配置系统频率和等待状态?

    谢谢、此致、
    Vamsi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    系统频率为200MHz、RWAIT 设置为3。 我尝试将 RWAIT 增加到8、但结果是相同的。

    此外、我还尝试删除数据指令缓存和预取、但它仍然读取错误。

    如果我弄清楚一些东西、我会不断更新。

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

    您已根据频率正确配置等待状态。

    您说过、编程后、您可以通过调试器存储器窗口在闪存中看到正确的数据。 这告诉我您已正确编程。 但如果是这样、验证是否在程序完成后成功通过了?

    您是否使用 AutoEccGeneration 模式对数据的 ECC 进行了编程?

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

    首先、感谢您的快速回复。

    我想我已经解决了这个问题、但我仍在验证闪存中的所有数据。 我没有使用 AutoEccGeneration、因为由于自动 ECC 生成、如果我在同一个组(在不同地址)上写入两次、它会失败、因此我使用的是 Data_Only 模式。 在该模式下、验证失败、但闪存中的数据正常。 我在不同地址的同一个组中写入两次、因为我的应用程序不知道传入数据的大小。

    我开始认为我也需要写入 ECC (我不确定这个部分)、所以我在使用 ecc_only 模式和 fapi_calculateEcc 将64位写入闪存后写入该部分、但我做了一些错误、因为验证和读数也失败了。

    最后、我将代码更改为具有64位的小缓冲区、因此我仅在该缓冲区已满时写入闪存、然后我可以使用 AutoEccGeneration、验证和读数看起来正常工作。

    我将保留此解决方案、但要知道、是否可以为 F28377D 器件独立写入数据和 ECC?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Javier、

    您可以单独对数据和 ECC 进行编程-但是、正如 SPNU629文档中提到的那样、一次对所有64位数据进行编程是有限制的。  因此、如果您在目标 MCU 上使用闪存 API、实现 ECC 的最佳方法是使用 AutoEccGeneration。

    如果您想分别对64位数据和 ECC 进行编程,则可以使用 Fapi_calculateEcc()函数计算 ECC 并使用 EccOnly 模式进行编程。  请注意,Fapi_calculateEcc()需要您按照 SPNU629中的说明将提供给它的地址左移。  不过、您必须一次对所有64位数据进行编程。

    谢谢、此致、
    Vamsi