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/TMS570LC4357:使用 F021闪存库进行闪存编程时出现问题。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/577279/ccs-tms570lc4357-issue-in-flash-programming-using-f021-flash-library

器件型号:TMS570LC4357

工具/软件:Code Composer Studio

大家好、  

我们目前正在为器件“TMS570LC43X”开发 F021闪存。  我们使用 的是“F021_API_CortexR4_BE_L2FMC_V3D16.lib”库文件。  

目前、我们在编程方面面临着一个问题。 也就是说 ,编程后错误地写入数据。 请参阅下面的更多详细信息。

我们使用数组 “unsigned char Data[32]={'a'、'B'、'C'、'D'、'A'写入数据, 'b'、'C'、'D'、'A'、'B'、'C'、'D'、'A'、 'b'、'C'、'A'、'B'、'C'、'A'、'B'、 'C'、'A'、'B'、'C'、'A'、'B'、'C'、 'A'、'B'、'C'、'A'、'D'};'。

但编程后,数据将写入“41420344”而不是“41424344”。  我们只能在系统/软件复位后读取这个错误的日期。 如果没有复位,内存位置将填充“FFFFFFFF”。

注意:我们正在从组0执行代码并在地址0x0022 0000 (扇区1)处对组1进行编程。 我认为、当它写入不同的组(组1)时、从 RAM 执行代码并不是强制性的。  

编程和初始化函数是

 

#include“f021.h”  

无符号字符数据[32]={'A'、'B'、'C'、'D'、'A'、 'b'、'C'、'D'、'A'、'B'、'C'、'D'、'A'、 'b'、'C'、'A'、'B'、'C'、'A'、'B'、 'C'、'A'、'B'、'C'、'A'、'B'、'C'、 'A'、'B'、'C'、'A'、'D'};

 

void main()

长地址_2[1]={0x00220000};

               Fapi_initializeFlashBanks (150); //HCLK 时钟为150MHz。

        Fapi_StatusType return_chcek;
         Fapi_setActiveFlashBank (1);
        Fapi_enableMainBankSectors (0xFFFF);

   

               while (fapi_check_FSM_ready_busy =fapi_Status_FsmBusy);

   

               while (fapi_get_FSM_status!= fapi_Status_Success);

 

               if (fapi_check_FSM_ready_busy = fapi_Status_FsmReady)

                {

               return_chcek = fapi_issueProgrammingCommand ((long *) 0x00220000、Data、sizeof (Data)、0、0、fapi_DataOnly);

               while (fapi_check_FSM_ready_busy =fapi_Status_FsmBusy);

               while (fapi_get_FSM_status!= fapi_Status_Success);

                }

 

while (1)

/*不做任何事情。*

 

 

 

请帮我们解决问题。

 

提前感谢

普拉米斯

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

    您好 Pramith、

    调用 Fapi_initializeFlashBanks (150)以初始化闪存组后、请 执行状态检查以确保初始化成功。

     

    if (((fapi_initiatalizeFlashBanks ((uint32_t) SYS_CLK_FREQ))= fapi_Status_Success){

    () Fapi_setActiveFlashBank ((Fapi_FlashBankType) Bank);

    () Fapi_enableMainBankSectors (0xFFFF);//用于 API 2.01*/

    }否则{

    返回(1);

    此致、

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

    感谢您的回复。
    我们已根据您的建议进行了尝试。 但仍然没有改善。

    请提供更多解决此问题的技巧。

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

    这听起来像是 ECC 没有写入闪存、因为只有一个位读取不同(一个位纠错)。 对于您使用的器件、您必须生成正确的 ECC 并将其写入闪存、因为闪存包装程序(我认为)始终会在需要时执行 ECC 检查和校正。
    对于 L2FMC,您必须使用命令 Fapi_enableAutoEccCalculation ()启用 ECC 自动生成,如参考指南(SPNU501G)第12页所述。 我还缺少 Fapi_issueProgrammingCommand 中的 Fapi_AutoEccGeneration Mode 开关(第19页)。

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

    尊敬的 Christian:

    感谢您的回复。

    我们已经尝试了 fapi_enableAutoEccCalculation ()。 但闪存编程没有明显变化。    Fapi_issueProgrammingCommand()中的 Fapi_AutoEccGeneration 模式无法按预期工作,因此我们使用 了 Fapi_DataOnly 模式。

    我们正在附加示例项目(.zip 格式。) 针对此处上述器件的闪存组1、扇区1的编程和擦除而创建。

    e2e.ti.com/.../0116.flashprogramming.7z



    /cfs-file/__key/communityserver-discussions-components-files/312/8585.flashprogramming.7z


    注:

    对示例工程进行编程时、控制器接收到字符"A"后、将启动程序、一旦接收到字符"B"、擦除操作就会执行。 我们还添加了用于在闪存和擦除时显示当前存储器内容的代码。

    请帮助我们继续前进。

    提前感谢、

    Pramith P.

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

    您好 Pramith、

    我检查了您的代码并提出了以下意见:

      • 未启用自动 ECC 生成:

        • fapi_enableAutoEccCalculation ();

        • fapi_issueProgrammingCommand ((uint32_t *) Address、Data、16、0、0、Fapi_AutoEccGeneration);

      • 程序的数据缓冲区大小设置为16字节、但主存储区宽度为32字节(256位(+ 32位 ECC))。 这可能是一个问题。

        • fapi_issueProgrammingCommand ((uint32_t *) Address、Data、16、0、0、Fapi_AutoEccGeneration);

      • BANK1的 ECC 在 LCF 中生成、这意味着必须在尝试对任何内容进行编程之前先擦除组1、否则 ECC 将不匹配。

        • 被擦除、但 ECC 被生成、显示全部1 (0xFF):

        • EASed,显示了由于 ECC 校正而产生的“随机”数据:

      • 数据缓存已启用

        • “隐藏”新编程的数据。

        • 简单的_dCacheInvalidate_();将使正确的数据显示:

          但也“擦除”所有变量:


           要解决此问题、请将 SRAM 配置为写入槽

      • 或者更好地使用附加项目中包含的新缓存维护功能

        • 首先清理(刷新),然后使缓存无效:coreCleanInvalidateDC();

    此致、
    Christian


    e2e.ti.com/.../0844.LC43-Flash-Example.zip

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

    如果您的上述问题已得到解决、您能否验证答案?

    谢谢、
    Christian