SPRADE8A November   2023  – April 2024 F29H850TU , F29H859TU-Q1 , TMS320F28P650DH , TMS320F28P650DK , TMS320F28P650SH , TMS320F28P650SK , TMS320F28P659DH-Q1 , TMS320F28P659DK-Q1 , TMS320F28P659SH-Q1

 

  1.   1
  2.   Abstract
  3.   Trademarks
  4. Introduction
  5. Difference Between EEPROM and On-Chip Flash
  6. Overview
    1. 3.1 Basic Concept
    2. 3.2 Single-Unit Method
    3. 3.3 Ping-Pong Method
    4. 3.4 Creating EEPROM Sections (Pages) and Page Identification
  7. Software Description
    1. 4.1 Software Functionality and Flow
  8. Ping-Pong Emulation
    1. 5.1 User-Configuration
      1. 5.1.1 EEPROM_PingPong_Config.h
      2. 5.1.2 F28P65x_EEPROM_PingPong.c
    2. 5.2 EEPROM Functions
      1. 5.2.1  EEPROM_Config_Check
      2. 5.2.2  Configure_Protection_Masks
      3. 5.2.3  EEPROM_Write
      4. 5.2.4  EEPROM_Read
      5. 5.2.5  EEPROM_Erase
        1. 5.2.5.1 Erase_Bank
      6. 5.2.6  EEPROM_GetValidBank
      7. 5.2.7  EEPROM_UpdateBankStatus
      8. 5.2.8  EEPROM_UpdatePageStatus
      9. 5.2.9  EEPROM_UpdatePageData
      10. 5.2.10 EEPROM_Get_64_Bit_Data_Address
      11. 5.2.11 EEPROM_Program_64_Bits
      12. 5.2.12 EEPROM_CheckStatus
      13. 5.2.13 ClearFSMStatus
    3. 5.3 Testing Example
  9. Single-Unit Emulation
    1. 6.1 User-Configuration
      1. 6.1.1 EEPROM_Config.h
      2. 6.1.2 F28P65x_EEPROM.c
    2. 6.2 EEPROM Functions
      1. 6.2.1  EEPROM_Config_Check
      2. 6.2.2  Configure_Protection_Masks
      3. 6.2.3  EEPROM_Write
      4. 6.2.4  EEPROM_Read
      5. 6.2.5  EEPROM_Erase
      6. 6.2.6  EEPROM_GetValidBank
      7. 6.2.7  EEPROM_Get_64_Bit_Data_Address
      8. 6.2.8  EEPROM_UpdateBankStatus
      9. 6.2.9  EEPROM_UpdatePageStatus
      10. 6.2.10 EEPROM_UpdatePageData
      11. 6.2.11 EEPROM_Get_64_Bit_Data_Address
      12. 6.2.12 EEPROM_Program_64_Bits
      13. 6.2.13 EEPROM_CheckStatus
      14. 6.2.14 ClearFSMStatus
    3. 6.3 Testing Example
  10. Application Integration
  11. Adapting to Other Gen 3 C2000 MCUs
  12. Flash API
    1. 9.1 Flash API Checklist
      1. 9.1.1 Flash API Do's and Do Not's
  13. 10Source File Listing
  14. 11Troubleshooting
    1. 11.1 General
  15. 12Conclusion
  16. 13References
  17. 14Revision History

EEPROM_GetValidBank

The EEPROM_GetValidBank() function provides functionality for finding the current EEPROM bank and page. This function is called by both the EEPROM_Write() and EEPROM_Read() functions. GetValidBank Flow shows the overall flow required to search for current EEPROM bank and page.

GUID-AA2211D9-B5A8-42B4-B020-F5CC6E2BDD70-low.gifFigure 6-1 GetValidBank Flow

When entering this function, the EEPROM bank and page pointers are set to the beginning of the first sector specified in FIRST_AND_LAST_SECTOR:

RESET_BANK_POINTER;
RESET_PAGE_POINTER;     

The addresses for these pointers are defined the EEPROM_Config.h file for the specific device and EEPROM configuration being used.

Next, the current EEPROM bank is found. As GetValidBank Flow shows, there are three different states that a EEPROM bank can have: Empty, Current, and Used.

An Empty EEPROM Bank is signified by the 128 status bits all being 1s (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF). A Current EEPROM Bank is signified by the first 64 bits being set to 0x5A5A5A5A5A5A5A5A, with the remaining 64 bits set to 1. A Used EEPROM Bank is signified by all 128 bits being set to 0x5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A. These values can be changed if desired.

An Empty EEPROM Bank is tested first. If this status is encountered, the EEPROM bank has not been used and no further searching is needed.

if(Bank_Status[0] == EMPTY_BANK)        // Check for Unused Bank
{
    Bank_Counter = i;     // Set Bank Counter to number of current page
    return;               // If Bank is Unused, return as EEPROM is empty
}

If an Empty EEPROM Bank is not encountered, Current EEPROM Bank is tested next. If the bank is the current EEPROM bank, the EEPROM bank counter is updated and the page pointer is set to the first page of the EEPROM bank to enable testing for the current page. The loop is then exited as no further EEPROM bank searching is needed.

if(Bank_Status[0] == CURRENT_BANK && Bank_Status[4] != CURRENT_BANK)      // Check for Current Bank
{
    Bank_Counter = i;      // Set Bank Counter to number of current bank
    // Set Page Pointer to first page in current bank    
    Page_Pointer = Bank_Pointer + 8; 
    break;      // Break from loop as current bank has been found
}

Lastly, Used EEPROM Bank is tested. In this case the EEPROM bank has been used and the EEPROM bank pointer is updated to the next EEPROM bank to test its status.

// Check for Used Bank
if(Bank_Status[0] == CURRENT_BANK && Bank_Status[4] == CURRENT_BANK)         
// If Bank has been used, set pointer to next bank
    Bank_Pointer += Bank_Size;          

After the current EEPROM bank has been found, the current page needs to be found. there are three different states that a page can have: Empty, Current, and Used.

An Empty Page is signified by the 128 status bits all being 1s (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF). A Current EEPROM Bank is signified by the first 64 bits being set to 0x5F5F5F5F5F5F5F5F, with the remaining 64 bits set to 1. A Used EEPROM Bank is signified by all 128 bits being set to 0x5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F. These values can be changed if desired.

The Blank and Current Pages are tested first. If either of these are the current state of the page, the correct page is found and the loop is exited as further searching is not needed.

// Check for Blank Page or Current Page
if(Page_Status[0] == BLANK_PAGE)
{
        Page_Counter = i;  // Set Page Counter to number of current page
        break;  // Break from loop as current page has been found
}

if (Page_Status[0] == CURRENT_PAGE && Page_Status[4] != CURRENT_PAGE)
{
       Page_Counter = i + 1;//Increment Page Counter as one has been used
       break; // Break from loop as current page has been found
}

If the page status is neither of these, the only other possibility is a Used Page. In this case, the page pointer is updated to the next page to test its status.

// Check for Used Page
if(Page_Status[0] == CURRENT_PAGE && Page_Status[4] == CURRENT_PAGE)
{
    // If page has been used, set pointer to next page
    Page_Pointer += EEPROM_PAGE_DATA_SIZE + 8;
}

At this point, the current EEPROM bank and page is found and the calling function can continue. As a final step, this function will check if all EEPROM banks and pages have been used. In this case, the sector needs to be erased.

if (!ReadFlag)
{
    if (Bank_Counter == NUM_EEPROM_BANKS - 1 && 
            Page_Counter == NUM_EEPROM_PAGES)     
    {
        Erase_Inactive_Unit = 1;
        EEPROM_UpdatePageStatus();
        EEPROM_UpdateBankStatus();
        Erase_Blank_Check = 1;
        EEPROM_Erase();
        RESET_BANK_POINTER;
        RESET_PAGE_POINTER;             
    }
}

This check is performed by testing the EEPROM bank and page counters. The amount of EEPROM banks and pages indicating a full EEPROM depends on the application. These counters are set when testing for the current EEPROM banks and pages as shown in the code snippets above. However, this check is not made when the Read_Flag is set. This is to prevent premature erasing of the inactive EEPROM unit when reading from a full EEPROM unit.

As show above, if the memory is full, the EEPROM_Erase() functions is called and the EEPROM bank and page pointers are reset to the first EEPROM bank and page.