SPRADE8 November   2023 TMS320F28P650DH , TMS320F28P650DK , TMS320F28P650SH , TMS320F28P650SK , TMS320F28P659DH-Q1 , TMS320F28P659DK-Q1 , TMS320F28P659SH-Q1

 

  1.   EEPROM Emulation for Generation 3 C2000 Real Time Controllers
  2.   Trademarks
  3. Introduction
  4. Difference Between EEPROM and On-Chip Flash
  5. 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
  6. Software Description
    1. 4.1 Software Functionality and Flow
  7. Ping-Pong Emulation
    1. 5.1 User-Configuration
      1. 5.1.1 EEPROM_Config.h
      2. 5.1.2 F28P65x_EEPROM.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_Get_64_Bit_Data_Address
      10. 5.2.10 EEPROM_Program_64_Bits
      11. 5.2.11 EEPROM_CheckStatus
      12. 5.2.12 ClearFSMStatus
    3. 5.3 Testing Example
  8. 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_Erase
      5. 6.2.5  EEPROM_GetValidBank
      6. 6.2.6  EEPROM_Get_64_Bit_Data_Address
      7. 6.2.7  EEPROM_UpdateBankStatus
      8. 6.2.8  EEPROM_UpdatePageStatus
      9. 6.2.9  EEPROM_Get_64_Bit_Data_Address
      10. 6.2.10 EEPROM_Program_64_Bits
      11. 6.2.11 EEPROM_CheckStatus
      12. 6.2.12 ClearFSMStatus
    3. 6.3 Testing Example
  9. Application Integration
  10. Adapting to Other Gen 3 C2000 MCUs
  11. Flash API
    1. 9.1 Flash API Checklist
      1. 9.1.1 Flash API Do's and Do Not's
  12. 10Source File Listing
  13. 11Conclusion
  14. 12References

EEPROM_Write

The EEPROM_Write() function provides the functionality for programming the data to Flash. It leverages the Flash API directly and makes several function calls within to prepare for data programming. The functions called are listed below:

  • EEPROM_GetValidBank()
  • EEPROM_UpdatePageStatus()
  • EEPROM_UpdateBankStatus()
  • ClearFSMStatus()
  • EEPROM_CheckStatus()

Each of the above functions are described in detail in their respective sections. To begin, the current EEPROM bank and page are found. After the current EEPROM bank and page are found, the page status of the previous page is updated and the EEPROM bank status is updated if a new EEPROM bank is being used.

EEPROM_GetValidBank();     // Find Current Bank and Current Page

EEPROM_UpdatePageStatus(); // Update Page Status of previous page
EEPROM_UpdateBankStatus(); // Update Bank Status of current and previous bank

Next, the actual programming occurs. 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.
    1. Sectors not used in EEPROM Emulation will have protection enabled.
    2. 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.00.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;
}