ZHCAEX4 January 2025 F29H850TU , F29H859TU-Q1
EEPROM_GetValidBank() 函数的功能是查找当前 EEPROM 组和页面。EEPROM_Write_Page() 和 EEPROM_Read() 函数都会调用此函数。图 5-1 展示了搜索当前 EEPROM 组和页面所需的总体流程。
图 5-1 GetValidBank 流程进入此函数时,EEPROM 组指针和页面指针被设置为 FIRST_AND_LAST_SECTOR 中指定的第一个扇区的开头:
RESET_BANK_POINTER;
RESET_PAGE_POINTER;
这些指针的地址在 EEPROM_Config.h 文件中针对所使用的特定器件和 EEPROM 配置进行定义。
接下来,会找到当前 EEPROM 组。如 图 5-1 所示,EEPROM 组可以具有三种不同的状态:空、当前和已使用。
空 EEPROM 组由 128 个状态位全部为 1 (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) 表示。当前 EEPROM 组由前 64 位被设置为 0x5A5A5A5A5A5A5A5A、其余 64 位被设置为 1 表示。已使用的 EEPROM 组由全部 128 位被设置为 0x5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A 表示。可以根据需要更改这些值。
首先,程序会检查当前 EEPROM 组是否为空。如果是,则表示该 EEPROM 组尚未使用,无需进一步搜索。
if (Bank_in_Use == EMPTY_BANK)
{
Bank_Counter = i;
return;
}
如果未遇到空的 EEPROM 组,程序会检查该组是否被标记为当前。如果是,则会更新 EEPROM 组计数器并将页面指针设置为 EEPROM 组的第一页,以便在稍后的循环中进一步调整。然后退出该循环,因为不需要进一步的搜索。
if (Bank_in_Use == CURRENT_BANK && Bank_Full != CURRENT_BANK)
{
Bank_Counter = i;
Page_Pointer = Bank_Pointer + WRITE_SIZE_BYTES*2;
break;
}
最后,程序会检查 EEPROM 组是否已使用。如果是,EEPROM 组指针会更新到下一个 EEPROM 组,然后循环继续。
if (Bank_in_Use == CURRENT_BANK && Bank_Full == CURRENT_BANK)
{
Bank_Pointer += Bank_Size;
}
找到当前 EEPROM 组后,即可找到当前页面。页面可能具有三种不同的状态:空白、当前和已使用。
空页面由 128 个状态位全为 1 (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) 表示。当前 EEPROM 组由前 64 位被设置为 0xA5A5A5A5A5A5A5A5、其余 64 位被设置为 1 表示。已使用的 EEPROM 页面由 128 位全被设置为 0xA5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5 表示。如果需要,可以在 EEPROM_Config.h 中更改这些状态代码。
首先,程序会检查该页面是空白页面还是当前页面。如果是这样,则表明已找到正确的页面并退出循环。
if (Page_in_Use == BLANK_PAGE)
{
Page_Counter = i;
break;
}
if (Page_in_Use == CURRENT_PAGE && Page_Full != CURRENT_PAGE)
{
Page_Counter = i + 1;
break;
}
如果不是空白或当前页面,则必须使用该页面,并且页面指针会更新到下一个页面以测试其状态。
Page_Pointer += WRITE_SIZE_BYTES*2 + EEPROM_PAGE_DATA_SIZE;
此时,当前 EEPROM 组和页面已找到,调用函数可以继续运行。最后,此函数将会检查是否所有 EEPROM 组和页面均已使用。如果是这样,则最后一个组和页面会被标记为已满,以确保完整性,并擦除用于仿真的扇区。
if ((!ReadFlag) && (Bank_Counter == NUM_EEPROM_BANKS - 1) && (Page_Counter == NUM_EEPROM_PAGES))
{
EEPROM_UpdatePageStatus();
EEPROM_UpdateBankStatus();
EEPROM_Erase();
}
可以通过测试 EEPROM 组和页面计数器来执行该检查。表示已满 EEPROM 的 EEPROM 组和页面的数量将取决于应用配置。如上述代码片段中所示针对当前 EEPROM 组和页面执行测试时,会设置这些计数器。
为防止从已满 EEPROM 单元读取时发生过早擦除,如果已设置 Read_Flag,则不执行此检查。
如上所示,如果存储器已满,在调用 EEPROM_Erase() 函数并复位组和页面指针之前,请将最后一个页面和组标记为已使用,以确保完整性。