Part Number:F28M35H52COther 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执行问题。
请问大家是否遇到过
Green Deng:
你好,工程师将在工作时间为你解答。
,
Cherry Zhou:
您好我们已收到您的问题并升级到英文论坛,如有答复将尽快回复您。谢谢!
,
Cherry Zhou:
anvaya 说:然后在CCS 6.2 DEBUG界面下用reset和restart按钮进行复位,重复下载重新烧写功能失败,打断点发现Fapi_issueAsyncCommandWithAddress运行返回成功,但是对应的区域并未擦除成功。
您好,重复下载和重新烧写过程是什么? F28M35H52C 器件是运行引导加载程序,还是通过 xds560v2 仿真器接口完成所有操作?
anvaya 说:下载程序后直接断电拔仿真器运行,芯片也是擦除失败。怀疑也是Fapi_issueAsyncCommandWithAddress执行问题。
同时能否请您再解释一下这个过程?什么是断电拔仿真器运行?
,
anvaya:
重复下载烧写就是说,在完成第一次烧写后,不移除仿真器,直接用CCS debug界面上的reset和restart按钮进行复位,再次通过网络下载固件,烧写。
,
anvaya:
断电拔仿真器就是说,我把电路板用仿真器烧好程序后,脱离仿真器运行。再进行网络下载固件,烧写的步骤
,
anvaya:
再提供个线索,在运行Fapi_issueAsyncCommandWithAddress()失败后,检查了一下FSM_STAT寄存器,发现报错,报的是SLOCK error,大概意思就是sector锁定或是OTP锁定。那么问题来了,怎么解锁呢?文档上好像没有提及锁定的事
,
Cherry Zhou:
好的感谢您提供的信息,预计1-2天内给到您答复。
,
Cherry Zhou:
您好,您参考下以下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
请问您是怎样调用擦除功能的?
,
anvaya:
我参考了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){} //////////////////////擦除成功时跳到这里
,
anvaya:
看了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.
有没有影响?
,
Cherry Zhou:
抱歉回复晚了。
在使用闪存 API 之前,必须包括闪存初始化例程 (用于wait-state配置) 和 EALLOW (C28x) 或 MWRALLOW (ARM)。 您试下实施这些。
,
anvaya:
闪存如何初始化?请给个实例。MWRALLOW (ARM)我只是在Example_CallFlashAPI()中没找到,是不是封装在Flash API functions里面了。
因为我的程序在某些条件下也是能运行成功的,是不是可以不用考虑这些地方
我主要是怀疑sector的擦写在特定条件下被锁了,有没有解锁方法?
,
Cherry Zhou:
再帮您跟进给工程师问下哈,有新的进展会尽快给到您。
,
Cherry Zhou:
您好,关于锁,发生故障时,在内存窗口中的值是多少?请您确认下。
以及有没有对任何密码进行编程?
请参阅以下代码中的 MWRALLOW : \controlSUITE\device_support\f28m35x\v220\F28M35x_examples_Dual\flash_prog\m3\flash_programming_m3.c
在同一文件中,您可以看到闪存初始化函数调用,如下所示:
,
anvaya:
没有对密码区编程,内存窗口中值没变化,因为擦除失败了,凡是例程中有的操作都被保留下来了
,
Cherry Zhou:
好的感谢您提供的信息,已经跟进给工程师了,有答复会尽快给到您哈。
,
Cherry Zhou:
您好,请问在进行了 MWRALLOW 和闪存初始化后,问题仍然存在是吗?
,
anvaya:
是的
,
Cherry Zhou:
好的收到,再帮您问下哈。
,
Cherry Zhou:
您好,现在您已经确认了检查过闪存 API FAQ中提供的调试提示,那您能否提供一个没有任何专有代码并包含编译错误的project?这样工程师可以试下重现您的问题。