FLASH--M25P40/M25P10

芯片手册下载地址:
链接:https://pan.baidu.com/s/1vNk2oFDykI6fPTVlWuWIDA 提取码:wjef

M25P40芯片介绍
SPI总线兼容串行接口;
容量4MB闪存,8个扇区,每个扇区256页,每页256字节;整个芯片有2048页或者524288字节。
最大40MHz时钟频率;
2.7V至3.6V单电源电压;
页写256bytes为 1.5ms(典型);
扇区擦除(512Kbit)只需1s;
在这里插入图片描述
如下图写使能(WREN)指令设置写使能标志(WEL)位,写使能标志 (WEL)位在每一个页编辑(PP)、扇区擦除(SE)、完全擦除(BE)和写状态寄存器(WRSR)指令前必须设置。写使能(WREN) 指令在器件选择(S)置低后,发送指令代码,然后将器件选择(S)置高
在这里插入图片描述
读状态寄存器(RDSR)指令允许状态寄存器被读,状态寄存器可以在任何时间被读,甚至在编辑、擦除、写状态寄存器周期执行时,当这些周期运行时,发送新的指令接收前它一直检查读运行(WIP)位,它同样可以不间断的读状态寄存器。
在这里插入图片描述
如下图写状态寄存器(WRSR)指令允许写入状态寄存器新值,在它能被接收前,必须先发送写使能(WREN) 指令. 写使能(WREN) 指令解码执行,器件设置写使能位 (WEL). 写状态寄存器(WRSR)指令只能改变状态寄存器bit7、bit4(m25p40)、bit3、bit2,其中bit6和bit5和bit4(m25p10)读一直为0
在这里插入图片描述
页读数据
如下图所示器件选择(S)为低,器件先被选择,高速读数据(FAST_READ)指令代码和3字节地址(A23~A0)和一个虚假字节每一位在时钟(C)的上升沿被读取,所在地址的内容通过数据输出(Q)在最大频率下f ,每一位在时钟(C)的下降沿移出。第一个地址字节可能是任意位置,每一个数据输出后,地址自动向高地址增加将数据移出,因此,通过单一的高速数据读(FAST_READ)指令可以读整个存储器,当达到最高地址,地址计数器循环到000000H,允许读的次序“不确定地” 继续 读数据(FAST_READ)指令,在器件选择(S)为高时停止,数据输出的任何时间,器件选择(S)能够变高,当擦出、编辑、写周期运行时,任何读数据(FAST_READ)指令被拒绝,对正在进行的周期没有影响。
在这里插入图片描述

页写数据
如下图所示页编辑(PP)指令允许编辑存储器字节(改变位1到0),接收次指令前,写使能(WREN)指令必须执行,写使能(WREN)指令解码后,芯片的写使能(WEL)被设置。页编辑(PP)指令,在器件选择(S)为低后进入,指令代码后3个地址字节和至少一个需要存储的数据,如果低8位地址(A7A0)不全为0,所有超过当前页页末的传输数据从相同页的开始进行编辑(从地址低8位(A7A0)全为0),整个序列时间,器件选择(S)必须为低。
如果发送到芯片超过256字节,先前写入的数据将丢弃,在同一页只保存后256数据字节,如果低于256字节发送到芯片,相应地址将被正确的存储,同一页的其他字节不受影响。最后一个字节的第八位被输入后,器件选择(S)必须置高,否则页编辑(PP)指令不运行,器件选择(S)一旦置高,同一时间,从页编辑周期(t )开始,当页编辑周期运行时,状态寄存器可以读检查写进度(WIP)位,写进度(WIP)位是1,表示当前页编辑周期正在进行,如果为0,表示已经完成。

在这里插入图片描述
扇区擦除
如下图扇区擦除(SE)指令设所有被选择扇区的位为1(FFH),在接收前,写使能(WREN)指令必须执行,写使能(WREN)指令执行后,芯片的写使能(WEL)被置1。扇区擦除(SE)指令在器件选择(S)为低后进入,输入扇区擦除(SE)指令代码和三个字节地址,整个序列时间,器件选择(S)必须为低。扇区擦除(SE)指令不能擦除BP2(m25p40)、BP1、 BP0保护位保护的区域。
在这里插入图片描述

块擦除
完全擦除(BE)指令设所有被选择扇区的位为1(FFH),在接收前,写使能(WREN)指令必须执行,写使能(WREN)指令执行后,芯片的写使能(WEL)被设置。 完全擦除(BE)指令在器件选择(S)为低后进入,输入数据输入(D)指令代码,整个序列时间,器件选择(S)必须为低。当完全擦除周期运行时,状态寄存器可以读检查写进度(WIP)位,写进度(WIP)位表示当前完全擦除周期正在进行,如果为0,表示已经完成。完全擦除(BE)指令只能在BP2(m25p40)、 BP1、 BP0保护位没有执行保护区域时才能工作,如果有一个或多个扇区被保护,完全擦除(BE)指令将被忽略

在这里插入图片描述
芯片内存映射
在这里插入图片描述
芯片命令编码
在这里插入图片描述
芯片状态寄存器
1.WIP(正在写)位表示存储器是否处正忙于写状态寄存器周期、读写数据或者擦除中,当它为1时,表示一个周期正在进行中。也可以说当WIP位为1时,芯片此时正处于忙碌状态。
2.WEL(写使能锁存)位表示内部写状态使能锁存器。当WEL位被置为1时内部写允许使能寄存器被置位,表示接下来可以进行写状态寄存器、写数据、以及擦除操作。当WEL位被置为0时内部写允许使能寄存器被复位,接下来只能执行读操作。
3. 数据块保护位是非易失性,它们定义的扇区不可以进行数据写入和擦除操作,只能进行只读操作。
4. SRWD(状态寄存器)位写入禁止,需要配合(W#)管脚使用。当SRWD置1且w#置低电平,此时芯片处于硬件保护模式,数据块保护位变成只读模式,写状态寄存器位不能被改变。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在实际应用中M25P40驱动在执行每一次的读、写或者擦除操作时,都要先读取当前芯片的工作状态,判断芯片当前是否处于空闲状态,只有在空闲状态才行执行用户的操作。
在执行批量擦除操作时,先发送写使能操作,再发送批量擦除指令,包括三个空字节,紧接着返回擦除完成指令给用户(注意此时芯片本身的擦除操作刚开始进行中,并没有执行完成,芯片处于忙碌状态)。在执行页读操作时和页写操作一样都要发送3字节地址,即扇区地址、页地址以及操作的页中的起始地址。区别在于在执行读操作时,发送完3字节地址后,需要发送一个空字节,然后才执行读取数据操作。驱动的设计最好使用状态机编写。

FLASH读写速度比eeprom快很多倍,但是flash的擦出是扇区擦除,在设计的时候必须考虑一个问题那就是假如擦出完数据后正在写的过程中出现了断电或者系统重启,那么会出现flash中数据丢失或者错误,如果flash存储的是系统上电要读取的关键参数,那就有可能会导致致命性的问题。我在项目中调试的时候就有出现过问题,对于我们研发来说在操作的时候,大部分都是会按照正常的流程操作,比如说在保存参数的时候,肯定会保证系统不会出现出现重新上电或者复位,但是当把项目交给测试、生产的时候,也许他们并不知道,就会导致一些不按流程操作的过程。对于这种异常情况,我们一般建议对存储的数据校验,把校验值存入flash,判断检验值正确后再下发给系统的各个模块,为了保证存储在flash中的参数不会因为flash的擦除后没有及时写入而造成丢失,我们建议对参数做多个扇区的备份管理,这样即使在第一个扇区的参数被擦除,也还有第二个扇区的数据可以读出来供系统使用,当然这个模块应该算是属于参数存储管理模块了。如果要想充分用好flash,在系统中不会出现异常问题,我觉得这个存储管理模块非常有必要,当然,自从我在调试项目的时候出现了参数丢失的问题后,后来在我的项目中全部加上了存储管理模块,有效的减少了参数丢失的现象出现。

声明:所有文章属于个人在工作中所记下和搜集的笔记,不得转载

猜你喜欢

转载自blog.csdn.net/Real003/article/details/88921366