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.

TMS570LS1224: FEE write/read weird behaviour

Part Number: TMS570LS1224
Other Parts Discussed in Thread: HALCOGEN

Tool/software:

Hi,

I am facing a weird issue with the emulated EEPROM. Whenever I set the block size larger than 8 bytes (like 16 or 32 bytes), the bytes at index 12,13 and 14 are always zero.

This is my printf() log:

flashLibInfo: 0
flashDevInfo: 1280
BLK 1 --- write: 0 | read: 0
BLK 1 --- write: 1 | read: 1
BLK 1 --- write: 2 | read: 2
BLK 1 --- write: 3 | read: 3
BLK 1 --- write: 4 | read: 4
BLK 1 --- write: 5 | read: 5
BLK 1 --- write: 6 | read: 6
BLK 1 --- write: 7 | read: 7
BLK 1 --- write: 8 | read: 8
BLK 1 --- write: 9 | read: 9
BLK 1 --- write: 10 | read: 10
BLK 1 --- write: 11 | read: 11
BLK 1 --- write: 12 | read: 0
BLK 1 --- write: 13 | read: 0
BLK 1 --- write: 14 | read: 0
BLK 1 --- write: 15 | read: 15
BLK 1 --- write: 16 | read: 16
BLK 1 --- write: 17 | read: 17
BLK 1 --- write: 18 | read: 18
BLK 1 --- write: 19 | read: 19
BLK 1 --- write: 20 | read: 20
BLK 1 --- write: 21 | read: 21
BLK 1 --- write: 22 | read: 22
BLK 1 --- write: 23 | read: 23
BLK 1 --- write: 24 | read: 24
BLK 1 --- write: 25 | read: 25
BLK 1 --- write: 26 | read: 26
BLK 1 --- write: 27 | read: 27
BLK 1 --- write: 28 | read: 28
BLK 1 --- write: 29 | read: 29
BLK 1 --- write: 30 | read: 30
BLK 1 --- write: 31 | read: 31
BLK 2 --- write: 0 | read: 0
BLK 2 --- write: 1 | read: 1
BLK 2 --- write: 2 | read: 2
BLK 2 --- write: 3 | read: 3
BLK 2 --- write: 4 | read: 4
BLK 2 --- write: 5 | read: 5
BLK 2 --- write: 6 | read: 6
BLK 2 --- write: 7 | read: 7
BLK 2 --- write: 8 | read: 8
BLK 2 --- write: 9 | read: 9

BLK 2 --- write: 10 | read: 10
BLK 2 --- write: 11 | read: 11
BLK 2 --- write: 12 | read: 0
BLK 2 --- write: 13 | read: 0
BLK 2 --- write: 14 | read: 0
BLK 2 --- write: 15 | read: 15
BLK 2 --- write: 16 | read: 16
BLK 2 --- write: 17 | read: 17
BLK 2 --- write: 18 | read: 18
BLK 2 --- write: 19 | read: 19
BLK 2 --- write: 20 | read: 20
BLK 2 --- write: 21 | read: 21
BLK 2 --- write: 22 | read: 22
BLK 2 --- write: 23 | read: 23
BLK 2 --- write: 24 | read: 24
BLK 2 --- write: 25 | read: 25
BLK 2 --- write: 26 | read: 26
BLK 2 --- write: 27 | read: 27
BLK 2 --- write: 28 | read: 28
BLK 2 --- write: 29 | read: 29
BLK 2 --- write: 30 | read: 30
BLK 2 --- write: 31 | read: 31

CHAN:  0

Inside the main loop (before calling the FreeRTOS related functions), I do the following:

    //
    // FEE Start
    //
    uint32 loop;
    for(loop = 0; loop < 100; loop++)
        SpecialRamBlock[loop] = loop;

    /* Initialize FEE. This will create Virtual sectors, initialize global variables etc.*/
    TI_Fee_Init();
    do
    {
        TI_Fee_MainFunction();
        __delay_cycles(1000);
        Status = TI_Fee_GetStatus(0);
    }
    while(Status != IDLE);
    //
    // FEE End
    //

Inside the task where I work with the FEE, the code looks as follows:

    taskENTER_CRITICAL();

    register uint32_t u32Mode = 0x1F; /* Privileged */
    u32Mode = switchCpuMode(u32Mode);

    // const TickType_t xDelay = pdMS_TO_TICKS(500);
    const TickType_t xDelay = 500 / portTICK_PERIOD_MS;

    Fapi_LibraryInfoType flashLibInfo = Fapi_getLibraryInfo();
    Fapi_DeviceInfoType flashDevInfo = Fapi_getDeviceInfo();

    printf("flashLibInfo: %u\n", flashLibInfo.u8ApiTechnologyRevision);
    printf("flashDevInfo: %u\n", flashDevInfo.u16DeviceMemorySize);

    uint8 ReadBuffer[8] = { 0x00 };
    Std_ReturnType FeeRetVal = E_NOT_OK;

    uint32 BlockNumber;
    const uint32 LastBlockNumber = 2;

    for (BlockNumber = 0x01; BlockNumber <= LastBlockNumber; BlockNumber++)
    {
        FeeRetVal = TI_Fee_WriteAsync(BlockNumber, &SpecialRamBlock[0]);
        if (FeeRetVal != E_OK) printf("FATAL: TI_Fee_WriteAsync failed!\n");

        do
        {
            TI_Fee_MainFunction();
            __delay_cycles(100);
            Status = TI_Fee_GetStatus(0);
        }
        while(Status != IDLE);
    }

    for (BlockNumber = 0x01; BlockNumber <= LastBlockNumber; BlockNumber++)
    {
        FeeRetVal = TI_Fee_Read(BlockNumber, (uint16)0, ReadBuffer, 32);
        if (FeeRetVal != E_OK) printf("FATAL: TI_Fee_Read failed!\n");

        do
        {
            TI_Fee_MainFunction();
            __delay_cycles(100);
            Status = TI_Fee_GetStatus(0);
        }
        while(Status != IDLE);

        uint32 i = 0;
        for (i = 0; i < 32; i++)
        {
            printf("BLK %u --- write: %u | read: %u\n", BlockNumber, SpecialRamBlock[i], ReadBuffer[i]);
        }
    }

    taskEXIT_CRITICAL();


This is my HALCoGen configuration:

I tried with disabling all ECC-related parameters, but the result is still the same.