我对从 S32G274A 控制 Micron MT35XU512ABA QSPI 串行 NOR 闪存感到头疼。
该板是定制板(不是 NXP RDB2 或 EVP 之一)。
我使用 NXP Real
time-Driver Package SW32G_RTD_4.4_3.0.2_HF01 运行经典的 AUTOSAR 堆栈(但与更高版本的差异不是很大),配置了 Tresos 工具。
对于 Fls 驱动程序配置,我从恩智浦在“Integration_Reference_Examples_S32G2_2022_06”包中提供的 RDB2 示例配置开始,并从那里
修改它以使其适合 Micron MT35XU512ABA。
- otcal DDR 模式
- 寄存器读取、数据读取和页面编程/写入工作成功
问题:扇区擦除不起作用
我是 QSPI 闪存的新手,从一个例子跳到另一个例子。我仍然不明白是否为擦除 LUT 序列发送 1 个或 2 个 CMD 字节:
- Micron 数据表表明没有 CD 字节和 4 个地址字节,仅此而已。
- 我在其他文档(例如来自 NXP 网站的 S32G_QSPINOR_定制_20211125_V3.pdf)中看到人们在八进制 DDR 模式下使用 2 个 CMD 字节,其中一个是规范中的常用 CMD 代码,第二个字节是第一个的副本,或位反转值。我没有阅读任何规范,但背景是什么。
我看到了什么效果:
(1) 当我提供 1 cmd 代码加地址时
8-8-0
指令 = CMD_DDR,操作码 = 0xdc(擦除 128 kB 扇区)
指令 = ADDRESS_DDR,操作码 = 0x20(4 字节)
结果:无论是 QSPI IP SR.BUSY 标志还是闪存内部状态忙碌标志都没有在明显的持续时间内被阻塞,任何涉及的 RealtimeDriver API 均未返回错误,但扇区未被擦除。
最后 Qspi_Ip_EraseVerify() 失败(因为闪存内容不等于闪存擦除值)-> 扇区擦除不成功
(2) 当我提供 2 个命令加上地址
8-8-0
指令 = CMD_DDR,操作码 = 0xdc(擦除扇区)
指令 = CMD_DDR,操作码 = 0x23(0xdc 的位反转版本)
指令 = ADDRESS_DDR,操作码 = 0x20(4 字节) )
或
8-8-0
指令 = CMD_DDR,操作码 = 0xdc(擦除扇区)
指令 = CMD_DDR,操作码 = 0xdc(重复擦除扇区)
指令 = ADDRESS_DDR,操作码 = 0x20(4 字节)
结果:在将 LUT 序列从 QWSPI 控制器提交到闪存后,S32G2 QSPI 控制器的 SR.BUSY 标志被设置,并且 REMAINS 设置了很长时间。
(实际上大约 2 秒钟,直到我的软件挂断,因为这个过程花费的时间太长了)。
QSPI 控制器的 SR.AITF 位也被设置。
然而,在下一次上电复位后,我看到扇区实际上被成功擦除。
我有点迷茫,有以下问题:
a) 在 otcal DDR 模式下这些 1 字节或 2 字节的命令是什么?是否有我在某些文档中遗漏的一般规则?在 Micron 数据表中,我找不到
任何提示提交 2 个字节的 CMD 指令,命令表只列出了 1 个字节的命令。
b) S32G2 QSPI 控制器中的 SR.BUSY 标志:什么时候应该重置?
S32G2 参考手册第 38.6.2.6 章说:
“交易完成后(所有与外部串行闪存设备的发送和接收操作都已
完成),模块重置 SR[BUSY]。在 IP 命令的情况下,FR [TFF] 被断言。”
由于擦除序列不期望返回数据,我知道 SR.BUSY 位应该在将命令传输到闪存后重置,这应该在纳秒内完成。
(而不是等待闪存内的实际扇区擦除完成)。
c) 最后:我的擦除序列有什么问题?
看起来 2 字节序列是更好的方向,但我真的必须等待 SR.BUSY 标志直到扇区被擦除......?