Flash 框图
如下图所示,对于一整块Flash存储空间,首先划分为若干的 块(Block),其中每一块再划分为若干的 扇区 (Sector)。对于每个扇区,内部又可以分成很多 页 (Page),每一页的大小为256个字节。左下角的SPI逻辑单元通过一个页缓存区再与Flash存储器相连,页缓存区是一个RAM存储器,它可以通过连接状态寄存器来反映Flash芯片是否处于忙状态、是否写使能、是否写保护。
Flash是一个非易失性存储器,它在断电情况下仍能存储数据。其掉电不丢失的特性是通过擦除一整个扇区,再进行拓印数据,因此写入Flash需要一定的时间。
SPI的写入频率是非常高的,而Flash的写入速度比较慢,所以需要使用一个RAM页缓存区来存储写入的数据,从而可以跟得上SPI总线的速度。需要注意的是,这个页缓存区只有256个字节,所以在写入的一个时序中,连续写入的数据不能超过256字节。在SPI将数据写入到页缓存区后,再由页缓存区慢慢地将数据写入Flash。由于Flash擦除和拓印数据需要时间,这段时间,芯片会进入一段比较忙的状态,此时页缓存区会将状态寄存器的BUSY位 置1。在BUSY置1期间,SPI不会响应新的读写时序。
由于Flash要保持掉电不丢失的特性,同时还要保证存储容量大,成本低。因此Flash需要在一些其他地方,比如操作方式上,做出一些妥协和让步。
写入操作注意事项
(1)写入操作前,必须先进行写使能。
注:这是一种保护措施,先解锁再操作,防止误操作。
(2)每个数据位只能由1改写为0,不能由0改写为1。
注:Flash没有像RAM那样的直接完全覆盖能力。在写入时序结束后,Flash中保存的数据可能不是要写入的数据,如 Flash 中之前数据为 1010 1010,你写入一个 0101 0101,由于Flash中只有 1 可以被改写,于是得到 0000 0000。
(3)写入数据前必须先擦除,擦除后,所有数据位变为1。
注:由于(2)的特性,所以在写入数据前必须先擦除。在进行擦除后,Flash将所有数据位变为1,此时就可以写入要保存的数据了。
(4)擦除必须按最小擦除单元进行。
注:由于写入数据前需要先进行擦除,但是Flash存储空间比较大不好弄。于是可以通过限制最小擦除单位来方便操作。在进行擦除时,可以选择整片擦除、按块擦除、按扇区擦除,最小的擦除单位就是一个扇区。
(5)连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入。
注:SPI在写入时,先将数据送到页缓存区。等时序结束后,页缓存区再将数据慢慢写入Flash。但这个页缓存区只有256个字节,所以在一个时序内最多写入一页的数据。而且必须从页起始位置开始写,才能最大写256个字节。如果从页中间位置开始写,写到页尾时,地址就会跳回页首。
(6)写入操作结束后,芯片进入忙状态,不响应新的读写操作。
注:页缓冲区将数据写入到Flash中需要慢慢搬砖,这段时间为忙状态,此时页缓冲区会将状态寄存器BUSY置1,整个SPI芯片也不响应任何读写操作。
读取操作注意事项
(1)直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取。