SPRADE8B November   2023  – August 2025 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
  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 Testing Example
  9. EEPROM Functions
    1. 6.1  EEPROM_Config_Check
    2. 6.2  Configure_Protection_Masks
    3. 6.3  EEPROM_Write
    4. 6.4  EEPROM_Read
    5. 6.5  EEPROM_Erase
      1. 6.5.1 Erase_Bank
    6. 6.6  EEPROM_GetValidBank
    7. 6.7  EEPROM_UpdateBankStatus
    8. 6.8  EEPROM_UpdatePageStatus
    9. 6.9  EEPROM_UpdatePageData
    10. 6.10 EEPROM_Get_64_Bit_Data_Address
    11. 6.11 EEPROM_Program_64_Bits
    12. 6.12 EEPROM_CheckStatus
    13. 6.13 ClearFSMStatus
  10. Single-Unit Emulation
    1. 7.1 User-Configuration
      1. 7.1.1 EEPROM_Config.h
      2. 7.1.2 F28P65x_EEPROM.c
    2. 7.2 EEPROM Functions
      1. 7.2.1  EEPROM_Config_Check
      2. 7.2.2  Configure_Protection_Masks
      3. 7.2.3  EEPROM_Write
      4. 7.2.4  EEPROM_Read
      5. 7.2.5  EEPROM_Erase
      6. 7.2.6  EEPROM_GetValidBank
      7. 7.2.7  EEPROM_Get_64_Bit_Data_Address
      8. 7.2.8  EEPROM_UpdateBankStatus
      9. 7.2.9  EEPROM_UpdatePageStatus
      10. 7.2.10 EEPROM_UpdatePageData
      11. 7.2.11 EEPROM_Get_64_Bit_Data_Address
      12. 7.2.12 EEPROM_Program_64_Bits
      13. 7.2.13 EEPROM_CheckStatus
      14. 7.2.14 ClearFSMStatus
    3. 7.3 Testing Example
  11. Application Integration
    1. 8.1 Software Functionality and Flow
  12. Adapting to Other Gen 3 C2000 MCUs
  13. 10Flash API
    1. 10.1 Flash API Checklist
      1. 10.1.1 Flash API Do's and Do Not's
  14. 11Source File Listing
  15. 12Troubleshooting
    1. 12.1 General
  16. 13Conclusion
  17. 14References
  18. 15Revision History

Configure_Protection_Masks

The Configure_Protection_Masks provides functionality to disable Write/Erase protection for any sector selected for EEPROM Emulation. This is done by calculating the appropriate Masks to pass to the Fapi_setupBankSectorEnable function. This requires two parameters, a pointer to the selected Flash Sector numbers, and the number of Flash Sectors to be emulated. For more details on the implementation of the Fapi_setupBankSectorEnable function, see the TMS320F28P65x Flash API Version 3.02.00.00 Reference Guide.

The return value of this function is used to disable Write/Erase protection in Flash Sectors selected for EEPROM Emulation.

// Initialize a variable to store the bits indicating which sectors  
// need to have write/erase protection disabled. 
// The first lower 32 bits represent CMDWEPROTA and the upper 32 
// bits represent CMDWEPROTB.
uint64 Protection_Mask_Sectors = 0;

// If we have more than one Flash Sector
if (Num_EEPROM_Sectors > 1)
{

    uint64 Unshifted_Sectors;
    uint16 Shift_Amount;

    // If all sectors use Mask A
    if (Sector_Numbers[0] < 32 && Sector_Numbers[1] < 32)
    {

        // Configure Mask A
        Unshifted_Sectors = (uint64) 1 << Num_EEPROM_Sectors;
        Unshifted_Sectors -= 1;
        Protection_Mask_Sectors |= (Unshifted_Sectors << Sector_Numbers[0]);

    }// If all sectors use Mask B
    else if (Sector_Numbers[0] > 31 && Sector_Numbers[1] > 31)
    {

        // Configure Mask B
        Shift_Amount = ((Sector_Numbers[1] - 32)/8) - ((Sector_Numbers[0] - 32)/8) + 1;
        Unshifted_Sectors = (uint64) 1 << Shift_Amount;
        Unshifted_Sectors -= 1;
        Protection_Mask_Sectors |= (Unshifted_Sectors << ((Sector_Numbers[0] - 32)/8));
        Protection_Mask_Sectors = Protection_Mask_Sectors << 32;

    } else // If both Masks A and B need to be configured
    {

        // Configure Mask B
        Shift_Amount = ((Sector_Numbers[1] - 32)/8) + 1;
        Unshifted_Sectors = (uint64) 1 << Shift_Amount;
        Unshifted_Sectors -= 1;
        Protection_Mask_Sectors |= Unshifted_Sectors;
        Protection_Mask_Sectors = Protection_Mask_Sectors << 32;

        // Configure Mask A
        Unshifted_Sectors = (uint64) 1 << ((32 - Sector_Numbers[0]) + 1);
        Unshifted_Sectors -= 1;
        Protection_Mask_Sectors |= (Unshifted_Sectors << Sector_Numbers[0]);

    }


} else { // If only using 1 Flash Sector

    if(Sector_Numbers[0] < 32)
    {
        Protection_Mask_Sectors |= ((uint64) 1 << Sector_Numbers[0]);
    } else
    {
        Protection_Mask_Sectors |= ((uint64) 1 << ((Sector_Numbers[0] - 32)/8));
        Protection_Mask_Sectors = Protection_Mask_Sectors << 32;
    }

}

return Protection_Mask_Sectors;
For comparison, the F28003x EEPROM Configure_Protection_Masks projects functionality differs from that of the F28P65x EEPROM project example with the amount of sectors available for protection. Each bit in the Write/Erase protection mask represents an individual sector.
// Initialize a variable to store the bits indicating which sectors need to have write/erase
    // protection disabled.
    uint16 Protection_Mask_Sectors = 0;
    uint16 Unshifted_Sectors;

    // If we have more than one Flash Sector
    if (Num_EEPROM_Sectors > 1)
    {
        // Configure mask
        Unshifted_Sectors = (uint16) 1 << Num_EEPROM_Sectors;
        Unshifted_Sectors -= 1;
        Protection_Mask_Sectors |= (Unshifted_Sectors << Sector_Numbers[0]);

    } else { // If only using 1 Flash Sector

        if(Sector_Numbers[0] < 16)
        {
            Unshifted_Sectors = (uint16) 1 << Sector_Numbers[0];
            Protection_Mask_Sectors |= Unshifted_Sectors;
        }

    }

    return Protection_Mask_Sectors;