SPRADL4 January   2025 F29H850TU , F29H859TU-Q1

 

  1.   1
  2.   Abstract
  3.   Trademarks
  4. Introduction
  5. Differences Between EEPROM and On-Chip Flash
  6. Overview
    1. 3.1 Basic Concepts
    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. Single-Unit Emulation
    1. 5.1 User Configuration
      1. 5.1.1 EEPROM_Config.h
      2. 5.1.2 F29H85x_EEPROM.c
    2. 5.2 EEPROM Functions
      1. 5.2.1 Initialization and Setup Functions
        1. 5.2.1.1 Configure_Device
        2. 5.2.1.2 EEPROM_Config_Check
      2. 5.2.2 Page Mode Functions
        1. 5.2.2.1 EEPROM_GetValidBank
        2. 5.2.2.2 EEPROM_UpdateBankStatus
        3. 5.2.2.3 EEPROM_UpdatePageStatus
        4. 5.2.2.4 EEPROM_UpdatePageData
        5. 5.2.2.5 EEPROM_Write_Page
      3. 5.2.3 64-Bit Mode Functions
        1. 5.2.3.1 EEPROM_64_Bit_Mode_Check_EOS
        2. 5.2.3.2 EEPROM_Write_64_Bits
      4. 5.2.4 Functions Used in Both Modes
        1. 5.2.4.1 EEPROM_Erase
        2. 5.2.4.2 EEPROM_Read
      5. 5.2.5 Utility Functions
        1. 5.2.5.1 EEPROM_Write_Buffer
        2. 5.2.5.2 Erase_Bank
        3. 5.2.5.3 Set_Protection_Masks
        4. 5.2.5.4 Configure_Protection_Masks
        5. 5.2.5.5 Fill_Buffer
        6. 5.2.5.6 ClearFSMStatus
    3. 5.3 Testing Example
  9. Ping-Pong Emulation
    1. 6.1 User-Configuration
      1. 6.1.1 EEPROM_PingPong_Config.h
      2. 6.1.2 F29H85x_EEPROM_PingPong.c
    2. 6.2 EEPROM Functions
      1. 6.2.1 Initialization and Setup Functions
        1. 6.2.1.1 Configure_Device
        2. 6.2.1.2 EEPROM_Config_Check
      2. 6.2.2 Page Mode Functions
        1. 6.2.2.1 EEPROM_GetValidBank
        2. 6.2.2.2 EEPROM_UpdateBankStatus
        3. 6.2.2.3 EEPROM_UpdatePageStatus
        4. 6.2.2.4 EEPROM_UpdatePageData
        5. 6.2.2.5 EEPROM_Write_Page
      3. 6.2.3 64-Bit Mode Functions
        1. 6.2.3.1 EEPROM_64_Bit_Mode_Check_EOS
        2. 6.2.3.2 EEPROM_Write_64_Bits
      4. 6.2.4 Functions Used in Both Modes
        1. 6.2.4.1 EEPROM_Erase_Inactive_Unit
        2. 6.2.4.2 EEPROM_Read
        3. 6.2.4.3 EEPROM_Erase_All
      5. 6.2.5 Utility Functions
        1. 6.2.5.1 EEPROM_Write_Buffer
        2. 6.2.5.2 Erase_Bank
        3. 6.2.5.3 Configure_Protection_Masks
        4. 6.2.5.4 Set_Protection_Masks
        5. 6.2.5.5 Fill_Buffer
        6. 6.2.5.6 ClearFSMStatus
    3. 6.3 Testing Example
  10. Application Integration
  11. Flash API
    1. 8.1 Flash API Checklist
      1. 8.1.1 Flash API Do's and Do Not's
  12. Source File Listing
  13. 10Troubleshooting
    1. 10.1 General
  14. 11Conclusion
  15. 12References

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_Page() and EEPROM_Read() functions. Figure 5-1 shows the overall flow required to search for current EEPROM bank and page.

 GetValidBank Flow Figure 5-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 Figure 5-1 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.

First, the program checks if the current EEPROM bank is Empty. If yes, the EEPROM bank has not been used and no further search is needed.

if (Bank_in_Use == EMPTY_BANK)
{
    Bank_Counter = i;
    return;
}

If an empty EEPROM bank is not encountered, the program checks if the bank is marked as Current. If yes, the EEPROM bank counter is updated and the page pointer is set to the first page of the EEPROM bank, to be adjusted further in a later loop. The loop is then exited as no further search is needed.

if (Bank_in_Use == CURRENT_BANK && Bank_Full != CURRENT_BANK)
{
    Bank_Counter = i;
    Page_Pointer = Bank_Pointer + WRITE_SIZE_BYTES*2;
    break;
}

Lastly, the program checks if the EEPROM bank is Used. If so, the EEPROM bank pointer is updated to the next EEPROM bank, and the loop continues.

if (Bank_in_Use == CURRENT_BANK && Bank_Full == CURRENT_BANK)
{
    Bank_Pointer += Bank_Size;
}

After the current EEPROM bank has been located, the current page can be found. There are three different states a page can have: Blank, Current, and Used.

An empty Page is identified by all 128 status bits being 1 (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF). A Current EEPROM Bank is identified by the first 64 bits being set to 0xA5A5A5A5A5A5A5A5, with the remaining 64 bits set to 1. A Used EEPROM Page is identified by all 128 bits being set to 0xA5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5. These status codes can be changed in EEPROM_Config.h if desired.

First, the program checks if the page is Blank or Current. If so, the correct page has been found and the loop is exited.

if (Page_in_Use == BLANK_PAGE)
{
    Page_Counter = i;
    break;
}

if (Page_in_Use == CURRENT_PAGE && Page_Full != CURRENT_PAGE)
{
    Page_Counter = i + 1;
    break;
}

If not Blank or Current, then the page must be used, and the page pointer is updated to the next page to test its status.

Page_Pointer += WRITE_SIZE_BYTES*2 + EEPROM_PAGE_DATA_SIZE;

At this point, the current EEPROM bank and page have been found and the calling function can continue. As a final step, this function will check if all EEPROM banks and pages have been used. If so, the last bank and page are marked as full for completeness, and the sector(s) used for emulation are erased.

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

This check is performed by testing the EEPROM bank and page counters. The number of EEPROM banks and pages indicating a full EEPROM will depend on the application configuration. These counters are set when testing for the current EEPROM banks and pages as shown in the code snippets above.

To prevent premature erasure when reading from a full EEPROM unit, this check is not made when the Read_Flag is set.

As show above, if the memory is full, the last page and bank are marked as Used for completeness before the EEPROM_Erase() functions are called and the bank and page pointers are reset.