Part Number:TMS570LC4357Other Parts Discussed in Thread:UNIFLASH
我通过F021 API对片内Flash进行擦除和写入
我擦除Bank1之后,对Bank1的Sector0的起始8个字节,每个字节都写入0xaa。然后在C程序中直接通过地址的方式依次读这8个字节。
根据串口的打印信息,擦除和写入都没有软件上的报错,但是在到读取第一个字节的数据时,串口会停止不动,单板上的红灯会亮起。
这时候通过UniFlash中的Memory选项读取内存信息,发现Bank1的Sector0的起始8个字节已经都被写成了0xaa。
然后我试着,写入Bank1的Sector0的起始的16个字节,24个字节,32个字节。发现写起始24个字节和32个字节时,能够没有错误地读出我写入的数据。
想请问导致这种情况可能是什么原因?应该如何解决?
根据技术手册和API手册,似乎只写8个字节,并读这8个字节是可行的
Ben Qin:
你好,我查看下相关资料后回复您。
,
Jialiang Ou:
还有一个额外的问题, 对于Fapi_issueProgrammingCommand, 参数FapiFlashProgrammingCommandType mode为Fapi_AutoEccGeneration的情况下,向片内Flash写入的最小byte数和最大byte数是多少,是否需要8字节对齐呢
,
Ben Qin:
你好,我需要咨询下相关资深工程师,一旦得到回复会立即回复您。
,
Ben Qin:
你好,能否提供下相关的工程,如果有相关工程的话,就能够调试,能够最快的解决问题。
,
Jialiang Ou:
抱歉,因为信息安全,没有办法提供工程
,
Ben Qin:
好的,我向相关工程师跟进一下
,
Jialiang Ou:
首先,在此提供一个我使用的测试用例的代码
VOID SimpleFlashTest(VOID)
{
UINT32 i;
UINT32 ret = 0;
UINT32 bankId = 1;
UINT32 sectorBitMap = 0xFFFF;
UINT8 dataBuffer[8] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00, 0x55};
UINT8 val = 0;
UINT64 val64 = 0;UINT32 hClkFreq = 150;
if ((Fapi_initializeFlashBanks(hClkFreq) == OS_SUCCESS)){
printf("[SimpleFlashTest]: Fapi_initializeFlashBanks OK\r\n");Fapi_setActiveFlashBank((FapiFlashBankType)(bankId));
printf("[SimpleFlashTest]: Fapi_setActiveFlashBank (Bank1) OK\r\n");
printf("[SimpleFlashTest]: Check RWait: L2FMC->fRdCntl %#x\r\n", L2FMC->fRdCntl);
printf("[SimpleFlashTest]: Check EWait: L2FMC->eepromConfig = %#x\r\n", L2FMC->eepromConfig);Fapi_enableMainBankSectors((UINT16)sectorBitMap);
printf("[SimpleFlashTest]: Fapi_enableMainBankSectors (sectorBitMap 0xFFFF) OK\r\n");
while(OsIsFsmReady() == FALSE);
printf("[SimpleFlashTest]: FSM Ready\r\n");
while(OsIsOpSuccess() == FALSE);
printf("[SimpleFlashTest]: Op Success\r\n");
}ret = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (UINT32 *)(0x00200000));
if (ret != OS_SUCCESS) {
printf("[SimpleFlashTest]: Fapi_issueAsyncCommandWithAddress Return Error(%d)\r\n", ret);
}
printf("[SimpleFlashTest]: Fapi_issueAsyncCommandWithAddress OK");while(OsIsFsmReady() == FALSE);
printf("[SimpleFlashTest]: FSM Ready\r\n");
while(OsIsOpSuccess() == FALSE);
printf("[SimpleFlashTest]: Op Success\r\n");ret = Fapi_issueProgrammingCommand((UINT32 *)(0x00200000), dataBuffer, 8, 0, 0, Fapi_AutoEccGeneration);
if (ret != OS_SUCCESS) {
printf("[SimpleFlashTest]: Fapi_issueProgrammingCommand Return Error(%d)\r\n", ret);
}
printf("[SimpleFlashTest]: Fapi_issueProgrammingCommand OK\r\n");
while(OsIsFsmReady() == FALSE);
printf("[SimpleFlashTest]: FSM Ready\r\n");
while(OsIsOpSuccess() == FALSE);
printf("[SimpleFlashTest]: Op Success\r\n");// Read
val = *((UINT64 *)(0x00200000));
printf("[SimpleFlashTest]: (%#x) = %#llx\r\n", 0x00200000, val);// for (i = 0; i < 8; i++) {
// val = *((UINT8 *)(0x00200000));
// printf("[SimpleFlashTest]: (%#x) = %#x\r\n", 0x00200000 + i, val);
// }
}
,
Jialiang Ou:
然后补充一些信息:
使用的是 F021_API_CortexR4_BE_L2FMC_V3D16_NDS.lib
最后描述一下用例代码的行为:
代码执行到通过指针解引用读取写入内容的时候,板子红灯亮起,所有行为停止。
然后再通过UniFlash读取整个Memory后,有如下内容
,
Ben Qin:
好的,已向相关工程师跟进。
,
Jialiang Ou:
好的,希望能尽快得到回复
,
Ben Qin:
好的,一旦得到回复我会立即回复给您
,
Jialiang Ou:
你好,有什么进度吗
,
Ben Qin:
那边工程师还没有回复,我再跟进一下
,
Jialiang Ou:
使用API – Fapi_doMarginReadByByte读取在Bank1 Sector0写入的8个字节也是同样的行为,串口停止,板上红灯亮起。对于Bank7 Sector0来说,写入8个字节后,无论是直接通过地址访问还是使用API读取都不会出现该问题
,
Ben Qin:
好的,我将向相关工程师跟进。
,
Ben Qin:
你好,
工程师创建了一个工程与您的类似但是没有遇到您说的问题:
串口接收到的数据是一致的:
下面是这个工程,您可以测试一下:
7651.FAPI_TEST_LC43.zip
TI中文支持网




