ZHCADD5A November   2023  – April 2024 TMS320F28P650DH , TMS320F28P650DK , TMS320F28P650SH , TMS320F28P650SK , TMS320F28P659DH-Q1 , TMS320F28P659DK-Q1 , TMS320F28P659SH-Q1

 

  1.   1
  2.   摘要
  3.   商标
  4. 简介
  5. EEPROM 与片上闪存的区别
  6. 概述
    1. 3.1 基本概念
    2. 3.2 单存储单元方法
    3. 3.3 乒乓方法
    4. 3.4 创建 EEPROM 节(页)和页标识
  7. 软件说明
    1. 4.1 软件功能和流程
  8. 乒乓仿真
    1. 5.1 用户配置
      1. 5.1.1 EEPROM_PingPong_Config.h
      2. 5.1.2 F28P65x_EEPROM_PingPong.c
    2. 5.2 EEPROM 函数
      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 测试示例
  9. 单存储单元仿真
    1. 6.1 用户配置
      1. 6.1.1 EEPROM_Config.h
      2. 6.1.2 F28P65x_EEPROM.c
    2. 6.2 EEPROM 函数
      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 测试示例
  10. 应用集成
  11. 适配其他第 3 代 C2000 MCU
  12. 闪存 API
    1. 9.1 闪存 API 检查清单
      1. 9.1.1 使用闪存 API 时的注意事项
  13. 10源文件清单
  14. 11故障排除
    1. 11.1 常见问题
  15. 12结语
  16. 13参考资料
  17. 14修订历史记录

EEPROM_UpdateBankStatus

EEPROM_UpdateBankStatus() 函数的功能是更新 EEPROM 组状态。此函数由 EEPROM_Write() 函数调用。首先读取 EEPROM 组状态,以确定如何继续。

Bank_Status[0] = *(Bank_Pointer);
Page_Status[0] = *(Page_Pointer); 

如果此状态表示 EEPROM 组为空,则状态会更改为当前并进行编程。

// Set Bank Status to Current Bank
Bank_Status[0] = CURRENT_BANK;
Bank_Status[1] = CURRENT_BANK;
Bank_Status[2] = CURRENT_BANK;
Bank_Status[3] = CURRENT_BANK;

// Clears status of previous Flash operation
ClearFSMStatus();
Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTA, WE_Protection_A_Mask);
Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTB, WE_Protection_B_Mask);

// Program Bank Status to current bank
oReturnCheck = Fapi_issueProgrammingCommand((uint32*) Bank_Pointer,
                                               Bank_Status, 4, 0, 0,
                                                 Fapi_AutoEccGeneration);

// Wait for completion and check for any programming errors
EEPROM_CheckStatus(&oReturnCheck);

// Set Page Pointer to first page of current bank
Page_Counter = 0;
Page_Pointer = Bank_Pointer + 8;

如果状态不为空,则接下来检查是否存在其中的所有页面都被使用的当前 EEPROM 组(已满 EEPROM 组)。在这种情况下,当前 EEPROM 组状态将更新以显示 EEPROM 组已满,并且下一个 EEPROM 组状态将更新为当前以允许对下一个 EEPROM 组进行编程。最后,页面指针会更新为新 EEPROM 组的第一页。

// Set Bank Status to Used Bank
Bank_Status[0] = CURRENT_BANK;
Bank_Status[1] = CURRENT_BANK;
Bank_Status[2] = CURRENT_BANK;
Bank_Status[3] = CURRENT_BANK;

// Clears status of previous Flash operation
ClearFSMStatus();
Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTA, WE_Protection_A_Mask);
Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTB, WE_Protection_B_Mask);

// Program Bank Status to full bank
oReturnCheck = Fapi_issueProgrammingCommand((uint32*) Bank_Pointer + 2,
                                              Bank_Status, 4, 0, 0,
                                                 Fapi_AutoEccGeneration);

// Wait for completion and check for any programming errors
EEPROM_CheckStatus(&oReturnCheck);

// Increment Bank Pointer to next bank
Bank_Pointer += Bank_Size;

// Set Bank Status to Current Bank
Bank_Status[0] = CURRENT_BANK;
Bank_Status[1] = CURRENT_BANK;
Bank_Status[2] = CURRENT_BANK;
Bank_Status[3] = CURRENT_BANK;

// Clears status of previous Flash operation
ClearFSMStatus();
Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTA, WE_Protection_A_Mask);
Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTB, WE_Protection_B_Mask);

// Program Bank Status to current bank
oReturnCheck = Fapi_issueProgrammingCommand((uint32*) Bank_Pointer,
                                              Bank_Status, 4, 0, 0,
                                                 Fapi_AutoEccGeneration);

// Wait for completion and check for any programming errors
EEPROM_CheckStatus(&oReturnCheck);

// Set Page Pointer to first page of current bank
Page_Counter = 0;
Page_Pointer = Bank_Pointer + 8;