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.

F28M35H52C: f021 flash擦除问题

Part Number: F28M35H52C
Other Parts Discussed in Thread: CONTROLSUITE

大家好:

    问个Flash擦除有关的问题。

    我做了段M3核程序prog.bin(C2000没有启动),程序功能是擦除所有flash,然后通过网络重新下载prog.bin,然后后重新烧回flash。现在遇到以下问题:

  1.连接仿真器(xds560v2)运行程序,然后下载,擦除,重新写入都正常完成(通过memory browser观察),完成后的数据也导出来与prog.bin比对过,没有区别。然后在CCS 6.2 DEBUG界面下用reset和restart按钮进行复位,重复下载重新烧写功能失败,打断点发现Fapi_issueAsyncCommandWithAddress运行返回成功,但是对应的区域并未擦除成功。

2.下载程序后直接断电拔仿真器运行,芯片也是擦除失败。怀疑也是Fapi_issueAsyncCommandWithAddress执行问题。

请问大家是否遇到过

  • 你好,工程师将在工作时间为你解答。

  • 您好我们已收到您的问题并升级到英文论坛,如有答复将尽快回复您。谢谢!

  • 然后在CCS 6.2 DEBUG界面下用reset和restart按钮进行复位,重复下载重新烧写功能失败,打断点发现Fapi_issueAsyncCommandWithAddress运行返回成功,但是对应的区域并未擦除成功。

    您好,重复下载和重新烧写过程是什么? F28M35H52C 器件是运行引导加载程序,还是通过 xds560v2 仿真器接口完成所有操作?

    下载程序后直接断电拔仿真器运行,芯片也是擦除失败。怀疑也是Fapi_issueAsyncCommandWithAddress执行问题。

    同时能否请您再解释一下这个过程?什么是断电拔仿真器运行?

  • 重复下载烧写就是说,在完成第一次烧写后,不移除仿真器,直接用CCS debug界面上的reset和restart按钮进行复位,再次通过网络下载固件,烧写。

  • 断电拔仿真器就是说,我把电路板用仿真器烧好程序后,脱离仿真器运行。再进行网络下载固件,烧写的步骤

  • 再提供个线索,在运行Fapi_issueAsyncCommandWithAddress()失败后,检查了一下FSM_STAT寄存器,发现报错,报的是SLOCK error,大概意思就是sector锁定或是OTP锁定。那么问题来了,怎么解锁呢?文档上好像没有提及锁定的事

  • 好的感谢您提供的信息,预计1-2天内给到您答复。

  • 您好,您参考下以下FAQ:3. What are the common debug tips that we can consider when Flash API fails to erase or program?

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/951668/faq-faq-on-flash-api-usage-for-c2000-devices 

    请问您是怎样调用擦除功能的?

  • 我参考了flash_programming_m3工程的写法,用Example_CallFlashAPI()的流程来执行擦除操作,擦除代码、FLASH的lib文件都指定到ram里并检查了map文件确保没有遗漏。网络下载的固件被保存在shared ram里。

    跳过前面的设置阶段,擦除部分代码如下

    for(i=0;i<14;1++)   //14个sector,逐个擦除

    {

    oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,
    (uint32 *)&Bzero_SectorL_start_addr[i]);

    // Wait until FSM is done with erase sector operation
    while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){}

    if(oReturnCheck != Fapi_Status_Success)
    {
    while(1){}
    }

    ///////////////test
    oFlashStatus = Fapi_getFsmStatus();
    if(oFlashStatus != 0)
    {
    while(1){}
    }

    ////////////////test

    oReturnCheck = Fapi_doBlankCheck((uint32 *)Bzero_SectorL_start,
    Bzero_16KSector_u32length,
    &oFlashStatusWord);
    if(oReturnCheck != Fapi_Status_Success)
    {
     whiel(1){}         //////////////////////擦除失败时跳到这里,然后添加了test程序段检查FSMSTAT寄存器,发现sector被锁,故障代码是0x0011(17)
    }

    }

    whiel(1){}         //////////////////////擦除成功时跳到这里

  • 看了FAQ,我对照了一下例程,发现例程里没有

    d. Initialize Flash wait-states, fall back power mode, performance features and ECC

    f.  EALLOW (C28x) or MWRALLOW (ARM) should be executed before calling Flash API functions to allow writes to protected registers.

    有没有影响?

  • 抱歉回复晚了。

    在使用闪存 API 之前,必须包括闪存初始化例程 (用于wait-state配置) 和 EALLOW (C28x) 或 MWRALLOW (ARM)。 您试下实施这些。

  • 闪存如何初始化?请给个实例。MWRALLOW (ARM)我只是在Example_CallFlashAPI()中没找到,是不是封装在Flash API functions里面了。

    因为我的程序在某些条件下也是能运行成功的,是不是可以不用考虑这些地方

    我主要是怀疑sector的擦写在特定条件下被锁了,有没有解锁方法?

  • 再帮您跟进给工程师问下哈,有新的进展会尽快给到您。

  • 您好,关于锁,发生故障时,在内存窗口中的值是多少?请您确认下。

    以及有没有对任何密码进行编程?

    请参阅以下代码中的 MWRALLOW : \controlSUITE\device_support\f28m35x\v220\F28M35x_examples_Dual\flash_prog\m3\flash_programming_m3.c

    在同一文件中,您可以看到闪存初始化函数调用,如下所示:

  • 没有对密码区编程,内存窗口中值没变化,因为擦除失败了,凡是例程中有的操作都被保留下来了

  • 好的感谢您提供的信息,已经跟进给工程师了,有答复会尽快给到您哈。

  • 您好,请问在进行了 MWRALLOW 和闪存初始化后,问题仍然存在是吗?

  • 好的收到,再帮您问下哈。

  • 您好,现在您已经确认了检查过闪存 API FAQ中提供的调试提示,那您能否提供一个没有任何专有代码并包含编译错误的project?这样工程师可以试下重现您的问题。