FLASH操作需求说明:
第一次上电 操作FLASH_BANK1_SEC6 0x096000
首先使用API接口,擦除FLASH_BANK1_SEC6
Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,0x96000);
然后使用API接口,向地址0x096000 写入数据
Fapi_issueProgrammingCommand(
Uint32 *pu32StartAddress, // = 0x96000
Uint16 *pu16DataBuffer, // = ui16[8]
Uint16 u16DataBufferSizeInWords, // = 8
Uint16 *pu16EccBuffer, // =NONE
Uint16 u16EccBufferSizeInBytes, // =NONE
Fapi_FlashProgrammingCommandsType oMode // = Fapi_DataOnly
);
下电再上电,不执行擦除操作
使用API接口,向地址0x096008 写入数据
Fapi_issueProgrammingCommand(
Uint32 *pu32StartAddress, // = 0x96008
Uint16 *pu16DataBuffer, // = ui16[8]
Uint16 u16DataBufferSizeInWords, // = 8
Uint16 *pu16EccBuffer, // =NONE
Uint16 u16EccBufferSizeInBytes, // =NONE
Fapi_FlashProgrammingCommandsType oMode // = Fapi_DataOnly
);
操作结果,是0x096000的数据正常写入,但是下电在上电向0x96008地址写数据是失败,Fapi_issueProgrammingCommand返回的错误信息为“Fapi_Error_AsyncIncorrectEccBufferLength”
请问我这样操作可以吗?如果不可以这样操作,要怎样操作才能实现的目的:在不同的时间向同一扇区的不同地址写入数据。
Susan Yang:
我认为这种方式是可以的
您可以参考下面链接的Table 6. Uses of Different Programming Modes来了解使用该模式的相关内容
www.ti.com/…/spnu628a.pdf
若是可以的话,请给出详细的代码内容另外请问您现在使能ECC了吗?
Aiden:
回复 Susan Yang:
ECC默认是使能的:
“TMS320F28004x Flash API Reference Guide”这份操作指导我看过了,使用的写模式就是Table 6. Uses of Different Programming Modes中的“Fapi_DataOnly”模式,
操作FLASH的代码如下:
void EepromTest(void){
Fapi_FlashStatusType oFlashStatus; Fapi_FlashStatusWordType oFlashStatusWord;
Uint16 au16DataBuffer[2][8] = {{0x0001, 0x0203, 0x0405, 0x0607, 0x0809, 0x0A0B, 0x0C0D, 0x0E0F}, {0x0002, 0x0204, 0x0406, 0x0607, 0x0808, 0x0A0c, 0x0C0c, 0x0E0c}}; Uint32 *DataBuffer32 = (Uint32 *)au16DataBuffer;
if(uiErase == 1) { uiErase = 0; oReturnCheck1 = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (Uint32 *)0x96000); // Wait until FSM is done with erase sector operation while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady){} if(oReturnCheck1 != Fapi_Status_Success) { //Example_Error (oReturnCheck); }
oFlashStatus = Fapi_getFsmStatus(); if (oFlashStatus!=0) { //FMSTAT_Fail(); }
oReturnCheck1 = Fapi_doBlankCheck((Uint32 *)0x96000, 0x800,&oFlashStatusWord); if(oReturnCheck1 != Fapi_Status_Success) { //Example_Error(oReturnCheck); } }
if(uiWrite == 1)
{
uiWrite = 0; //u32Index = 0x96000; //Programe for(u32Index = 0x96000; (u32Index < 0x96100) && (oReturnCheck1 == Fapi_Status_Success); u32Index+=8) { oReturnCheck1 = Fapi_issueProgrammingCommand((Uint32 *)u32Index,au16DataBuffer[uiDataNum],8,0,0,Fapi_DataOnly); ErrorCode = oReturnCheck1; while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){}}
}
if(uiWrite == 2) { uiWrite = 0; //u32Index = 0x96008; //Programe for(u32Index = 0x96200; (u32Index < 0x96300) && (oReturnCheck1 == Fapi_Status_Success); u32Index+=8) { oReturnCheck1 = Fapi_issueProgrammingCommand((Uint32 *)u32Index,au16DataBuffer[uiDataNum],8,0,0,Fapi_DataOnly); ErrorCode = oReturnCheck1; while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){} } } }
Debug下,手动修改uiErase和uiWrite变量值来进行擦除和写操作。代码复制尽量格式对齐比较麻烦,看起来有点费劲,麻烦了!
Susan Yang:
回复 Aiden:
这个代码看起来有点费劲,请您点击右下角的 “使用高级编辑器编辑文本”然后以附件形式上传一下您的工程,谢谢
Aiden:
回复 Susan Yang:
工程无法上传,公司电脑加密的。你只需要把这个函数拷贝到任意一个已对FLASH进行初始化的工程里就可以了。
Susan Yang:
回复 Aiden:
那请您以下面的方式上传一下代码或者c文件,我这边直接拷过去,全是格式错误
Aiden:
回复 Susan Yang:
所有文件形式都是加密的,外发后都无法打开。但是我不知道为什么复制一段代码你都无法拷贝下来。
Susan Yang:
回复 Aiden:
是的,我这边20几个错误,且都没办法消除
Aiden:
回复 Susan Yang:
不好意思,前两天比较忙。今天又测试了一下。找到问题了,
在执行这个循环写操作的过程中:
for(u32Index = 0x96000; (u32Index < 0x96100) &&
(oReturnCheck1 == Fapi_Status_Success); u32Index+=8)
{oReturnCheck1 = Fapi_issueProgrammingCommand((Uint32 *)u32Index,au16DataBuffer[uiDataNum],8,0,0,Fapi_DataOnly);ErrorCode = oReturnCheck1;while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){}
}每次写结束后的,while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){}判断会触发watchdog复位。
但是新的问题来了:
1、如果把这个判断去掉,后面的数据有可能写不成功(应为上次写操作还未结束)。
2、实际执行过程我也不会使用while去等待写结束,这样会严重影响我的程序实时性和软件负载率。
我应该怎样去写一段数据到FLASH呢?
Aiden:
回复 Susan Yang:
谢谢您耐心的细致的解答