ZHCUBW3 April 2024
设置数据并向有效的闪存或 OTP 存储器地址发出 512 位(32 个 16 位字)AutoEcc 生成模式编程命令。
SECTIONS
{
.text : > FLASH, ALIGN(32)
.cinit : > FLASH, ALIGN(32)
.const : > FLASH, ALIGN(32)
.init_array : > FLASH, ALIGN(32)
.switch : > FLASH, ALIGN(32)
}
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。
闪存 API | 主阵列 | DCSM OTP | ECC | 链路指针 |
---|---|---|---|---|
Fapi_issueAutoEcc512ProgrammingCommand() | 允许 | 允许 | 允许 | 不允许 |
pu16DataBuffer 的长度不可超过 32。
该函数在发出编程命令后不检查 STATCMD。当 FSM 完成编程操作时,用户应用程序必须检查 STATCMD 值。STATCMD 指示编程操作期间是否有任何故障发生。用户应用程序可以使用 Fapi_getFsmStatus 函数来获取 STATCMD 值。
此外,用户应用程序应使用 Fapi_doVerify() 函数来验证闪存是否已正确编程。
该函数不会等到编程操作结束;它只是发出命令并返回。用户应用程序必须等待闪存包装程序完成编程操作,然后才能返回到任何类型的闪存访问。应将 Fapi_checkFsmForReady() 函数用于监测已发出命令的状态。
如上所述,该函数一次最多只能对 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(失败:用户提供的地址无效。有关有效地址范围,请参阅 TMS320F28P65x 微控制器数据手册。)
(请参阅 C2000Ware 中提供的闪存编程示例,该示例位于“C2000Ware_.....\driverlib\F28P65x\examples\....\flash\flashapi_512bit_programming\flashapi_cpu1_512bitprogramming.c”)