TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS570LC4357: Flash擦除读写问题

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

赞(0)
未经允许不得转载:TI中文支持网 » TMS570LC4357: Flash擦除读写问题
分享到: 更多 (0)

© 2026 TI中文支持网   网站地图 鲁ICP备2022002796号-1