TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

TMS570LC4357: Flash擦除读写问题

Part Number: TMS570LC4357
Other 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个字节是可行的

  • 你好,我查看下相关资料后回复您。

  • 还有一个额外的问题,  对于Fapi_issueProgrammingCommand, 参数FapiFlashProgrammingCommandType mode为Fapi_AutoEccGeneration的情况下,向片内Flash写入的最小byte数和最大byte数是多少,是否需要8字节对齐呢

  • 你好,我需要咨询下相关资深工程师,一旦得到回复会立即回复您。

  • 你好,能否提供下相关的工程,如果有相关工程的话,就能够调试,能够最快的解决问题。

  • 抱歉,因为信息安全,没有办法提供工程

  • 好的,我向相关工程师跟进一下

  • 首先,在此提供一个我使用的测试用例的代码

    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);
        // }
    }
  • 然后补充一些信息:

    使用的是 F021_API_CortexR4_BE_L2FMC_V3D16_NDS.lib

    最后描述一下用例代码的行为:

    代码执行到通过指针解引用读取写入内容的时候,板子红灯亮起,所有行为停止。

    然后再通过UniFlash读取整个Memory后,有如下内容

  • 好的,已向相关工程师跟进。

  • 好的,希望能尽快得到回复

  • 好的,一旦得到回复我会立即回复给您

  • 你好,有什么进度吗

  • 那边工程师还没有回复,我再跟进一下

  • 使用API - Fapi_doMarginReadByByte读取在Bank1 Sector0写入的8个字节也是同样的行为,串口停止,板上红灯亮起。对于Bank7 Sector0来说,写入8个字节后,无论是直接通过地址访问还是使用API读取都不会出现该问题

  • 好的,我将向相关工程师跟进。

  • 你好,

    工程师创建了一个工程与您的类似但是没有遇到您说的问题: 

    串口接收到的数据是一致的:

    下面是这个工程,您可以测试一下:

    7651.FAPI_TEST_LC43.zip