一、前言

本文是笔者阅读芯片手册之后在代码上实操之后总结的经验,文章会包含芯片手册的部分截图(芯片手册上也有我的笔记)和我的一些注解。最后还有我写的代码,如您像要获取芯片手册的话,可以私信。

脑子里突然出现一句话,送给我自己,也送给大家:“既然是做技术的,就要潜下心来沉淀,什么事都不可能一蹴而就。”

二、简介

手册描述

在这里插入图片描述

我的理解

  • 此芯片是NAND FLASH,容量是2Gbit,注意单位是比特,不是字节!
  • 关于大小(读、写的基本单位
    • 使用ECC(默认):一个页有2KB+64B大小。后面还有64字节的空间给到了ECC。前面的部分可以随意读、写、擦除操作,后面的64字节的数据只可以,是芯片内部对前面数据做的ECC校验。
    • 不使用ECC:一个页有2KB+128B大小,全部可以用来读写擦除操作。
  • 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命令,就把写使能关闭了,这样就不会误操作到芯片导致数据错误。

七、读操作

手册描述

在这里插入图片描述
上面图片上,我已经写了注释。下面我再讲下我的理解。

我的理解(读页操作的流程)

读操作的基本单位是,读取的过程中需要三个步骤:

  1. 发送13H命令读到cache里面
  2. 发送0FH命令获取状态(判断读到了cache里了吗,并且等待读完成)
  3. 发送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被锁了,如果有被锁,就要解锁。

十、代码

这部分的完整代码,可以私信我获取。


以上就是全部内容,感谢大家支持点赞!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐