Tag Archives: flash

串行Flash芯片w25x16使用心得

这一段时间因项目需要使用了Winbond公司的w25x16/w25x32串行Flash存储芯片,对Flash芯片的使用方法略有心得,现整理成文。

在Flash中存储数据与在EEPROM中存储数据不同,不仅需要考虑数据的存储结构,还需要针对Flash独有的特性进行特殊处理。其中最显著的不同点在于Flash在编程前,必须保证待写入区域全部为空(0xFF),否则无法正常执行写入操作;并且Flash在操作时一般需要按数据区域(Section)进行操作,而并非字节。

串行Flash的主要特性有(以w25x16为例):
1、写入前必须保证待写区域为空(全部为0xFF);
2、一次批量编程最多只能写入Page(256B)的大小,如果中途发生换页,需要更改地址后重新发送写入命令;
3、一次擦除至少擦除一个Section(4KB);
4、16个页(Page)构成一个数据区域(Section),16个数据区域(Section)构成一个数据块(Block);
5、擦除时间较长,约为300ms/Sector;
6、编程时间为150+12*n us (折合3ms / page);
7、大容量Flash存在坏区的可能。

对以上问题进行分析,我们可以得到以下一些结论:
1、必须对当前可用的数据块进行检查与标记,从而在编程前保证数据区域的写有效性;
2、单次最多只能写入256字节,当写入的数据发生了换页,需要进行页面切换;如果写入的数据大于256字节,必须进行拆分;
3、若想修改单个数据,必须将整个数据进行读-修改-擦除-写入操作,必须保留与Section同样大小(4K)的临时存放空间。又因为擦除和编程都是比较费时的,可以看到,这个操作代价很高,所以应该尽量避免频繁的修改;
4、擦除时间长还会提高在擦除后、写入前发生断电导致数据全部丢失的风险,需要有一定的安全机制;
5、批量写入的效率更高,可以有一定的写缓冲机制以提高性能;
6、需要对Flash进行校验与坏块标记。

可以看到,Flash的这些特性很像硬盘。在操作系统下,可以使用近乎相同的驱动与文件系统,比如现在流行的SSD硬盘,正是发挥了Flash电原理而非机械原理的速度优势,并且很容易对现有硬盘系统进行直接替换。但换一个角度,在嵌入式应用中,这些特性确实大大增加了编程与设计的难度。