SPRADE8A November   2023  – April 2024 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

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. It 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 will represent CMDWEPROTA and the upper 32 
// bits will 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 example project's Configure_Protection_Masks 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 it's own 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;