SPRADE8A November 2023 – April 2024 F29H850TU , F29H859TU-Q1 , TMS320F28P650DH , TMS320F28P650DK , TMS320F28P650SH , TMS320F28P650SK , TMS320F28P659DH-Q1 , TMS320F28P659DK-Q1 , TMS320F28P659SH-Q1
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;