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_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;
}