ZHCAEX4 January 2025 F29H850TU , F29H859TU-Q1
EEPROM_Config_Check() 函数提供一般错误检查并配置闪存 API 所需的写入/擦除保护掩码。应在对仿真 EEPROM 单元进行编程或读取之前调用此函数。
第一,该函数验证选择用于 EEPROM 仿真的闪存组是否有效。只有数据存储体是 F29x 上的有效选择。
if (FLASH_BANK_SELECT != C29FlashBankFR4RP0StartAddress)
{
return 0xFFFF;
}
第二,检查选择用于仿真的闪存扇区的有效性。该函数检查:
uint32_t NUM_EEPROM_SECTORS_1 = FIRST_AND_LAST_SECTOR[0][1] - FIRST_AND_LAST_SECTOR[0][0] + 1;
uint32_t NUM_EEPROM_SECTORS_2 = FIRST_AND_LAST_SECTOR[1][1] - FIRST_AND_LAST_SECTOR[1][0] + 1;
if (NUM_EEPROM_SECTORS_1 != NUM_EEPROM_SECTORS_2)
{
return 0xEEEE;
}if (NUM_EEPROM_SECTORS > NUM_FLASH_SECTORS || NUM_EEPROM_SECTORS == 0)
{
return 0xEEEE;
}if (NUM_EEPROM_SECTORS > 1)
{
if (FIRST_AND_LAST_SECTOR[0][1] <= FIRST_AND_LAST_SECTOR[0][0])
{
return 0xEEEE;
}
if (FIRST_AND_LAST_SECTOR[1][1] <= FIRST_AND_LAST_SECTOR[1][0])
{
return 0xEEEE;
}
if (FIRST_AND_LAST_SECTOR[0][1] > NUM_FLASH_SECTORS - 1 || FIRST_AND_LAST_SECTOR[0][1] < 1)
{
return 0xEEEE;
}
if (FIRST_AND_LAST_SECTOR[1][1] > NUM_FLASH_SECTORS - 1 || FIRST_AND_LAST_SECTOR[1][1] < 1)
{
return 0xEEEE;
}
}
else if (FIRST_AND_LAST_SECTOR[0][0] > NUM_FLASH_SECTORS - 1 ||
FIRST_AND_LAST_SECTOR[1][0] > NUM_FLASH_SECTORS - 1)
{
return 0xEEEE;
}if (FIRST_AND_LAST_SECTOR[0][0] <= FIRST_AND_LAST_SECTOR[1][1] &&
FIRST_AND_LAST_SECTOR[1][0] <= FIRST_AND_LAST_SECTOR[0][1])
{
return 0xEEEE;
}
Bank_Size = WRITE_SIZE_BYTES*2 +
((EEPROM_PAGE_DATA_SIZE + WRITE_SIZE_BYTES*2) * NUM_EEPROM_PAGES);
uint32_t Available_Words = NUM_EEPROM_SECTORS * FLASH_SECTOR_SIZE;
if (Bank_Size * NUM_EEPROM_BANKS > Available_Words)
{
return 0xCCCC;
}uint64_t WE_Protection_AB_Sectors_Unit_0 = Configure_Protection_Masks(FIRST_AND_LAST_SECTOR[0],
NUM_EEPROM_SECTORS);
uint64_t WE_Protection_AB_Sectors_Unit_1 = Configure_Protection_Masks(FIRST_AND_LAST_SECTOR[1],
NUM_EEPROM_SECTORS);
if (WE_Protection_AB_Sectors_Unit_0 & WE_Protection_AB_Sectors_Unit_1)
{
return 0xEEEE;
}
如果检测到以下非致命条件之一,则会发出警告。每个标志对应于函数返回值中的位:
if (Available_Words - (Bank_Size * NUM_EEPROM_BANKS ) >= Bank_Size)
{
Warning_Flags += 1;
}if (EEPROM_PAGE_DATA_SIZE <= WRITE_SIZE_BYTES)
{
Warning_Flags += 2;
}如果使用 32-127 范围内的扇区(对于 F29H85x 器件)并且未使用分配给写入/擦除保护掩码中单个位的全部八个扇区,则会发出警告。由 single-bit 设计的八个扇区中任何未使用的扇区都无法受到适当的擦除保护。有关写入/擦除保护掩码如何与扇区对应的更多信息,请参阅 F29H85x 闪存 API 参考指南
uint8_t i;
for (i = 0; i < 2; i++)
{
// If using any sectors > 31
if (FIRST_AND_LAST_SECTOR[i][1] > 31)
{
// If all sectors are > 31 (use protection mask B)
if (FIRST_AND_LAST_SECTOR[i][0] > 31)
{
// If using < 8 sectors (will be clearing more than necessary)
if (NUM_EEPROM_SECTORS < 8)
{
Warning_Flags += 4;
break;
}
// if sector isn't a multiple of 8 (will be clearing more than necessary)
else if ((FIRST_AND_LAST_SECTOR[i][0] % 8) != 0 ||
(FIRST_AND_LAST_SECTOR[i][1] + 1) % 8 != 0)
{
Warning_Flags += 4;
break;
}
}
// if sector isn't a multiple of 8 (will be clearing more than necessary)
else if ((FIRST_AND_LAST_SECTOR[i][1] + 1) % 8 != 0)
{
Warning_Flags += 4;
break;
}
}
}