BPI FLASH 读写时序分析(三)——FLASH擦除、编程、读取

目录

一、验证方法

1.1擦除操作验证

1.2编程操作验证

二、flash擦除、读取、编程时序介绍

2.1读取时序

2.2擦除时序

2.3编程时序


前面说了bpi flash 读ID的时序以及代码编写,如果已经成功读出ID了,那后面这些操作(擦除、编程、读取)也就很简单了,废话不多说直接上正文。

本来今天只想讲擦除的,但是感觉这三(擦除、读取、写入)不能分开,分开就不能验证了,还是一起来吧。

(注:以下为个人见解,不一定是正确的,欢迎大家指正,一起学习,共同进步)

一、验证方法

我们按照命令码步骤进行执行后,怎么验证我们是否成功呢(个人理解:写程序就是这样,不怕程序出错,就怕写出来后自己也不知道自己写的程序是对是错,我们首先应该知道程序正确错误的判断依据)。读ID那里相对容易,看一下读出来的数据就知道了,其他三个(擦除、读取、写入)的验证方法如下,其实也很简单,提供一下个人思路。

读取操作最简单,这个不用验证,得用读取去验证擦除和编程,只要时序是对的,那读取的数据就不会有错。等会也简单说一下怎么搞吧。

1.1擦除操作验证

最简单的方法是在擦除完成后进行读取,查看数据是否为0xFFFF。这里也存在一个问题,那就是如果你那个地址的数据本来就是0xFFFF,这样也无法验证是否擦除成功,最好的步骤还是先进行读取查看该扇区数据是否全为0xFFFF,如果是0xFFFF,那就需要进行编程操作,把数据编程为其他数据(如0x0000),再进行擦除,擦除后读取判断是否为0xFFFF,这样就能判断是否擦除成功了。

具体验证擦除是否成功流程如下:(随便画的一个)

1.2编程操作验证

编程之前需要先进行擦除,或者直接读取判断内存中数据是否为0xFFFF,这一步是必须的,编程之前必须保证所编程地址中数据为0xFFFF,原因在数据手册中也有:

 无法将“0”编程回“1”。后续读取显示数据仍为“0”
只有擦除操作才能将“0”转换为“1”

简单举例:如果那个地址中数据为0X0000,不擦除直接编程为0x5555,再使用读取操作去读取,数据还依然是0X0000,因为只有擦除操作才能将“0”转换为“1”

所以在编程之前需要先判断内存中数据是否为0xFFFF(已擦除状态)。

继续说怎么判断是否编程成功,这个也很简单,编程后进行读取,查看读取出的数据是否为写入的数据(前提是:必须保证读取操作是正确的,不然这个方法就没有意义了)。

二、flash擦除、读取、编程时序介绍

2.1读取时序

读取相对简单,命令码就发一次,单个进行读取。

步骤为:①从地址RA(需要读取输的的地址)中直接读数据就好了,读数据时序在读ID那里也讲过。

刚开始写程序可以一个一个数据的读取,时序图和前面读ID那里一样,就参考一下那部分的把。

BPI FLASH 读写时序分析(二)——读ID_千寻xun的博客-CSDN博客

放个之前的时序图:

2.2擦除时序

还是根据数据手册来:

百度翻译:

这些设备能够进行多种编程和/或擦除操作模式,这些模式将在以下部分中详细描述。
在写入操作期间,当提供地址、命令和数据时,系统必须将CE#和WE#驱动到V IL,将OE#驱动到VIH。
地址被锁存在WE#或CE#的最后一个下降沿,而数据被锁存到WE#或CE的第一个上升沿。
解锁旁路功能允许主机系统向闪存设备发送程序命令,而无需在命令序列中首次写入解锁周期。有关解锁旁路功能的详细信息,请参见第7.7.8节。
请注意以下内容:
 嵌入式程序算法完成后,设备返回读取模式。
 系统可以通过读取DQ状态位来确定编程操作的状态。请参阅写入操作状态
有关这些状态位的信息,请参见第32页。
 无法将“0”编程回“1”。后续读取显示数据仍为“0”
 只有擦除操作才能将“0”转换为“1”
 在嵌入式程序/擦除期间写入设备的任何命令都将被忽略,挂起命令除外。
 当程序操作正在进行时,安全硅扇区、自动选择和CFI功能不可用。
 硬件重置和/或断电会立即终止编程/擦除操作和编程/擦除命令
一旦设备返回到读取模式,就应该重新启动序列以确保数据完整性。
 对于单个字编程操作,允许以任何顺序和跨扇区边界进行编程。请参阅写入缓冲区
使用写入缓冲区时在第23页编程。
 允许多次编程到同一个字地址,而不需要进行干预擦除。

重要部分:

 无法将“0”编程回“1”。后续读取显示数据仍为“0”
只有擦除操作才能将“0”转换为“1”

先还是看一下命令码部分,需要进行那些操作,然后用状态机一步一步进行就可以了

bpi flash擦除分为两种,一个是芯片擦除(整片擦除,全片数据清除),二是扇区擦除(单个扇区擦除),关于扇区介绍在之前说过BPI FLASH S29GL01GP、 S29GL512P、 S29GL256P、 S29GL128P NOR flash介绍,与FPGA代码编写(一)_千寻xun的博客-CSDN博客

芯片擦除花费时间较长,而且flash擦除次数也是有寿命的,擦除次数越多,每次擦除所需时间越长。手册中对于擦除时间也有说明。

整片擦除相对耗时长,调试等待时间久,我们先编写扇区擦除的代码,扇区擦除和整片擦除大同小异。

还是按照读ID一样,先把这个命令码拆开,一步一步进行。

步骤为:①往地址0x555中,写入数据0xAA;

                ②往地址0x2AA中,写入数据0x55;

                ③往地址0x555中,写入数据0x80;

                ④往地址0x555中,写入数据0xAA;

                ⑤往地址0x555中,写入数据0x55;

                ⑥往扇区地址SA中(这里以第一个扇区举例,写入地址为0x000),写入数据0x30;

                ⑦等待擦除完成。 

前面几步写数据还是和读ID那里的写时序一样,

BPI FLASH 读写时序分析(二)——读ID_千寻xun的博客-CSDN博客

这里需要注意的是怎么去正确的判断擦除完成,只有等待擦除完成后才能去操作。

擦除是否完成和编程是否完成的判断是一样的。

这个判断方法还是得从数据手册中去找。具体判断方法有几种

一、RY/BY#引脚判断

RY/BY#是一个专用的开漏输出引脚,用于指示嵌入式算法是否正在进行或已完成。这个
RY/BY#状态在命令序列中的最后一个WE#脉冲的上升沿之后有效。由于RY/BY#是开漏输出,
RY/BY#引脚可以与上拉电阻器并联在一起以连接到V CC
。此功能允许主机系统检测
当数据准备好读取时,只需监控RY/by#引脚(这是一个专用输出)。

时序图中也有体现:

总结一下:就是正在进行编程/擦除时 RY/BY#引脚是低电平(0),编程/擦除完成后变为高电平(1),但是需要注意RY/BY#引脚需要接上拉电阻。

二、根据数据轮训状态判断

这部分数据手册的内容比较多,直接上中文数据手册(英语不太好的可以下载一个)

S29GL01GT11DHAV20_PDF_数据手册_Datasheet_规格书 - 半导小芯 (semiee.com)

这部分相对要难一点,建议新手都室友第一种判断方法RY/BY#引脚判断。(有人感兴趣的话下次可以讲一下,今天先讲基础简单点的

2.3编程时序

编程就是写入数据,数据手册中关于编程的介绍这里就不说了,可以自己去看数据手册,直接看一下命令码部分:

编程和擦除一样,发完命令后需要去判断芯片是否执行完成(可以通过BUSY引脚),完成后才能进行下一步操作。

编程主要用到这三个命令,字编程:就是单个地址单个地址的进行写,刚开始可以使用这个命令去写,写完后(芯片执行完成,而不是发送完命令码)进行读取操作就可以判断是否编程成功;

“写入到缓冲区”和“编程缓冲区到闪存 (确认)”是一起使用的,相当于先把数据写入缓存区,然后再发出确认写入命令,把缓冲区的数据写入到芯片内存,这样才完成一次写入。

缓冲区大小见芯片数据手册,以自己芯片的数据手册为准,我参考这一款芯片的缓冲区大小如下:

最多一次写入512字节(256字)。

后面就是写代码部分了,可以参考之前的分步写。

字编程相对简单:

步骤为:①往地址0x555中,写入数据0xAA;

                ②往地址0x2AA中,写入数据0x55;

                ③往地址0x555中,写入数据0xA0;

                ④往地址PA(PA就是需要写入的地址,如0x0000)中,写入数据PD(PD就是需要写入的数据,如0x5555);

                ⑤读取busy引脚状态,判断芯片是否执行完成。

缓存器编程:

步骤为:①往地址0x555中,写入数据0xAA;

                ②往地址0x2AA中,写入数据0x55;

                ③往地址SA(扇区地址)中,写入数据0x25;

                ④往地址SA(扇区地址)中,写入数据WC(需要写入的字计数-1,例:写入10个字,wc=10-1=9);

                ⑤往地址WBL(写入缓冲区位置)中,写入数据PD(PD就是需要写入的数据,如0x5555);

                  。。。 。。。。。。

                N-1:往地址SA(扇区地址)中,写入数据0x29;

                N:读取busy引脚状态,判断芯片是否执行完成。

总结:bpi flash的命令码都可以拆分为 写和读,按照命令码一步一步进行即可,读取时需要释放总线。擦除和编程操作需要等待芯片执行完成才能进行下一步。

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值