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_Program_64_Bits

The EEPROM_Program_64_Bits() function provides functionality for programming four 16-bit words to memory. The first parameter, Num_Words, allows the user to specify how many valid words will be written. The data words should be assigned to the first 4 locations of the Write_Buffer to be used by the Fapi_issueProgrammingCommand function. If less than four words are specified in the function call, missing words will be filled with 0xFFFF. This is done to comply with ECC requirements.

First, a full EEPROM unit is tested for.

EEPROM_Get_64_Bit_Data_Address();

Next, the Write Buffer is filled with 1s if less than 4 words are specified.

int i;
for(i = Num_Words; i < 4; i++)
{
    Write_Buffer[i] = 0xFFFF;
}

Next, data is programmed and the pointer is incremented to the next location to program data.

// 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);

oReturnCheck = Fapi_issueProgrammingCommand((uint32*) Bank_Pointer,
                                                Write_Buffer, 4, 0, 0,
                                                Fapi_AutoEccGeneration);

// Wait for completion and check for any programming errors
EEPROM_CheckStatus(&oReturnCheck);

// Increment to next location
Bank_Pointer += 4;

Once programming is complete, the Erase_Inactive_Unit flag is checked. If set, the inactive unit is erased, performs a blank check and the Write/Erase Protection masks are reconfigured.

if (Erase_Inactive_Unit) {

    // Erase inactive unit
    Erase_Blank_Check = 1;
    EEPROM_Erase();
    Erase_Inactive_Unit = 0;

    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;
}
Note: This function cannot be used until RESET_BANK_POINTER has been executed to set the pointer. In this example, it is called in EEPROM_Config_Check(). Executing before could produce unknown results.