一、Nand Flash 简介 Flash 中文名字叫闪存,是一种长寿命的非易失性(断电数据不丢失)的存储器。可以对称为块的存储器单元块进行擦写和再编程,在进行写入操作之前必须先执行擦除。功能性分为两种: NOR Flash:允许随机存取存储器上的任何区域,以编码应用为主,其功能多与运算相关 Nand Flash:主要功能是存储资料,适合储存卡之类的大量数据的存储。 本章以K9F1G08U0E芯片为例讲解Nand Flash。如下为此芯片的数据手册: 二、Nand Flash存储结构 一个Nand Flash由多个块(Block)组成,每个块里面又包含很多页(page)。每个页对应一个空闲区域/冗余区域(spare area),这个区域不是用来存储数据的,用于放置数据的校验值检测和纠错的。 块,是Nand Flash的擦除操作的基本/最小单位。 页,是Nand Flash的写入操作的基本/最小的单位。 从上图可知,K91FG080U0E包含1024 Blocks,每个Block包含 64 Pages,每个Page包含2K Bytes数据空间 + 64 Bytes冗余空间。故总大小=1024 Blocks x 64 Pages x (2K+ 64) B = (1024 + 32) MBits = 1G Bits。 三、Nand Flash引脚功能说明
(字母上面带横杠说明引脚是低电平有效,为书写方便,在字母后面加“#”表示) 四、可变存储控制器(FMC) FMC,即可变存储控制器,为STM32系列单片机的接口,本章就是通过这个接口控制NAND FLAHS。 FMC 功能块可连接:同步/异步静态存储器、 SDRAM 存储器和 NAND Flash。其主要用途有:
说得复杂一点,FMC个功能就是将读写stm32内部地址操作转换为输出满足外部存储器的时序读写外部存储器。例如对STM32内部Ox8000 0000地址写入一个数据,FMC控制器会控制对应的管脚输出一个满足Nand Flash的时序,发送一个数据到Nand Flash设备。同理读取读取内部的寄存器,也会生成一个时序从Nand Flash读取一个数据。因此通过FMC控制外设非常简单,只需读写STM32内部寄存器即可实现对外部存储器的读写操作。我们只需配置好FMC时序寄存器,使产生的时序满足外部存储器的访问时间要求。 FMC框图如上图,所有外部存储器共享地址、数据和控制信号, 但有各自的片选信号。 FMC 一次只能访问一个外部器件。其中FMC_A[25:0],FMC_D[31:00]为地址线和数据线,由于Nand Flash地址线和数据线复用,故配置时地址线和数据线是一样的。Nand Flash接口如下图(摘自Open746I-C原理图)。 FMC的存储区域外部储存分配图如图。其中Nand Flash为储存区域3,4x64MB。起始地址为0x8000 0000。 五、Nand Flash控制时序 和前面介绍的串行Nor Flash芯片W25Q128FV类似,Nand Flash也是通过指令控制的,在这里简单讲解一下Nand Flash的控制时序,讲解这部分只要是为了加深对Nand Flash的了解,和学习看时序图,实际编程的时候是不需要用到的,这部分ST公司已经提供nand flash的库了,我们只需调用函数控制Nand flash即可,不需要再理会底层。 下面为Nand Flash操作指令: 如下编程操作和读操作的时序。首先先拉低NCE片选,只有选中芯片才能让他工作。 Nand Flash是通过 ALE/CLE 来区分数据线上的数据是命令(CLE有效),地址(ALE有效)还是数据(CLE/ALE都无效)。通过NWE/NRE来区分数据线上的数据是写操作(NWE有效)还是读操作(NRE有效)。 下面为发送命令的时序图,已经对应的时间参数表: MEMxSET = tCLS - tWP >= 0ns MEMxWAIT = tWP >= 12ns MEMxHOLED = tCLH >= 5ns MEMxHIZ = tCLS - tDS >= 0ns 六、新建工程 复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置,选择NCE3开启NAND Flash,数据地址线选择8 bits,Ready or Busy选择 NWAIT。 FMC配置NAND Flash如下:使能ECC校验,建立保存等待等时间参数设置可以见上一节的时序图时间参数。 FMC是挂载到AHB时钟线上,频率等于系统时钟频率,即216M,时钟周期为 1 /216 MHz = ~4.6ns。 NAND属性信息根据前面介绍的K91FG080U0E存储结构配置。 生成报告以及代码,编译程序。在fmc.c文件中可以看到初始化函数。在stm32f7xx_hal_nand.h头文件中可以看到NAND Flash的操作函数。 声明变量: RxBuffer,TxBnffer为读写缓存,大小可以Nand flash一页的长度;NAND_ID储存ID信息,WriteReadAddr为存储Nand Flash操作地址。 /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ /* for K9F1G08 */ #define NAND_PAGE_SIZE ((uint16_t)0x0800) /* 2 * 1024 bytes per page w/o Spare Area */ NAND_IDTypeDef NAND_ID; NAND_AddressTypeDef WriteReadAddr; static uint8_t TxBuffer [NAND_PAGE_SIZE]; static uint8_t RxBuffer [NAND_PAGE_SIZE]; uint16_t i; /* USER CODE END PV */
|