大家好:
我在我的项目(S32K144)中调用 SDK flash init API,然后调用 Flash erase 和 Flash write。然后我发现 Flash 中的一些数据变成了 0xFF。然后我尝试在 Flash 初始化和 Flash 擦除/写入之间添加延迟,然后数据就正常了。然后我尝试检查 while (!(FTFC->FSTAT & FTFC_FSTAT_CCIF_MASK)); 而不是使用延迟函数。但它还是失败了。所以,我想知道是否需要延迟一段时间,等待闪存模块在硬件层完成初始化。
BR
洛基
嗨@Loky ,
你使用的是哪个驱动程序版本?
不建议使用旧版 SDK 驱动程序;应改用 RTD 驱动程序。
Flash_Init 函数不会修改闪存内容。
擦除和写入功能已经在内部轮询 CCIF 标志,因此无需在应用程序代码中轮询它。
您观察到的现象可能与缓存或闪存预取缓冲区有关。请尝试禁用它们(PCCCR、OCMDR0),并检查问题是否仍然存在。
此致,
丹尼尔
嗨,丹尼尔:
这是我们目前使用的SDK Flash驱动程序版本。我的同事告诉我,S32K144 只有 SDK Flash 驱动程序,没有 RTD 驱动程序。能否简要解释一下SDK驱动程序出了什么问题?如果您有S32K144 RTD驱动程序,能否分享给我?
我尝试了您提到的方法(禁用缓存),但没有成功。
当上电复位或低压检测RESET时,我会将一些信息记录到闪存中,并且同一扇区中还有一些其他数据。我将读取所有行业数据,更新信息并重写该行业相关内容。但我有一些新的发现。我发现读取闪存之前数据就已经是 0xFF 了。如果在执行擦除或写入指令时闪存意外断电,再次上电后,该扇区中的数据是否会变为 0xFF?我会继续调查这个问题,也许是我的软件出现了漏洞。
BR
洛基
嗨@Loky ,
该SDK是过时的软件。NXP 现在提供 RTD 驱动程序,其中也包括 Flash 驱动程序,包括 MCAL 层和与传统 SDK 等效的底层 IP 层。
您可以点击此处下载RTD软件包:
https://www.nxp.com/webapp/swlicensing/sso/downloadSoftware.sp?catid=SW32K1-RTD44-D
请确保您使用的是 RTD 发行说明中指定的兼容版本的 S32 Design Studio。
你是否也禁用了预取缓冲区?
OCMDR0 – 程序闪存预取缓冲区
OCMDR1 – 数据闪存预取缓冲区
如果在擦除或编程操作进行期间闪存意外断电,NXP 无法保证数据完整性。受影响的闪存内容将变为未定义状态,并且可能包含 ECC 错误。
考虑使用模拟 EEPROM 功能。
它是为此目的而优化的。
请参阅 AN11983 – 使用 S32K1xx EEPROM 功能
https://www.nxp.com/docs/en/application-note/AN11983.pdf
第五章 S32K1xx 电压骤降检测
第六章 S32K1xx 新快速写入模式
此致,
丹尼尔
嗨,丹尼尔:
谢谢你寄来的RTD包裹,我明天会查看。
我还没试过禁用预取缓冲区。你是说在擦除并写入闪存之前,我应该同时禁用缓存和预取吗?我也会试试。
是的,我今天确实遇到了一个无法纠正的 ECC 错误,它触发了硬故障。除了在设备通电后再次擦除该扇区之外,还有其他方法可以解决这个 ECC 问题吗?我认为这种方法不适用于我目前的软件设计。
谢谢你的建议。我将与同事们讨论模拟EEPROM。
BR
洛基
嗨,丹尼尔:
我很高兴地告诉大家,我们已经找到了根本原因,因为在断电期间 VCC-5v 不稳定,MCU 在低电压下反复 RESET,导致软件在初始化期间擦除闪存,但无法写入闪存。
BR
洛基