nor flash、nand flash、eeprom、fram的读写特性

1、EEPROM

eeprom容量一般为1k~2M比特,根据容量和品牌不同,价格为几毛~几十,擦写寿命一百万次左右,写入前芯片会自动执行擦除。SPI速度一般为1~20M。

读操作:指定起始地址、字节数,就可以连续读出。起始地址任意,不要求必须从页首开始, 字节数也任意,芯片会自动跨页(page)。读操作的驱动程序是很简单的。

写操作:指定起始地址、字节数,就可以连续写入。起始地址任意(页内的任意地址都可以,不要求必须从页首开始),但是,字节数受限。只能在页内写入。一般一页为256字节,例如0~255字节为第0页,256~511为第1页。如果你指定起始地址为0,要写入257字节,也即出现了跨页操作,那么EEPROM把第0页写满之后,写指针不会跳到第257字节处(也即不会跳到第1页的第0字节处),而是会发生回环,跳回本页的第0字节处,会导致之前写入的数据被覆盖。如果你指定起始地址为500,那么要想避免发生跨页回环,那么写入字节数必须<=11。

除了以上缺点以外,第2个缺点就是,每次写入数据后,都需要等几个毫秒(取决于具体型号,一般1~10ms之间),EEPROM才能把数据真正存储完成(这一过程被称为“烧写”或者“编程”)。

根据以上信息就可以知道,EEPROM的大批量写入的驱动程序,是比较麻烦的,必须要根据起始地址和字节数,来判定是否会发生跨页,以及会跨多少页。标准步骤为:
(1)根据起始地址和字节数来判定是否会跨页。
(2)如果不跨页,则直接写,流程结束。
(3)如果会跨页,则由页尾地址 - 起始地址,得到本批次要写入的字节数,把本页写满。
(4)起始地址更新为下一页的页首,重新计算剩余未写入的字节数,返回步骤(1)。

另外,每次写入前,要判定上次写入是否已完成,这一点可通过读状态寄存器的busy位来获得。

为什么EEPROM的写入操作这么复杂?因为EEPROM的写入速度很慢,所以他里面带有一个高速缓存RAM,这个缓存的大小就是page的大小(也即256字节),借助这个缓存,我们就可以通过20M的SPI把数据快速发给EEPROM,然后单片机就可以切换线程,或者切换状态机,让CPU去干别的事情,而不是把CPU都浪费在数据发送和等待上。这个缓存的存在,也就决定了EEPROM无法跨页写入,因为这个缓存全部被用在写当前PAGE上了。但是这个缓存是利大于弊的,如果没有这个缓存,那我们每发一个字节都要等待或切换线程或切换状态机,效率太低。为了解决EEPROM这个麻烦的写入问题,FRAM应运而生。

本文由【暴躁的野生猿】发表于CSDN,如有非法转载,请帮忙举报谢谢。百度搜索【CSDN暴躁的野生猿】可以找到原文。

2、FRAM

FRAM的容量和EEPROM差不多,价格比EEPROM稍贵一点点。但是写入寿命为10~100亿次以上,约等于无限寿命,且写入操作无延迟,不需要等芯片内部烧写。换句话说,它的存储速度>=SPI的速度,SPI把数据发完,他就存好了,这一特性就决定了,芯片内部不需要缓存,也就不存在跨页写入障碍了。SPI读写速度一般可达20M~40M,比EEPROM快。

有趣的是,FRAM的功能可以完全向下兼容EEPROM,所以FRAM可以直接使用eeprom的驱动程序,而不用做任何改动。但是这么做的话,相当于浪费了FRAM的性能,因为FRAM的写入无需等待。因此,FRAM的驱动会变得非常简单。新手就可以轻松搞定。

读写操作都可直接指定字节起始地址+字节数。起始地址和字节数,都没有限制,只要不超过芯片的容量即可。

3、nor flash

容量一般为几百k~几百Mbit,128M bit(16M Byte)价格才几块,很便宜。他的SPI读写速度比FRAM还要快,可达133M以上,而且不仅支持标准SPI,还支持双、四线的SPI,相当于又变相提高了SPI的数据吞吐速度。

读操作:和EEPROM、FRAM一样,所以驱动程序很简单。这也就表明了,nor flash每一个字节都有唯一的地址,这一特性使得他支持XIP功能(eXecute In Place,程序就地执行),STM32的flash单片机就是这种。显然EEPROM和FRAM也具备XIP功能,只是同等容量下,nor价格更低,所以现在的单片机基本都选了nor flash来做存储。

写操作:有一个缺点和EEPROM一样,SPI的读写速度>存储烧写速度,所以,他里面也有一个高速RAM缓冲区,容量一般也是256字节。数据从256字节缓存烧写进flash,耗时约为0.7~5ms之间。SPI发送完数据以后,必须切换任务、或线程、或状态机,来等待数据真正烧写完成,最终要通过查询状态寄存器的busy标志位来验证。

除了以上烧写延迟之外,他比eeprom还多了一个缺点:就是写入前,必须要通过SPI给芯片发命令,先擦除,擦完以后才能写入。这个缺点是由FLASH的特性决定得,flash在烧写时,二进制位只能由1变0,而不能由0变1,所以由0变1的过程,只能由擦除命令来做。

擦除方式有3种:按扇区擦sector、按块擦block、芯片全擦chip。

 扇区大小一般为4KB,块一般为32K/64K,下图是经典型号W25Q的烧写时间和擦除时间表:

nor flash、nand flash、eeprom、fram的读写特性_第1张图片

上表中的4种擦除方式,分别对应一个不同的SPI擦除命令。

4、nand flash

不支持就地执行,因为nand里面,没有字节地址,要想执行nand里存储的程序,必须把程序复制到RAM,RAM的每一个字节都有地址,然后CPU就可以从RAM中取指,执行代码了。

nand flash容量都很大,一般为128M~4G,它只有块地址,读写都必须按块进行。所以它适用于大容量存储。

你可能感兴趣的:(stm32/单片机,存储,nor,flash,eeprom,nand,flash,fram)