ZHCADD5B November   2023  – August 2025 F29H850TU , F29H859TU-Q1 , 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. 软件说明
  8. 乒乓仿真
    1. 5.1 用户配置
      1. 5.1.1 EEPROM_PingPong_Config.h
      2. 5.1.2 F28P65x_EEPROM_PingPong.c
    2. 5.2 测试示例
  9. EEPROM 函数
    1. 6.1  EEPROM_Config_Check
    2. 6.2  Configure_Protection_Masks
    3. 6.3  EEPROM_Write
    4. 6.4  EEPROM_Read
    5. 6.5  EEPROM_Erase
      1. 6.5.1 Erase_Bank
    6. 6.6  EEPROM_GetValidBank
    7. 6.7  EEPROM_UpdateBankStatus
    8. 6.8  EEPROM_UpdatePageStatus
    9. 6.9  EEPROM_UpdatePageData
    10. 6.10 EEPROM_Get_64_Bit_Data_Address
    11. 6.11 EEPROM_Program_64_Bits
    12. 6.12 EEPROM_CheckStatus
    13. 6.13 ClearFSMStatus
  10. 单存储单元仿真
    1. 7.1 用户配置
      1. 7.1.1 EEPROM_Config.h
      2. 7.1.2 F28P65x_EEPROM.c
    2. 7.2 EEPROM 函数
      1. 7.2.1  EEPROM_Config_Check
      2. 7.2.2  Configure_Protection_Masks
      3. 7.2.3  EEPROM_Write
      4. 7.2.4  EEPROM_Read
      5. 7.2.5  EEPROM_Erase
      6. 7.2.6  EEPROM_GetValidBank
      7. 7.2.7  EEPROM_Get_64_Bit_Data_Address
      8. 7.2.8  EEPROM_UpdateBankStatus
      9. 7.2.9  EEPROM_UpdatePageStatus
      10. 7.2.10 EEPROM_UpdatePageData
      11. 7.2.11 EEPROM_Get_64_Bit_Data_Address
      12. 7.2.12 EEPROM_Program_64_Bits
      13. 7.2.13 EEPROM_CheckStatus
      14. 7.2.14 ClearFSMStatus
    3. 7.3 测试示例
  11. 应用集成
    1. 8.1 软件功能和流程
  12. 适配其他第 3 代 C2000 MCU
  13. 10闪存 API
    1. 10.1 闪存 API 检查清单
      1. 10.1.1 使用闪存 API 时的注意事项
  14. 11源文件清单
  15. 12排查
    1. 12.1 通用
  16. 13结语
  17. 14参考资料
  18. 15修订历史记录

EEPROM_UpdatePageData

EEPROM_UpdatePageData() 函数的功能是更新 EEPROM 页数据。此函数由 EEPROM_Write() 函数调用。

为了实现这一目标,需要采取以下步骤:

  1. 清除闪存状态机 (FSM) 状态。
  2. 配置闪存扇区的编程/擦除保护。
    • EEPROM 仿真中未使用的扇区将启用保护。
    • EEPROM 仿真中已使用的扇区将禁用保护。
  3. 计算相对于页面指针的偏移量以写入数据。
    1. 这是必需的,因为一次仅写入 64 位。因此,如果数据大小大于 64 位,则需要多次调用闪存 API 才能写入整个页面。
  4. 等待编程完成并检查是否存在任何编程错误。
    // 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);
    
    // Variable for page offset 
    // (first write position has offset of 2 (64 bits),
    // second has offset of 4 (128 bits), etc.)
    uint32 Page_Offset = 4 + (2 * i);
    
    // Program data located in Write_Buffer to current page
    oReturnCheck = Fapi_issueProgrammingCommand((uint32*) Page_Pointer + Page_Offset, Write_Buffer + (i*4), 4, 0, 0, Fapi_AutoEccGeneration);
    
    // Wait for completion and check for any programming errors
    EEPROM_CheckStatus(&oReturnCheck);

以下参数被传递至闪存 API 以进行编程。

  • 页面指针(编程地址)
  • 包含待写入数据的缓冲区
  • 要编程的数据长度
  • 编程模式

使用 Fapi_AutoEccGeneration 模式时,第四个和第五个参数为零。有关更多详细信息,请参阅 TMS320F28P65x 闪存 API 版本 3.02.00.00 参考指南

如果编程成功,则会更新当前页面的页面状态并清除 Empty_EEPROM 标志。代码如下所示:

if(oReturnCheck == Fapi_Status_Success)
{
    // Set Page Status to Current Page
    Page_Status[0] = CURRENT_PAGE;
    Page_Status[1] = CURRENT_PAGE;
    Page_Status[2] = CURRENT_PAGE;
    Page_Status[3] = CURRENT_PAGE;

    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);

    oReturnCheck = Fapi_issueProgrammingCommand((uint32*)Page_Pointer, 
                                                Page_Status, 4, 0, 0,
                                                 Fapi_AutoEccGeneration);

    // Wait for completion and check for any programming errors
    EEPROM_CheckStatus(&oReturnCheck);
    Empty_EEPROM = 0;
}

成功写入后,该函数会检查是否需要擦除非活动 EEPROM 单元。如果需要,则该函数调用 EEPROM_Erase,清除标志并重新配置 W/E 保护掩码。在调用擦除之前发出用于设置空白检查的标志。擦除非活动单元的标志在 EEPROM_GetValid_Bank 中设置。

if (Erase_Inactive_Unit)
{
    // Erase the inactive (full) EEPROM Bank
    Erase_Blank_Check = 1;
    EEPROM_Erase();
    Erase_Inactive_Unit = 0;

    // Re-configure Write/Erase Protection Masks for active EEPROM Bank
    uint64 WE_Protection_AB_Mask = Configure_Protection_Masks(
          FIRST_AND_LAST_SECTOR[EEPROM_ACTIVE_UNIT], NUM_EEPROM_SECTORS);


    WE_Protection_A_Mask = 0xFFFFFFFF ^ (uint32)WE_Protection_AB_Mask;
    WE_Protection_B_Mask = 0x00000FFF ^ WE_Protection_AB_Mask >> 32;
}