以下是有关 API 使用的一些重要事实:
- 闪存 API 函数的名称以前缀 "Fapi_" 开头。
- 闪存 API 不配置 PLL。用户应用程序应根据需要配置 PLL 并将配置的 CPUCLK 值传递给 Fapi_initializeAPI() 函数(该函数的详细信息在本文档后面给出)。请注意,当系统频率小于或等于 20MHz 时,闪存 API 库不支持闪存擦除/编程操作。
- 闪存 API 不会检查 PLL 配置来确认用户输入频率。这由系统集成商决定。TI 建议使用 DCC 模块来检查系统频率。有关实现示例,请参阅 C2000Ware driverlib 时钟配置函数。
- 闪存 API 不会配置 BANKMUXSEL、FLASHCTLSEM (FLASHSEM) 和 CLKSEM(时钟配置控制信标)寄存器。用户应用程序应根据需要对其进行配置。有关这些寄存器的详细信息,请参阅 TMS320F28P65x 实时微控制器技术参考手册。
- 在调用闪存 API 函数之前,请始终根据器件特定数据手册配置等待状态。如果应用程序配置的等待状态不适合应用程序的工作频率,闪存 API 将发出错误。
- 闪存 API 执行可中断。但是,不应从正在进行擦除/编程操作的闪存组进行任何读取/获取访问。因此,闪存 API 函数、调用闪存 API 函数的用户应用程序函数以及所有 ISR(中断服务例程)必须从 RAM 或没有正在进行的活动擦除/编程操作的闪存组中执行。例如,除了闪存 API 函数之外,上述条件还适用于下面显示的整个代码片段。之所以会这样,是因为 Fapi_issueAsyncCommandWithAddress() 函数向 FSM 发出了擦除命令,但并没有等到擦除操作结束。只要 FSM 忙于进行当前操作,就不应访问正在擦除的闪存组。
//
// Erase a Sector
//
oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,(uint32*)0x0080000);
//
// Wait until the erase operation is over
//
while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){}
- 闪存 API 不配置(启用/禁用)看门狗。用户应用程序可以配置看门狗并根据需要对其进行维护。
- 主阵列闪存编程必须与 64 位地址边界对齐(建议在 128 位地址边界上对齐),并且每个 64 位字在每个写/擦除周期只能编程一次。
- 允许单独对数据和 ECC 进行编程。但是,每个 64 位数据字和相应的 ECC 字在每个写入/擦除周期只能编程一次。
- 不应针对链路指针位置对 ECC 进行编程。当为编程操作提供的起始地址是三个链路指针地址中的任何一个时,API 将跳过对 ECC 的编程。即使用户将 Fapi_AutoEccGeneration 或 Fapi_DataAndEcc 模式作为编程模式参数传递,API 也会使用 Fapi_DataOnly 模式对此类位置进行编程。Fapi_EccOnly 模式不支持对此类位置进行编程。用户应用程序应谨慎处理这一点。应注意为应用程序中的链路指针位置维护一个单独的结构/段。请勿将此类字段与其他 DCSM OTP 设置混合。如果其他字段与链路指针混合,API 也会跳过对非链路指针位置的 ECC 编程。这将导致应用程序中出现 ECC 错误。
- 使用 128 位 DCSM OTP 编程时,DCSM OTP 地址必须与 128 位地址边界对齐,并且每个 128 位字只能编程一次。例外包括:
- DCSM OTP 中的 DCSM Zx-LINKPOINTER1 和 Zx-LINKPOINTER2 值应一起编程,并且可以按照 DCSM 操作的要求一次编程 1 位。
- DCSM OTP 中的 DCSM Zx-LINKPOINTER3 值可按照 DCSM 操作的要求,一次编程 1 位。
- 如果需要,用户可以单独对 JLM_Enable 进行编程。如果用户要同时对所有 64 位进行编程,则必须读取链路指针(ZxOTP_LINKPOINTER1、ZxOTP_LINKPOINTER2、ZxOTP_LINKPOINTER3),并将该值与 JLM_Enable 值一起编程。
- 当其他对齐的 64 位被保留时,可以在给定的对齐 128 位字中对 64 位进行编程。
注: 除链路指针范围(0x00078000 至 0x00078008 和 0x00078200 至 0x00078208)外,在一些 512 位编程模式下允许对 DCSM OTP 进行编程。
表 2-6 展示了要对链路指针位置进行编程,您应将 Fapi_issueProgrammingCommand() 与 AutoECCGeneration 模式配合使用。
表 2-6 编程指针位置
512 位编程功能 |
对 DCSM OTP 和链路指针范围进行编程 |
Fapi_issueAutoEcc512ProgrammingCommand() |
允许 DCSM OTP,不允许链路指针 |
Fapi_issueDataAndEcc512ProgrammingCommand() |
允许 DCSM OTP,不允许链路指针 |
Fapi_issueDataOnly512ProgrammingCommand() |
不允许 DCSM OTP 和链路指针 |
Fapi_issueEccOnly64ProgrammingCommand() |
允许 ECC DCSM OTP,不允许 ECC 链路指针 |
- 为了避免 zone1 和 zone2 之间的冲突,DCSM 寄存器中提供了信标 (FLSEM) 来配置闪存寄存器。在对闪存进行初始化和调用闪存 API 函数之前,用户应用程序应该配置该信标寄存器。有关该寄存器的更多详细信息,请参阅 TMS320F28P65x 微控制器技术参考手册。
- 请注意,闪存 API 函数不配置任何 DCSM 寄存器。用户应用程序应确保配置所需的 DCSM 设置。例如,如果某个区域受到保护,则应从同一区域执行闪存 API,以便能够擦除或编程该区域的闪存扇区。或者应解锁该区域。否则,闪存 API 对闪存寄存器的写入将不会成功。闪存 API 不会检查对闪存寄存器的写入是否正在进行。其按照擦除/编程序列的要求向它们写入数据,并在假设写入完成后就返回。这将导致闪存 API 返回错误的成功状态。例如,调用 Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, Address) 时,可以返回成功状态,但这并不意味着扇区擦除成功。应使用 Fapi_getFSMStatus() 和 Fapi_doBlankCheck() 来检查擦除状态。
- 请注意,不应对正在进行闪存擦除/编程操作的闪存组/OTP 进行任何访问。