5 写与擦除命令
5.1 字节 / 页写
字节 / 页写命令允许在当前擦除过的存储空间内,从任意地址开始写 1 到 256 字节数据。一个擦除过的存储空间内,所有的数据位均为“ 1 ”,所有字节均为“ FF ”。
在开始进行“字节 / 页”写之前,要先发写能命令允许写操作。具体的做法是,设置状态寄存器中的写使能锁( WEL )位为“ 1 ”。
02 命令 +3 地址字节 + 数据字节。在命令和地址字节时钟传入完成后,数据可以写入并且存到内部缓存中去。
如果起始地址不落在偶的 256 字节页的边界, ( 即 A7 ~ A0 非全 0) ,这种特殊情况下的存储定位也将被 AT26DF081A 接受。在这种情形下,任何即将超越而边界的数据会绕回来写在该页的开始处。如:从地址 (A23~A0)0x0000FE 处写三个字节,发往 AT26DF081A 的最初两个字节分别写入 0x0000FE 和 0x0000FF 处,而最后一个字节却被写在 0x000000 处。 0x000001 和 0x0000FD 处均不受影响。另外,要说明的是,如果写入多于 256 字节的数据,只有最后的 256 字节被锁入内部缓存。
当 CS 引脚被拉高后, AT26DF081A 把数据保留在内存缓冲中去,并且依据起始地址( A23 ~ A0 ),把内部缓冲的数据写入相应的物理存储阵列中去。如果写入的数据少于 256 字节,该页内剩余的空间将保持不变。
在 CS 置高之前,三个地址字节和至少一个数据字节必须发送完成。 CS 引脚必须置高于偶字节边界( 8 位的整数倍)。否则的话, AT26DF081A 会中止操作,不会有数据写入到存储阵列中去。此外,如果地址指向一个受保护的扇区,“字节 / 页”写指令就不会被执行。一旦 CS 拉高, AT26DF081A 就会进入 IDLE 状态。一个不完整的地址、一个不完全的数据字节或者写入区正被保护,在这几种状态下, WEL 位会重新复位为“ 0 ”(保护状态)。
在写入操作时,需要读状态寄存器以判断 AT26DF081A 是否忙。为了更快的数据吞吐,强列建议采用查询状态寄存器方判断写入是否完成,取代等待 t(pp) 时间判断方法。在某些情况下,写操作周期完成后, WEL 位应重设为逻辑 0 状态。
当一个字节处写失败时, AT26DF081A 内置一个智能算法可以检测到。如果这种错误出现,立即由状态寄存器的 EPE 位来指明。
“字节 / 页”写模式是设备上电后或设备复位后默认的状态。
5.2 连续写入模式
在写入到连续存储区域时,连续写入模式可以提供比“字节 / 页”写更高的吞吐量。例如,一些系统由于设计的限制,每次仅写一个字节的信息,不能提供一个页写的缓冲操作。在这种情况下,系统不能正常的对连续的 FLASH 区域进行多字节写入操作。这种日常开销可用 SPI 总线。
连续写模式可以帮助系统减少日常开销和总线通信。它提供一个内部的地址计数器来跟综写入的字节地址,而不需要再提供每个写入 BYTE 的地址。在进入连续写入模式之前,要打开写使能位(置状态寄存器中的 WEL 位为逻辑“ 1 ”状态)。当使用连续写入模式时,所有要被写入的地址空间一定要处于擦除状态。(先被擦除)
连续写入过程:首次进入连续写入模式
( 1 )打开写使能位 WEL = 1
( 2 ) CS 拉低
( 3 )发连续写命令“ AD ”或“ AF ” + 三个地址字节
( 4 )写入一个 BYTE 数据
( 5 )拉高 CS , FLASH 会进行内部的写物理操作(写到 A23 ~ A0 指定的地址)
在第一个字节成功的写入之后,再次写入
( 1 ) CS 拉低
( 2 )发连续写命令“ AD ”或“ AF ”
( 3 )写入一个 BYTE 数据
( 4 )拉高 CS , FLASH 会进行内部的写物理操作(写到前述 A23 ~ A0 指定的地址下一个地址)
( 5 )判忙和失败( EPE )
当最后一个字节写入到 FLASH 阵列后,可按以下步骤取消连续写入模式
( 1 ) CS 拉低
( 2 )发 Write Disable 命令(置状态寄存器 WEL 位为逻辑 0 )
( 3 ) CS 拉高 ?
( 4 )判忙和失败( EPE )
在连续写入时,如果每次写入多个数据,只有发送到 SPI 的最后一个 BYTE 保存在 FLASH 的内部锁存器中。每个字节的实际写入时限是由 FLASH 内部定义的,必在 t(BP.) 之内。在每次写周期内,一个完整的 BYTE 必须在 CS 拉高之前发送过来,且 CS 必须在字节的边界( 8bits 的整数倍)处。否则的话, FLASH 将放弃当前的操作,数据无法写入到 FLASH 阵列, WEL 位会被重置为逻辑“ 0 ”状态。
如果连续写入的地址指向的 sector 处于保护状态,该连续写入指令也不会被执行,一旦 CS 拉高, FLASH 立即进入 IDLE 状态, WEL 位重回为“ 0 ”。
连续写入模式没有地址绕回机制,所以,当最后一个地址( 0x0FFFFF )被写入数据后, FLASH 自动退出连续写入模式, WEL 位重回为“ 0 ”。除此之外,连续写入模式不能自动跳过受保护的 sector ,所以,一旦高的未保护的地址写入完成后,当触入到较低的 sector , FLASH 将自动退出连续写入模式和复位 WEL 。例如, sector1 是保护 sector , sector 0 的最后一个 BYTE 写入完毕后,连续写入模式就会自动停止。为了继续写入 sector2 ,需要重新进入连续写入模式。
当 FLASH 正在写入字节时,可以读取状态寄存器的判忙位来判断写入动作是否完成。为了提高数据吞吐能力,可在每次写操作后,强烈建议用读状态寄存器的方式取代等待 t(BP) 时间。这样,一旦写入成功后,不用等待就可以开始下一次写入操作。
当一个字节处写失败时, AT26DF081A 内置一个智能算法可以检测到。如果这种错误出现,立即由状态寄存器的 EPE 位来指明。
5.3 块擦除
擦除后的 FLASH sector ,所有的位均为“ 1 ”状态。三种不同的块擦除指令分别用于擦除三种不同大小的块单元。
( 1 )命令: 20h 4K 字节 块擦除指令
( 2 )命令: 52h 32K 字节 块擦除指令
( 3 )命令: D8h 64K 字节 块擦除指令
擦除之前,要置 WEL 位为“ 1 ”。
块擦除步骤
(1) CS 拉低
(2) 发块擦除命令字节
(3) 三个地址字节。 如果再发数据的话,将被忽略
(4) CS 拉高。 FLASH 开始内部真正执行。 FLASH 内部擦除的时间在 t(BLKE) 内执行完毕。
既然块擦除指令可以擦除一片区域, FLASH 不需要对低位地址进行解码。
( 1 )对于 4K 擦除指令,有 12 位地址信息是无关紧要的, A11 ~ A0 无论是 0 或 1 都会被忽略;
( 1 )对于 32K 擦除指令,有 15 位地址信息是无关紧要的, A14 ~ A0 无论是 0 或 1 都会被忽略;
( 1 )对于 64K 擦除指令,有 16 位地址信息是无关紧要的, A15 ~ A0 无论是 0 或 1 都会被忽略;
在块擦除时,不论设备是否对这三个地址字节中的低位进行解码,这三个字节一定要被完整的 clocked into 到 FLASH ,并且在 CS 拉高之前,且 CS 必须在字节边界拉高。否则, FLASH 会放弃操作, WEL 被重置为“ 0 ”。如果对被保护的区域执行了擦除指令, WEL 也会被重置为“ 0 ”。
如果地址字节( A23 ~ A0 )指向的是一个受保护的 sector 。块擦除指令不会被执行,当 CS 拉高时 FLASH 返回 IDLE 状态。
另外,大块擦除时( 32K 或 64K ),多于一个的物理 sector 可以一次被擦除,这些物理 sector 中,不可以有 sector 处于保护状态。如果真的有处于保护状态的物理 sector ,则块擦除指令被忽略。
一个不完全的 sector 地址和保护的 sector ,均会在擦除时引起 WEL 重置为“ 0 ”。
当 FLASH 成功的执行一个 sector 擦除时,可读状态寄存器中的判忙位来判断是否完成。最好采用这种方式,而不是等待 t(BLKE) 时间。
在某些擦除周期结束前的时间点, WEL 位会被重置为“ 0 ”。
也要判断 EPE 位,该位说明了是否擦除错误。
5.4 片擦除
( 1 )打开写使能 WEL =1
( 2 )拉低 CS
( 3 ) 60h 或 C7h 指令。两个命令没有区别,可以互换。
( 4 )不需地址,发送的数据也会被忽略
( 5 )拉高 CS
全擦除时间为 t(CHPE) 。
在 CS 拉高前,命令字节要完整的传入 FLASH ,则 CS 必要在连界处拉高,否则,命令无效。
如果有受保护的区域,全擦命令将不能被执行, FLASH 设备会随 CS 拉高而进入 IDEL 状态,同时 WEL 也会被重置为“ 0 ”。
在某些擦除周期结束前的时间点, WEL 位会被重置为“ 0 ”。
也要判断 EPE 位,该位说明了是否擦除错误。