ZHCUBI3A November   2023  – April 2024 TMS320F2800152-Q1 , TMS320F2800153-Q1 , TMS320F2800154-Q1 , TMS320F2800155 , TMS320F2800155-Q1 , TMS320F2800156-Q1 , TMS320F2800157 , TMS320F2800157-Q1

 

  1.   1
  2.   摘要
  3.   商标
  4. 1引言
    1. 1.1 参考书籍
    2. 1.2 函数清单格式
  5. 2TMS320F280013x/15x 闪存 API 概述
    1. 2.1 引言
    2. 2.2 API 概述
    3. 2.3 使用 API
      1. 2.3.1 初始化流程
        1. 2.3.1.1 器件上电后
        2. 2.3.1.2 闪存包装程序和存储体设置
        3. 2.3.1.3 关于系统频率变化
      2. 2.3.2 使用 API 进行构建
        1. 2.3.2.1 对象库文件
        2. 2.3.2.2 Distribution Files
        3. 2.3.2.3 Key Facts For Flash API Usage
  6. 3API 函数
    1. 3.1 初始化函数
      1. 3.1.1 Fapi_initializeAPI()
    2. 3.2 闪存状态机函数
      1. 3.2.1  Fapi_setActiveFlashBank()
      2. 3.2.2  Fapi_setupBankSectorEnable()
      3. 3.2.3  Fapi_issueAsyncCommandWithAddress()
      4. 3.2.4  Fapi_issueBankEraseCommand()
      5. 3.2.5  Fapi_issueProgrammingCommand()
      6. 3.2.6  Fapi_issueProgrammingCommandForEccAddresses()
      7. 3.2.7  Fapi_issueAutoEcc512ProgrammingCommand()
      8. 3.2.8  Fapi_issueDataAndEcc512ProgrammingCommand()
      9. 3.2.9  Fapi_issueDataOnly512ProgrammingCommand()
      10. 3.2.10 Fapi_issueEccOnly64ProgrammingCommand()
      11. 3.2.11 Fapi_issueAsyncCommand()
      12. 3.2.12 Fapi_checkFsmForReady()
      13. 3.2.13 Fapi_getFsmStatus()
    3. 3.3 读取函数
      1. 3.3.1 Fapi_doBlankCheck()
      2. 3.3.2 Fapi_doVerify()
    4. 3.4 信息函数
      1. 3.4.1 Fapi_getLibraryInfo()
    5. 3.5 实用功能
      1. 3.5.1 Fapi_flushPipeline()
      2. 3.5.2 Fapi_calculateEcc()
      3. 3.5.3 Fapi_isAddressEcc()
      4. 3.5.4 Fapi_remapEccAddress()
      5. 3.5.5 Fapi_calculateFletcherChecksum()
  7. 4推荐的 FSM 流程
    1. 4.1 新出厂器件
    2. 4.2 推荐的擦除流程
    3. 4.3 推荐的存储体擦除流程
    4. 4.4 推荐的编程流程
  8. 5与安全相关的软件应用程序使用假设
  9.   A 闪存状态机命令
  10.   B typedef、定义、枚举和结构
    1.     B.1 类型定义
    2.     B.2 定义
    3.     B.3 枚举
      1.      B.3.1 Fapi_FlashProgrammingCommandsType
      2.      B.3.2 Fapi_FlashBankType
      3.      B.3.3 Fapi_FlashStateCommandsType
      4.      B.3.4 Fapi_StatusType
      5.      B.3.5 Fapi_ApiProductionStatusType
    4.     B.4 结构
      1.      B.4.1 Fapi_FlashStatusWordType
      2.      B.4.2 Fapi_LibraryInfoType
  11.   C FAPI 库从 v2.00.01 到 v2.00.10 的变更摘要
  12.   D Revision History

Fapi_issueAutoEcc512ProgrammingCommand()

设置数据并向有效的闪存或 OTP 存储器地址发出 512 位(32 个 16 位字)AutoEcc 生成模式编程命令。

概要

Fapi_StatusType
Fapi_issueAutoEcc512ProgrammingCommand ( 
                               uint32 *pu32StartAddress, 
                               uint16 *pu16DataBuffer,
                               uint16 u16DataBufferSizeInWords  
                                       )

参数

pu32StartAddress [in] 闪存中的起始地址,用于对数据和 ECC 进行编程。
pu16DataBuffer [in] 指向数据缓冲区地址的指针。数据缓冲区的地址应为 512 位对齐。
u16DataBufferSizeInWords [in] 数据缓冲区中 16 位字的数量。最大数据缓冲区大小(以字为单位)不应超过 32。

说明

此函数会自动为用户提供的 512 位数据(第二个参数)生成 8 个字节的 ECC 数据,并在用户提供的 512 位对齐闪存地址(第一个参数)处将数据和 ECC 一起编程。发出此命令时,闪存状态机将对所有 512 位以及 ECC 进行编程。因此,使用该模式时,未提供的数据全部视为 1 (0xFFFF)。针对 512 位数据计算 ECC 并对其进行编程后,即使在该 512 位数据中将位从 1 编程为 0,也无法对此类 512 位数据进行重新编程(除非扇区被擦除),因为新的 ECC 值将与先前编程的 ECC 值相冲突。

注: Fapi_issueAutoEcc512ProgrammingCommand() 函数将对闪存中提供的数据部分以及自动生成的 ECC 进行编程。针对 512 位对齐地址和相应的 512 位数据计算 ECC。未提供的任何数据将视作 0xFFFF。请注意,在编写自定义编程实用程序时,该实用程序在代码项目的输出文件中流式传输,并将各段一次编程到闪存中,这会产生实际影响。如果一个 512 位的字跨越多个段(即包含一段的末尾和另一段的开头),在对第一段进行编程时,无法针对 64 位字中缺失数据假设值为 0xFFFF。当您对第二段进行编程时,您将无法对第一个 512 位字的 ECC 进行编程,因为它已经(错误地)使用假定的 0xFFFF 对缺失值进行了计算和编程。避免该问题的一种方法是在代码项目的链接器命令文件中的 512 位边界上对齐链接到闪存的所有段。
SECTIONS
  {
    .text       : > FLASH, ALIGN(32)
    .cinit      : > FLASH, ALIGN(32)
    .const      : > FLASH, ALIGN(32)
    .init_array : > FLASH, ALIGN(32)
    .switch     : > FLASH, ALIGN(32)
  }

如果不在闪存中对齐这些段,则需要跟踪段中不完整的 512 位字,并将它们与其他段中的字组合在一起,从而使 512 位字变得完整。这一点很难做到。因此,建议在 512 位边界上对段进行对齐。

某些第三方闪存编程工具或 TI 闪存编程内核示例 (C2000Ware) 或任何自定义闪存编程解决方案可能假定传入数据流全部为 512 位对齐,并且可能没有预想到某段可能从未对齐的地址开始。因此,假设提供的地址进行了 512 位对齐,其可能会尝试一次对最大可能的(512 位)字进行编程。当地址未对齐时,这可能会导致出现故障。因此,建议在 512 位边界上对齐所有段(映射到闪存)。

有关该函数允许的编程范围,请参阅表 3-3

表 3-3 Fapi_issueAutoEcc512ProgrammingCommand() 的允许编程范围
闪存 API 主阵列 DCSM OTP ECC 链路指针
Fapi_issueAutoEcc512ProgrammingCommand() 允许 允许 允许 不允许

限制

  • 如上所述,该函数一次最多只能对 512 位进行编程(鉴于提供的地址进行了 512 位对齐)。如果用户想对更多位进行编程,则应循环调用该函数,从而一次对 512 位进行编程。
  • 主阵列闪存编程必须与 512 位地址边界对齐,并且 32 个 16 位字在每个写入或擦除周期只能编程一次。
  • 以链路指针地址开头的 512 位地址范围应始终使用 128 位 Fapi_issueProgrammingCommand() 进行编程。

返回值

  • Fapi_Status_Success(成功)
  • Fapi_Status_FsmBusy(FSM 处于繁忙状态)
  • Fapi_Error_AsyncIncorrectDataBufferLength(失败:指定的数据缓冲区大小不正确。此外,如果在对存储体 0 DCSM OTP 空间进行编程时选择了 Fapi_EccOnly 模式,则会返回该错误)
  • Fapi_Error_FlashRegsNotWritable(失败:闪存寄存器写入失败。用户应确保 API 从与闪存操作的目标地址相同的区域执行,或者用户应在闪存操作之前解锁。)
  • Fapi_Error_FeatureNotAvailable(失败:用户传递了不受支持的模式)
  • Fapi_Error_InvalidAddress(失败:用户提供的地址无效。对于 TMS320F280013x,有关有效地址范围,请参阅 TMS320F280013x 微控制器数据手册。对于 TMS320F280015x,请参阅 TMS320F280015x 微控制器数据手册

实现示例

将在下一个 C2000ware 版本中发布此功能的示例实现。