标准 SPI 指令使用单向 DI(输入)引脚将指令、地址或数据串行写入串行时钟(CLK)输入引脚上升沿上的设备 标准 SPI 还使用单向 DO(输出)来从 CLK 下降沿上的设备读取数据或状态。
标准 SPI 说明 W25M02GV 通过 SPI 兼容总线访问,该总线由四个信号组成: 串行时钟(CLK)、芯片选择(/CS)、串行数据输入(DI)和串行数据输出(DO)。
DO 输出引脚用于从 CLK 下降沿上的设备读取数据或状态。 支持 SPI 总线操作模式 0(0,0)和 3(1,1)。
模式 0 和模式 3 之间的主要区别在于当 SPI 总线主机处于待机状态且数据未传输到串行闪存时,CLK 信号的正常状态。 对于模式 0,CLK 信号在/CS 的下降和上升边缘通常较低。
为每个堆叠的 W25N01GV 模具提供三个状态寄存器: 保护寄存器(SR-1)、配置寄存器(SR-2)和状态寄存器(SR-3)。 每个寄存器分别由读状态寄存器和写状态寄存器命令结合 1 字节寄存器地址访问。
读取状态寄存器指令(05h/0Fh)可用于提供有关闪存阵列可用性的状态, 无论设备是写启用还是禁用、写入保护状态、读取模式、保护寄存器/OTP 区域锁定状态、擦除/程序结果、ECC 使用/状态。
与状态寄存器的块保护位 BP[3:0]和状态寄存器 Protect SRP bits SRP[1:0]一起使用时,小到 256K 字节(2x128KB 块)或最多整个 内存阵列的一部分都可以受到硬件保护。
/WP 引脚作为四重 SPI 操作的数据输入/输出引脚,以及用于 SR-1 写保护功能的有源低输入引脚。 有关详细信息,请参阅第 7.1.3 节。
当 WP-E=1 时,设备处于硬件保护模式,即/WP 成为整个设备写保护的专用有源低输入引脚。 如果/WP 连接到 GND,则所有“写入/编程/擦除”功能都将被禁用。 整个设备(包括所有寄存器、内存阵列、OTP 页)将变为只读。
当(/HOLD)低时,/CS 低时,DO 引脚将处于高阻抗状态,DI 和 CLK 引脚上的信号将被忽略(无所谓)。 当(/HOLD)被调高时,设备操作可以恢复。
当发出 Quad SPI Read/Buffer Load 命令时,(/HOLD)pin 将成为 Quad 操作的数据 I/O pin,并且在当前 Quad 操作完成之前没 有可用的 HOLD 函数。
块保护位(BP3、BP2、BP1、BP0 和 TB)是状态寄存器 1(S6、S5、S4、S3 和 S2)中的易失性读/写位,提供写保护控制和状态。 块保护位可以使用写入状态寄存器指令进行设置。内存阵列的所有、无或一部分都可以受到程序和擦除指令的保护(请参阅状态寄存器内存保护表)。
块保护位的默认值在通电后为 1,以保护整个阵列。 需要清零这些保护位才能进行擦除操作和编程操作(写入数据操作) 如果配置寄存器(SR-2)中的 SR1-L 位设置为 1,则默认值为 OTP 锁定的值。
写保护启用位(WP-E)是状态寄存器 1(S1)中的易失性读/写位。 WP-E 位与 SRP1 和 SRP0 一起控制写保护的方法: 软件保护,硬件保护、电源锁定或一次性可编程(OTP)保护、/WP 引脚功能和四重 SPI 操作启用/禁用。
当 WP-E=0(默认值)时,设备处于软件保护模式,/WP&/HOLD 管脚被多路复用为 IO 管脚,并且四路程序/读取功能一直处于启 用状态。
状态寄存器保护位(SRP1 和 SRP0)是状态寄存器(S0 和 S7)中的易失性读/写位。 SRP 位控制写保护的方法:软件保护,硬件保护,电源锁定或一次性可编程(OTP)保护。
只能向 OTP 区域发出程序命令,将数据从“1”更改为“0”,并且数据不能通过 Erase 命令可逆(“0”到“1”)。 一旦正确的数据被编程和验证,系统开发人员可以将 OTP-L 位设置为1,这样整个 OTP 区域将被锁定,以防止对数据的进一步修改。
OTP-E 位必须设置为 1,以便使用标准程序/读取命令访问 OTP 区域以及读取唯一的 ID/参数页信息。 通电命令后的默认值为 0 或复位。
内部 ECC 计算在页面编程期间完成,结果存储在每个页面的额外 64 字节区域中。 在数据读取操作期间,ECC 引擎将根据先前存储的 ECC 信息验证数据值,并在需要时进行必要的更正。 验证和校正状态由 ECC 状态位指示。
每个堆叠的 W25N01GV 芯片为读取操作提供两种不同的模式,缓冲区读取模式(BUF=1)和连续读取模式(BUF=0)。 在任何读取操作之前,需要一个页面数据读取命令来启动从内存数组中的指定页到数据缓冲区的数据传输。 默认情况下,通电后,第 0 页中的数据将自动加载到数据缓冲区中,设备已准备好接受任何读取命令。
缓冲区读取模式(BUF=1)需要一个列地址来开始输出数据缓冲区内的现有数据, 一旦到达数据缓冲区(字节 2111)的末尾,DO(IO1)引脚将变为 high-Z 状态。 连续读取模式(BUF=0)不需要起始列地址。 设备将始终从数据缓冲区的第一列(字节 0)开始输出数据, 一旦到达数据缓冲区(字节 2048)的末尾,数据输出将继续通过下一个内存页。 在连续读取模式下,可以使用单个读取命令读取整个内存阵列。
为了方便 NAND 闪存坏块管理,每个堆叠的 W25N01GV 芯片都配备了内部坏块管理查找表(BBM LUT)。 一个好的内存块可以替换多达 20 个坏内存块。 块的地址作为逻辑块地址(LBA,坏块)和物理块地址(PBA,good 块)存储在内部查找表中。
LUT-F 位指示 20 个存储器块链路是否已被充分利用。 LUT-F 的默认值为 0,一旦全部 20 个链路都被使用, LUT-F 将变为 1,并且不可能建立更多的存储块链路。
在 NAND 闪存中使用 ECC 功能来纠正读取操作中的有限内存错误。 读取操作完成后,应检查 ECC 状态位(ECC-1、ECC-0),以验证数据的完整性。 如果 ECC-E=0,ECC 状态位值不重要。 在通电循环或复位命令后,这些位将被清除为 0。
ECC-1=0
|
ECC-0=0
|
整个数据输出成功,无需任何 ECC 校正。
|
ECC-1=0
|
ECC-0=1
|
整个数据输出成功,单页或多页中有 1~4 位/页 ECC 校正。
|
ECC-1=1
|
ECC-0=0
|
整个数据输出仅在单个页面中包含超过 4 位的错误,ECC 无法修复这些错误。
|
在连续读取模式下,可以使用附加命令来读取出现错误的页地址(PA)。
| ||
ECC-1=1
|
ECC-0=1
|
整个数据输出在多个页面中包含超过 4 位的错误/页。(仅适用于连续读取操作(BUF=0))
|
程序/擦除失败位用于指示内部控制的程序/擦除操作是否成功执行。 当向锁定或受保护的存储器阵列或 OTP 区域发出程序或擦除命令时,这些位也将被分别设置。 在程序执行或块擦除指令以及设备复位指令开始时,这两个位都将被清除。
写启用闩锁(WEL)是状态寄存器(S1)中的一个只读位,在执行写启用指令后被设置为 1。 当设备被禁用写入时,WEL 状态位被清除为 0。 写入禁用状态在通电时或以下任何指令之后发生:
BUSY 是状态寄存器(S0)中的只读位, 当设备通电或执行页面数据读取、坏块管理、程序执行、块擦除、OTP 区域的程序执行、 OTP 锁定或连续读取指令之后,该位被设置为 1 状态。 在此期间,设备将忽略除读取状态寄存器和读取 JEDEC ID 指令以外的其他指令。 当程序、擦除或写入状态寄存器指令完成时,忙位将被清除
状态寄存器 1/保护寄存器:Addr=Axh 状态寄存器 2/配置寄存器:Addr=Bxh 状态寄存器3/状态寄存器:Addr=Cxh
11、对于连续读取模式下的所有读取操作,一旦/CS 信号被调高以终止读取操作,设备仍将保持忙碌状态~5us(busy=1),并且数据 缓冲区内的所有数据都将丢失,无法可靠使用。
12、对于缓冲区读取模式下的所有读取操作,一旦/CS 信号变为高以终止读取操作,设备将准备好接受新的指令,并且数据缓冲区内 的所有数据将与上一页数据读取指令保持不变。
每个叠层模具都有工厂预先指定的“模具 ID”,顺序为 0x00、0x01 等。 在任何给定的时间,W25M 包内只能有一个活动的模具,用于与外部 SPI 控制器通信。 通电后,模具 0 始终为活动模具。
“并行操作”可以通过分配当前活动的模具来执行需要一定时间才能完成的擦除/程序操作来实现。 当内部程序/擦除操作正在进行时,控制器可以发出“软件模具选择(C2h)”指令来选择另一个要激活的模具。 根据系统要求,可以在新选择的活动模具上执行读取、编程或擦除操作。 “边读边程序/擦除”或“多芯片程序/擦除”可以以这种方式执行,以提高系统程序/擦除吞吐量,并避免在某些应用程序中持续的 程序/擦除挂起和恢复活动。
在设备加电和复位期间,建议不要发出“软件模具选择(C2h)”命令,以避免设备可能的未知状态。 最小 tVSL(见第 56 页)和最大 tRST(见第 60 页)值可分别应用于“软件模具选择(C2h)”命令。
如果发送到设备的模具 ID 错误,则两个堆叠的 W25N01GV 模具都可能闲置。 在这种情况下,应发出一个新的“软件模具选择(C2h)”命令, 后跟正确的模具 ID(0x00 或 0x01),以重新选择激活的模具。
由于封装小,引脚数量有限,W25M02GV 提供软件复位指令,而不是专用复位引脚。 一旦复位指令被接受,任何正在进行的内部操作都将被终止,设备将返回其默认上电状态,并丢失所有当前易失性设置,例如易失性 状态寄存器位。
一旦设备接受复位命令,设备将需要大约 tRST 来复位,根据设备正在执行的当前操作,tRST 可以是 5us~500us。 在此期间,不接受任何命令。
此外,“软件模具选择(C2h)”不应在最大 tRST(500us)时间段内发出,以避免由于模具的重置状态而导致的模具选择混乱。 当设备接受复位命令序列时,如果正在进行内部擦除或程序操作,则可能会发生数据损坏。 建议在发出复位命令之前检查状态寄存器中的忙位。
Read JEDEC ID 指令与 2003 年采用的 SPI 兼容串行存储器 JEDEC 标准兼容。 该指令通过驱动/CS 引脚低并移动指令代码“9Fh”和 8 个假时钟来启动。
该指令通过驱动/CS low,并将指令代码“0Fh 或 05h”移到 CLK 上升沿上的 DI 引脚中,然后是一个 8 位状态寄存器地址。 然后状态寄存器位在 CLK 下降沿的 DO 引脚上移出,首先是最有效位(MSB),如图 7 所示。
读取状态寄存器指令可在任何时候使用,即使在程序或擦除周期正在进行时也是如此。 这允许检查忙状态位以确定周期何时完成以及设备是否可以接受另一条指令。 状态寄存器可以连续读取。
写入状态寄存器指令允许写入状态寄存器。 可写状态寄存器位包括:
状态寄存器 1 中的 SRP[1:0]、TB、BP[3:0]和 WP-E 位; 状态寄存器 2 中的 OTP-L、OTP-E、SR1-L、ECC-E 和BUF 位。
要写入状态寄存器位,输入指令的方法是:驱动/CS low,发送指令代码“1Fh 或 01h”,然后发送 8 位状态寄存器地址,然后写入状 态寄存器数据字节,如图 8 所示。 状态寄存器说明见第 7.1-3 节。
通过驱动/CS low,将指令代码“04h”移到 DI pin,然后驱动/CS high,输入写禁用指令。 请注意,WEL 位在通电后以及页面程序、四页程序、块擦除、重置和坏块管理指令完成后自动重置。
由于 NAND 内存密度大,且受技术限制,在出厂测试中发现一定数量的“坏块”时,NAND 内存设备允许运往最终客户。 装运时,多达 2%的内存块可标记为“坏块”,这是每个堆叠的 W25N01GV 模具最多 20 块。 为了识别这些坏块,建议扫描整个内存阵列以查找出厂时设置的坏块标记。
“坏块标记”是存储在每个坏块的第 0 页字节 0 处的非 FFh 数据字节。 另一个标记也存储在 64 字节备用区域的第一个字节中。
W25M02GV 提供了一种方便的方法来管理 NAND 闪存中在大量使用后通常发现的坏块。 “坏块管理”命令是通过将指令代码“A1h”移到 DI 管脚,然后是 16 位“逻辑块地址”和16 位“物理块地址”,如图 11 所示。 在设备接受坏块管理指令之前,必须执行写启用指令(状态寄存器位 WEL=1)。 逻辑块地址是“坏”块的地址,它将被物理块地址指示的“好”块替换。
成功执行坏块管理命令后,指定的 LBA-PBA 链接将添加到内部查找表(LUT)。 在非易失性 LUT 中可以建立多达 20 个链路。
如果所有 20 条链路都已写入,状态寄存器中的 LUT-F 位将变为 1,并且不能再建立 LBA-PBA 链路。 因此,在发出坏块管理命令之前,可以检查 LUT-F 位值,或者可以发出“阅读BBM 查找表”命令来确认 LUT 中是否仍然有备用链路
为了保证前 1000 个块上的连续读取操作,制造商可能使用了一些 BBM LUT 入场权。 建议用户在第一次擦除/程序操作之前扫描所有块并保存所有制造商坏块的表。 禁止在多个 PBA 中注册同一地址。它可能导致意外行为。
所有块地址链路将从 LUT 中的第一个链路(LBA0 和 PBA0)开始按顺序输出。 如果有未使用的可用链接,输出将包含所有“00h”数据。
当状态/配置寄存器中的 ECC-E 位设置为 1(也是加电默认值)时,所有程序和读取操作都启用内部 ECC 算法。 在特定页面的“程序执行”命令期间,ECC 算法将根据 2K 字节数据缓冲区内的数据计算 ECC 信息,并将 ECC 数据写入同一物理内存 页中额外的 64 字节 ECC 区域。
对于“连续读取模式(BUF=0)”操作,可以通过发出单个读取命令连续读取多页主阵列数据。 在完成读取操作后,应检查 ECC 状态位,以验证读取的数据中是否存在 ECC 校正或不可纠正的错误。
如果 ECC-1 和 ECC-0 等于(1,0)或(1,1),则以前读取的数据包含一个或多个包含 ECC 不可纠正错误的页。 可以通过发出“上次 ECC 失败页地址”命令获得失败页面地址(如果是多个页面,则为最后一个页面地址),如图 13 所示。 包含不可纠正 ECC 错误的 16 位页地址将显示在指令代码“A9h”之后的 DO 引脚上,DI 引脚上的 8 位虚拟时钟之后。
在设备接受块擦除指令(状态寄存器位 WEL 必须等于 1)之前,必须执行写启用指令。 该指令通过驱动/CS 引脚低,并移动指令代码“D8h”,然后是 8 位虚拟时钟和 16 位页地址来启动。 块擦除指令序列如图 14 所示。
在锁存最后一个字节的第八位之后,/CS 引脚必须被驱动到高位。 如果不这样做,将不执行块擦除指令。
在/CS 被驱动为高电平后,自定时块擦除指令将在 tBE 的持续时间内开始(参见交流特性)。 当块擦除周期正在进行时,仍可以访问读取状态寄存器指令以检查忙位的状态。 在块擦除周期中,忙位为 1,当周期结束且设备准备再次接受其他指令时,忙位变为 0。 块擦除周期完成后,状态寄存器中的写入启用闩锁(WEL)位被清除为 0。 如果寻址块受块保护(TB、BP2、BP1 和 BP0)位保护,则不会执行块擦除指令。
这里虽然用的是页地址,擦除擦除时还是按块擦除,即 64 页的数据都擦除。 这使得数据不好进行修改操作,这是这个 IC 的缺点。 另一个缺点就是存在坏块,所以需要坏块管理。
程序操作允许在先前擦除的(FFh)内存位置对 1 字节到 2112 字节(一页)的数据进行编程。 程序操作包括两个步骤:
在设备接受加载程序数据指令(状态寄存器位 WEL=1)之前,必须执行写启用指令。 “加载程序数据”或“随机加载程序数据”指令是通过驱动/CS 引脚低,然后将指令代码“02h”或“84h”后接 16 位列地址(只有 CA[11:0]有效)和至少一个字节的数据转移到 DI 管脚来启动。
当数据被发送到设备时,/CS 引脚在整个指令长度内必须保持在低位。 如果发送到设备的数据字节数超过数据缓冲区中的数据字节数,设备将忽略多余的数据。 加载程序数据指令序列如图 15 所示。
“加载程序数据”和“随机加载程序数据”指令共享相同的命令序列。 不同的是,“加载程序数据”指令会将数据缓冲区中未使用的数据字节重置为 FFh 值,而“随机加载程序数据”指令只更新命令输入 序列指定的数据字节,其余数据缓冲区将保持不变。
在程序数据加载到 2112 字节数据缓冲区(或在启用 ECC 时为 2048 字节)后,程序执行指令将数据缓冲区内容编程到指令中指定的 物理内存页中。
在/CS 被驱动到高电平以完成指令周期后,自定时程序执行指令将在 tpp 的持续时间内开始(参见 AC 特性)。 当程序执行周期正在进行时,读取状态寄存器指令仍可用于检查忙位的状态。
在程序执行周期中,忙位为 1,当周期结束且设备准备再次接受其他指令时,忙位变为 0。 程序执行周期结束后,状态寄存器中的写入启用闩锁(WEL)位被清除为 0。 如果寻址页受块保护(TB、BP2、BP1 和 BP0)位保护,则不会执行程序执行指令。 每一页只允许 4 个部分页面程序时间。
块内的页必须按顺序从低阶页地址编程到块内的高阶页地址。 禁止无序编程页面。
在/CS 被驱动到高电平以完成指令周期后,自定时读页数据指令将在 tRD 的持续时间内开始(见交流特性)。 当读取页数据循环正在进行时,读取状态寄存器指令仍可用于检查忙位的状态。 在读页数据循环期间,忙位为 1,当周期结束且设备准备再次接受其他指令时,忙位变为 0。
在 2112 字节的页数据加载到数据缓冲区后,可以发出多个读取指令来访问数据缓冲区并读出数据。 根据状态寄存器中的 BUF 位设置,可以使用“缓冲区读取模式”或“连续读取模式”来完成读取操作。
读取数据指令通过驱动/CS 引脚低,然后将指令代码“03h”,随后是 16 位列地址和 8 位假时钟或 24 位假时钟移入 DI pin 来启动。 在接收到地址后,地址数据缓冲区位置的数据字节将在 CLK 下降沿的 DO 引脚上移出,最有效位(MSB)优先。 在数据的每个字节被移出后,地址会自动递增到下一个更高的地址,以允许连续的数据流。
读取数据指令序列如图 19a 和 19b 所示。当 BUF=1 时,设备处于缓冲区读取模式。 数据输出序列将从 16 位列地址指定的数据缓冲区位置开始,一直到数据缓冲区的末尾。 一旦数据的最后一个字节被输出,输出引脚将变成 Hi-Z 状态。
当 BUF=0 时,设备处于连续读取模式,数据输出序列将从数据缓冲区的第一个字节开始,并递增到下一个更高的地址。 当到达数据缓冲区的末尾时,下一个内存页的第一个字节的数据将跟随并继续贯穿整个内存数组。 这允许使用单个读取指令读取整个内存阵列,并且还兼容 Winbond 的 SpiFlash NOR flash memory 命令序列。
快速读取指令通过驱动/CS 引脚低,然后将指令代码“0Bh”以及 16 位列地址和 8 位假时钟或 32 位假时钟转移到 DI 引脚来启动。 在接收到地址后,地址数据缓冲区位置的数据字节将在 CLK 下降沿的 DO 引脚上移出,最有效位(MSB)优先。 在数据的每个字节被移出后,地址会自动递增到下一个更高的地址,以允许连续的数据流。
快速读取指令序列如图 20a 和 20b 所示。 当 BUF=1 时,设备处于缓冲区读取模式。
数据输出序列将从 16 位列地址指定的数据缓冲区位置开始,一直到数据缓冲区的末尾。 一旦数据的最后一个字节被输出,输出引脚将变成 Hi-Z 状态。
当 BUF=0 时,设备处于连续读取模式,数据输出序列将从数据缓冲区的第一个字节开始,并递增到下一个更高的地址。 当到达数据缓冲区的末尾时,下一个内存页的第一个字节的数据将跟随并继续贯穿整个内存数组。 这允许使用单个读取指令读取整个内存阵列,并且还兼容 Winbond 的 SpiFlash NOR flash memory 命令序列。
在接收到地址后,地址数据缓冲区位置的数据字节将在 CLK 下降沿的 DO 引脚上移出,最有效位(MSB)优先。 在数据的每个字节被移出后,地址会自动递增到下一个更高的地址,以允许连续的数据流。
快速读取指令序列如图 21a 和 21b 所示。当 BUF=1 时,设备处于缓冲区读取模式。 数据输出序列将从 16 位列地址指定的数据缓冲区位置开始,一直到数据缓冲区的末尾。 一旦数据的最后一个字节被输出,输出引脚将变成 Hi-Z 状态。
当 BUF=0 时,设备处于连续读取模式,数据输出序列将从数据缓冲区的第一个字节开始,并递增到下一个更高的地址。 当到达数据缓冲区的末尾时,下一个内存页的第一个字节的数据将跟随并继续贯穿整个内存数组。 这允许使用单个读取指令读取整个内存阵列,并且还兼容 Winbond 的 SpiFlash NOR flash memory 命令序列。
然后,可以在唯一 ID 和参数页上执行读取操作,如果 OTP 页尚未锁定,则可以在 OTP 页上执行读取和程序操作。 要返回到主存储器阵列操作,OTP-E 位需要设置为 0。
读取操作必须发出“页面数据读取”命令,后跟上表中所示的特定页面地址,才能将页面数据加载到主数据缓冲区中。 在设备完成数据加载(BUSY=0)之后,所有的 Read 命令都可以用来从任何指定的列地址开始读取数据缓冲区。 请注意,无论之前的 BUF 位设置如何,所有读命令现在都必须遵循“缓冲区读取模式”命令结构(CA[15:0],虚拟时钟的数量)。 还可以为 OTP 页读取操作启用 ECC,以确保数据的完整性。
OTP 页提供额外的空间(2K 字节 x10)来存储重要的数据或安全信息, 这些数据或安全信息可以被锁定以防止在字段中进行进一步修改。
这些 OTP 页面处于出厂设置的擦除状态,并且只能编程(将数据从“1”更改为“0”),直到被配置/状态寄存器 2 中的 OTP-L 位锁定。 必须首先将 OTP-E 设置为“1”以允许访问这些OTP 页,然后必须使用任何“程序数据加载”命令将程序数据加载到主数据缓冲区。 “程序执行”命令后跟特定的 OTP 页地址,用于启动从数据缓冲区到 OTP 页的数据传输。
当仍处于“OTP 访问模式”(OTP-E=1)时,用户需要将配置/状态寄存器 2 中的 OTP-L 位设置为“1”,并发出“程序执行”命令(页 面地址为“无所谓”)。
保护/状态寄存器-1 包含保护位,可设置为保护部分或整个内存阵列不被编程/擦除,或将设备设置为软件写入保护(WP-E=0)或硬 件写入保护(WP-E=1)。
参数页包含 3 个 256 字节参数数据的相同副本。 下表列出了所有关键数据字节的位置。 所有其他未指定的字节位置都默认有 00h 数据。