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_UpdatePageData

The EEPROM_UpdatePageData() function provides functionality for updating the EEPROM page data. This function is called from the EEPROM_Write() function.

The following steps need to be taken to achieve this:

  1. Clear the Flash State Machine (FSM) Status.
  2. Configure program/erase protection for Flash sectors.
    • Sectors not used in EEPROM Emulation will have protection enabled.
    • Sectors used in EEPROM Emulation will have protection disabled.
  3. Calculate the offset from the Page Pointer to write the data.
    1. This is required because only 64-bits are written at a time. Thus, if the data size is greater than 64-bits, multiple calls to the Flash API are necessary to write an entire Page.
  4. Wait for programming completion and check for any programming errors.
    // Clears status of previous Flash operation
    ClearFSMStatus();
    
    Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTA, WE_Protection_A_Mask);
    Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTB, WE_Protection_B_Mask);
    
    // Variable for page offset 
    // (first write position has offset of 2 (64 bits),
    // second has offset of 4 (128 bits), etc.)
    uint32 Page_Offset = 4 + (2 * i);
    
    // Program data located in Write_Buffer to current page
    oReturnCheck = Fapi_issueProgrammingCommand((uint32*) Page_Pointer + Page_Offset, Write_Buffer + (i*4), 4, 0, 0, Fapi_AutoEccGeneration);
    
    // Wait for completion and check for any programming errors
    EEPROM_CheckStatus(&oReturnCheck);

The following parameters are passed to the Flash API for programming.

  • Page Pointer (programming address)
  • Buffer containing data to be written
  • Length of data to be programmed
  • Programming mode

The fourth and fifth parameters are zero when using Fapi_AutoEccGeneration mode. For more details, see the TMS320F28P65x Flash API Version 3.02.00.00 Reference Guide.

If the programming is successful, the Page Status of the current Page is updated and the Empty_EEPROM flag is cleared. The code is shown below:

if(oReturnCheck == Fapi_Status_Success)
{
    // Set Page Status to Current Page
    Page_Status[0] = CURRENT_PAGE;
    Page_Status[1] = CURRENT_PAGE;
    Page_Status[2] = CURRENT_PAGE;
    Page_Status[3] = CURRENT_PAGE;

    Fapi_setupBankSectorEnable(
                       FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTA,
                          WE_Protection_A_Mask);

    Fapi_setupBankSectorEnable(
                       FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTB,
                          WE_Protection_B_Mask);

    oReturnCheck = Fapi_issueProgrammingCommand((uint32*)Page_Pointer, 
                                                Page_Status, 4, 0, 0,
                                                 Fapi_AutoEccGeneration);

    // Wait for completion and check for any programming errors
    EEPROM_CheckStatus(&oReturnCheck);
    Empty_EEPROM = 0;
}

After a successful write, the function checks if the inactive EEPROM unit needs to be erased. If so, it calls EEPROM_Erase, clears the flag, and re-configures the W/E Protection Masks. The flag to set the blank check is raised before erase is called. The flag to erase the inactive unit is set in EEPROM_GetValid_Bank.

if (Erase_Inactive_Unit)
{
    // Erase the inactive (full) EEPROM Bank
    Erase_Blank_Check = 1;
    EEPROM_Erase();
    Erase_Inactive_Unit = 0;

    // Re-configure Write/Erase Protection Masks for active EEPROM Bank
    uint64 WE_Protection_AB_Mask = Configure_Protection_Masks(
          FIRST_AND_LAST_SECTOR[EEPROM_ACTIVE_UNIT], NUM_EEPROM_SECTORS);


    WE_Protection_A_Mask = 0xFFFFFFFF ^ (uint32)WE_Protection_AB_Mask;
    WE_Protection_B_Mask = 0x00000FFF ^ WE_Protection_AB_Mask >> 32;
}