兆易创新GD5F2GQ5UExxG NAND FLASH存储芯片学习笔记
兆易创新GD5F2GQ5UExxG NAND FLASH存储芯片
一、前言
本文是笔者阅读芯片手册之后在代码上实操之后总结的经验,文章会包含芯片手册的部分截图(芯片手册上也有我的笔记)和我的一些注解。最后还有我写的代码,如您像要获取芯片手册的话,可以私信。
脑子里突然出现一句话,送给我自己,也送给大家:“既然是做技术的,就要潜下心来沉淀,什么事都不可能一蹴而就。”
二、简介
手册描述

我的理解
- 此芯片是NAND FLASH,容量是2Gbit,注意单位是比特,不是字节!
- 关于
页大小(读、写的基本单位)- 使用ECC(默认):一个页有
2KB+64B大小。后面还有64字节的空间给到了ECC。前面的部分可以随意读、写、擦除操作,后面的64字节的数据只可以读,是芯片内部对前面数据做的ECC校验。 - 不使用ECC:一个页有
2KB+128B大小,全部可以用来读写擦除操作。
- 使用ECC(默认):一个页有
- SPI:可以使用标准SPI、Dual SPI、Quad SPI、DTR。我在项目的开发中还是使用的是标准的SPI。
擦除的基本单位是block(块),一个块含有64个页。
二、芯片引脚和封装
封装
目前我使用的是下图的封装形式。
引脚定义

原理图

从上图看,Hold和Wp写保护都是关闭状态。
三、内存布局
我的理解
下面的图片很清晰,这个芯片里有2048个block,每个block有64个page,每一个page有2176个字节。大家自己计算下多少容量。

四、SPI模式

这里就讲到了SPI的配置信息,时钟可以在空闲的时候是低电平或者是高电平,但都要保证是上升沿采样。
我的配置(基于S32K3主控芯片)




我没有使用DMA传输,直接采样同步阻塞的方式传输。里面设置了1MHZ的时钟频率。
五、命令集
手册描述


我的理解
在看上面的命令集的时候,你有没有发现,有的命令后面有A23-A0,或者D7-D0,这些代表什么?A开头的肯定代表地址,表示从哪里读、写、擦除;D开头的代表数据。但地址是怎么划分的?
有的命令需要有dummy数据,就是发啥都行,默认发0就可以了。
这些是全部的命令,后面在对芯片的某一部分操作的时候,就要用到了上面的命令。
六、写操作
这里虽然说的是“写操作”,其实不妨说,这里是写操作使能或者是失能。
手册描述


我的理解
上面手册里描述了 “写使能” 和 “写失能” 的命令。如果你想要执行以下操作的时候,一定要先发送命令:06H,否则不可以执行操作。
- 页编程操作(就是基于页的写入操作)
- OTP编程操作、OTP保护操作
- 块擦除操作
上面也有讲,对于读或者写,需要至少基于页来操作,对于擦除,需要基于块 来操作。但这里明确讲了,要想写或者擦除,必须先进行写使能。
当执行了06H命令的时候,寄存器里的WEL位会置位。当然,这个H是十六进制的意思,我估计大家都知道。多强调下。
另外不想上面的操作的时候,可以发送04H命令,就把写使能关闭了,这样就不会误操作到芯片导致数据错误。
七、读操作
手册描述

上面图片上,我已经写了注释。下面我再讲下我的理解。
我的理解(读页操作的流程)
读操作的基本单位是页,读取的过程中需要三个步骤:
- 发送13H命令读到cache里面
- 发送0FH命令获取状态(判断读到了cache里了吗,并且等待读完成)
- 发送03H命令或者0BH命令,从cache里面将数据读出来
1.将数据读到cache里面

读操作需要24位的地址。那么问题来了,这24个位的地址怎么组成的?
芯片手册上有如下描述:
这里的Block编号左移6位,再加上页编号,就是24位的地址了。你说:这也没24位呀?
是的,Bit23-Bit17保持为0。
2.获取操作结果
之后发送的0F命令:
提出几个问题:
- 这里也要发A7-A0,指的是什么?
- D7-D0,指的是什么?
- Wrap,指的是什么?
我说明下,A7-A0指的是寄存器地址。0FH这个命令其实是读取寄存器的值。
那么你知道D7-D0,是什么意思了吗?不就是寄存器的值嘛!那么最后的Wrap,就是说,这个命令可能不是一次就读出来的,需要多读几次。
比如将数据读到cache里面的操作,肯定需要时间,是吧,你在第一次发送0FH命令的时候,可能还没有读完,那就多发几次,当然也要在程序里做超时机制。大约等20ms,就足够了。
下面讲下这里的寄存器。
我们要读的就是Status寄存器,地址是C0H,它的最低位就是操作结束的标志。

3.将cache的数据读出来

这里的A15-A0,直接写0就行了,因为在读cache,之后发送1字节的dummy,再后面就是源源不断的数据了,这里只写了一个,代表的就是大量的数据。一个页是2KB+128B,后面的数据就是这么多。
注意点
手册里说,读完2KB的时候,下一个读到的是开头的数据。是下一页的开头数据吗?还是说,仍然是这一页的开头数据?
这里我有疑惑,手册没说明白。具体还要看实践吧。我回头实践操作了,再来补充说明。
八、页编程操作
手册描述

我的理解(页编程的流程)
1.发送写使能命令
2.发送02H命令将数据写到cache里面

这里的A15-A0,直接写0就行了,因为是往cache里面写的。后面的D7-D0,还有后面的,都是要写进去的数据。
3.发送10H命令执行写FLASH操作

这里的24位地址,就是实际要写进去的地址,包括哪个block,哪个page。跟读取的时候一样,block编号左移6位,再加上page编号就行。
最后的15H,我在代码里没有写,我写了A7-A0,不过可以正常写进去。
4.发送0FH命令读取操作结果
这个已经讲过了,可以看上面。
九、擦除操作
手册描述

我的理解
擦除的话,是以block为单位的,每次擦除一个block,也就是64个page,128KB的空间。它有以下的步骤要做:
1. 发送写使能命令

2. 发送D8H擦除命令

这里的24位地址是这样的:
将要擦除的block编号左移6位,得到的值,就是这里的24位地址。将其分别按照高8位,中间的8位,最后的8位,放进命令里面,就可以了。
3. 发送0FH命令获取操作结果
上面已经讲过了,可以看上面的讲解。
避坑指南
在擦除之前,可以看看是否FLASH被锁了,如果有被锁,就要解锁。
十、代码
这部分的完整代码,可以私信我获取。
以上就是全部内容,感谢大家支持点赞!
更多推荐
所有评论(0)