SPRADE8A November 2023 – April 2024 F29H850TU , F29H859TU-Q1 , TMS320F28P650DH , TMS320F28P650DK , TMS320F28P650SH , TMS320F28P650SK , TMS320F28P659DH-Q1 , TMS320F28P659DK-Q1 , TMS320F28P659SH-Q1
The EEPROM_Config_Check() function provides general error-checking and configures Write/Erase protection masks required by the Flash API. This function should be called before programming or reading from the emulated EEPROM Unit(s).
First, the function verifies that the Flash Bank selected for EEPROM Emulation are valid. A valid Flash Bank selection must not select Bank 0 for emulation and must be supported by a specific device variant. For example, only specific F28p65x variants have Flash Banks 2-4. To verify this information, see the device-specific data-sheet.
if (FLASH_BANK_SELECT == FlashBank0StartAddress)
{
return 0xFFFF;
}
if (FLASH_BANK_SELECT == FlashBank2StartAddress)
{
#if !defined(F28P65xDKx) && !defined(F28P65xSKx) && !defined(F28P65xSHx)
return 0xFFFF;
#endif
} else if (FLASH_BANK_SELECT == FlashBank3StartAddress) // If using Bank 3
{
#if !defined(F28P65xDKx) && !defined(F28P65xSKx)
return 0xFFFF;
#endif
} else if (FLASH_BANK_SELECT == FlashBank4StartAddress)
{
#if !defined(F28P65xDKx) && !defined(F28P65xSKx) && !defined(F28P65xSHx)
return 0xFFFF;
#endif
}
Second, the validity of Flash Sectors selected for emulation is examined. This function checks for:
NUM_EEPROM_SECTORS = FIRST_AND_LAST_SECTOR[1] - FIRST_AND_LAST_SECTOR[0] + 1;
if (NUM_EEPROM_SECTORS > NUM_FLASH_SECTORS || NUM_EEPROM_SECTORS == 0)
{
return 0xEEEE;
}
if (NUM_EEPROM_SECTORS > 1)
{
if (FIRST_AND_LAST_SECTOR[1] <= FIRST_AND_LAST_SECTOR[0])
{
return 0xEEEE;
}
// Check if SECTOR_NUMBERS contains invalid sector
if (FIRST_AND_LAST_SECTOR[0] > NUM_FLASH_SECTORS - 1)
{
return 0xEEEE;
}
if (FIRST_AND_LAST_SECTOR[1] > NUM_FLASH_SECTORS - 1 || FIRST_AND_LAST_SECTOR[1] < 1)
{
return 0xEEEE;
}
} else // If only one sector, validate it is input properly
{
// Verify that the only sector is valid
if (FIRST_AND_LAST_SECTOR[0] > NUM_FLASH_SECTORS - 1) {
return 0xEEEE;
}
If using Page Mode, the following will also be checked for
// Calculate size of each EEPROM Bank (16 bit words)
Bank_Size = 8 + ((EEPROM_PAGE_DATA_SIZE + 8) * NUM_EEPROM_PAGES);
// Calculate amount of available space (16 bit words)
uint32 Available_Words = NUM_EEPROM_SECTORS * FLASH_SECTOR_SIZE;
// Check if size of EEPROM Banks and Pages will fit in EEPROM sectors
if (Bank_Size * NUM_EEPROM_BANKS > Available_Words)
{
return 0xCCCC;
}
It will also warn you with the appropriate code if one of the following conditions is detected:
// Notify for extra space (more than one bank leftover)
if (Available_Words - (Bank_Size * NUM_EEPROM_BANKS ) >= Bank_Size)
{
Warning_Flags += 1;
}
if (EEPROM_PAGE_DATA_SIZE < 5)
{
Warning_Flags += 2;
}
if (FIRST_AND_LAST_SECTOR[1] > 31) {
if (FIRST_AND_LAST_SECTOR[0] > 31)
{
if (NUM_EEPROM_SECTORS < 8) {
Warning_Flags += 4;
} else {
if ((FIRST_AND_LAST_SECTOR[0] % 8) != 0 || ((FIRST_AND_LAST_SECTOR[1] + 1) % 8 != 0))
{
Warning_Flags += 4;
}
}
} else
{
if ((FIRST_AND_LAST_SECTOR[1] + 1) % 8 != 0)
{
Warning_Flags += 4;
}
}
}
Finally, Write/Erase Protection masks are configured for the Active EEPROM Unit. This function also prepares Flash for Emulation by erasing the Sectors to be used for programming.
uint64 WE_Protection_AB_Mask = Configure_Protection_Masks(FIRST_AND_LAST_SECTOR, NUM_EEPROM_SECTORS);
WE_Protection_A_Mask = 0xFFFFFFFF ^ (uint32)WE_Protection_AB_Mask;
WE_Protection_B_Mask = 0x00000FFF ^ WE_Protection_AB_Mask >> 32;
EEPROM_Erase();