Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1749380
  • 博文数量: 143
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1462
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-23 11:14
文章分类

全部博文(143)

文章存档

2022年(3)

2021年(13)

2020年(21)

2019年(8)

2018年(28)

2017年(7)

2016年(63)

我的朋友

分类: 嵌入式

2016-09-13 16:22:57

摘要:本文小结一下NandFlash和NorFlash的结构和驱动,以及NandFlash和NorFlash常见的问题,包括NandFlash和NorFlash的区别、用途等等
1 结构
1.1 NandFlash
1.1.1 NandFlash的结构
  本文以K9K8G08U0B为例,研究一下NandFlash的结构。一般在NandFlash的datasheet中,会有个存储阵列图,如:

  • 首先,需要知道的是:K9K8G08U0B主要以page(页)为单位进行读写,以block(块)为单位进行擦除。每一页中又分为main区和spare区,main区用于正常数据的存储,spare区用于存储一些附加信息,如块好坏的标记、块的逻辑地址、页内数据的ECC校验和等。
  • 其次,在上图中很容易看得出(原图中右边已经计算好了):K9K8G08U0B的一页为(2K+64)字节(2K表示的是main区容量, 64表示的是spare区容量);它的一块为64页;而整个设备包括了8192个块。这样算下来一共有8448M位容量,如果只算main区容量则有1024M字节(即1024M×8位)。
  • 最后,如何通过8个IO口来要访问这么大的容量,我们接着看上图:K9K8G08U0B用5个周期来实现,第一个周期访问的地址为A[0:7];第二个周期访问的地址为A[8:11],它作用在IO[0:3]上,而此时IO[4:7]必须为低电平;第三个周期访问的地址为A[12:19];第四个周期访问的地址为A[20:27];第五个周期访问的地址为A[28:30],它作用在IO[0:2]上,而此时IO[3:7]必须为低电平。
    我们来解释一下这些地址的含义原图中右边已经标识过了,这些地址被分为列地址A[0:11]和行地址A[12:30],而行地址A[12:30]中,A[12:17]表示页地址,A[18:30]表示块地址。即:(2K+64)个byte用12bit来表示(由于存在spare area),占用A[0:11],表示该数据(单位为byte)在页内的相对地址;64个page需要6bit来表示,占用A[12:17],表示该page在块内的相对地址;8192个block需要13bit来表示,占用A[18:30],表示该block在flash内的相对地址
    综上不难看出,列地址是用于寻址页内空间;行地址用于寻址页,如果要直接访问块,则需要从地址A[18]开始。
1.1.2 NandFlash的驱动
  读写NandFlash的实现,可参考:http://blog.csdn.net/intint/article/details/4664685
1.1.3 NandFlash小结
  NandFlash通过驱动去按一定步骤操作CPU内集成的NandFlash控制器(一般集成在CPU内部,也有外部扩展的)的寄存器(硬件提供控制器基地址和寄存器偏移地址)来间接寻址实现读取数据。而其实这些寄存器对应的就是IO引脚,那么操作寄存器就是操作IO引脚的时序到对端,这样就实现了发送命令字和地址序列进行读写操作。需要注意的是,由于地址/数据的IO引脚不够,即NandFlash地址只能在I/O[7:0]上传递,导致NandFlash地址分多次传递,所以驱动代码中的地址值会有移位和多次传递)。
1.2 NorFlash
1.2.1 NorFlash的结构和驱动
  待后面项目遇到后补充...
...。
1.2.2 NorFlash小结
  NorFlash通过一次性的直接寻址实现读取数据。
2 常见问题
2.1 NandFlash和NorFlash之间的区别?
  首先,NorFlash有足够多的地址线使得CPU能够寻址到每一个存储单元上去,这也意味着CPU能够直接通过总线访问Norflash上存储的内容。而NandFlash仅有8个IO引脚传递地址(地址和数据共用)显然不够用,实际上NandFlash是通过Nandflash控制器(这个一般集成在CPU内部)来完成读写操作的。
  其次,Norflash支持片内执行;NandFlash不支持片内执行。
  另外,关于二者功能性和性能性的区别,网上一搜一大片,这里不再重复。
2.2 NandFlash和NorFlash有哪些用途?
  对于NorFlash来说,由于其XIP特性,但也受制于很低的写入和擦除速度,通常被用于uboot、BIOS。而对于NandFlash,由于其没有挂在地址总线上,通常被用于从NAND读到CPU内部的SRAM里执行。
  总而言之,一般在系统启动时,通常用一块小NorFlash运行启动,再通过NandFlash启动。但有的CPU,如s3c2410支持将一定大小的程序从NandFlash读到CPU内部的SRAM里,从SRAM启动,再通过NandFlash启动。

2.3 NorFlash能片内执行,但NandFlash为什么不支持片内执行?
  首先,由于NorFlash地址线和数据线是分开的(跟SDRAM一样),可以被直接寻址,符合CPU取指令译码的要求(CPU送一个地址出来,Norflash就能给一个数据让CPU执行,中间不需要额外的处理操作)。而NandFlash共用地址线和数据线(只有控制线和8个IO引脚,分时传送控制、地址和数据信息),需要额外Nandflash控制器(一般集成在CPU内部)间接寻址,不符合符合CPU取指令译码的要求(CPU把地址发出来之后,并不能直接得到数据,还需要控制线的操作才能完成)。但可以增加硬件电路和软件支持,也可以使得NandFlash支持XIP。
     总而言之,RAM和NorFlash都具有并行的地址和数据端口,所以他们可以被直接寻址。而NandFlash是没有这样的完整端口,他需要驱动,才能读出数据。
     需要注意的是,片内执行(XIP, eXecute In Place)不是说程序在存储器内执行哦。norflash XIP,是指CPU(CPU的基本功能就是取指、译码和执行)的取指模块能够直接从norflash中把指令取出来,供后面的译码和执行模块使用。
  其次,芯片内执行主要是是看芯片可不可以线性存储代码(假如硬件支持芯片接口),只要能保证芯片的存储空间是线性的(也就是无坏块),都可以片上执行。但是在读取Flash时候,容易出现“位翻转,而NAND的出现几率要比NorFlash大得多。那么,如果能保证不出错,比如说在执行CODE之前去做一次ECC校验,来确保CODE是连续正确的,NandFlash也还是可以进行XIP。有人这么做了,而且也证明是成功的。
     总而言之,所谓XIP,就是CODE是在FLASH上直接运行. NandFLASH只是不适合做XIP,但并不是不能做XIP。

2.4 NorFlash既然不仅可以记忆数据而且可以运行程序,是不是可以不要RAM?
  首先,理论上找一个大一点儿的norflash也应该可以,但事实上是不行的,因为程序执行时中间要用到一些临时变量等,这些变量是要频繁读写的,flash的擦写是有次数的(一般几万次到几百万次),对于一个高速的CPU像操作变量一样擦写flash,估计很快就挂了。
  其次,NorFlash的速度比起RAM来差得多,况且这些临时变量并不需要永久保存,可以掉丢失。
2.5 NandFlash物理地址如何计算?
  NandFlash是块设备,没有物理地址,那么它需要靠操作NandFlash控制器的寄存器实现读写。

27/08/2020
2.6 spi flash?
选自:【原创】【SPI】SPI Flash介绍
  SPI一种通信接口。那么严格的来说SPI Flash是一种使用SPI通信的Flash,即,可能指NOR也可能是NAND。但现在大部分情况默认下人们说的SPI Flash指的是SPI NorFlash。早期Norflash的接口是parallel的形式,即把数据线和地址线并排与IC的管脚连接。但是后来发现不同容量的Norflash不能硬件上兼容(数据线和地址线的数量不一样),并且封装比较大,占用了较大的PCB板位置,所以后来逐渐被SPI(串行接口)Norflash所取代。同时不同容量的SPI Norflash管脚也兼容封装也更小。,至于现在很多人说起NOR flash直接都以SPI flash来代称。
  NorFlash根据数据传输的位数可以分为并行(Parallel,即地址线和数据线直接和处理器相连)NorFlash和串行(SPI,即通过SPI接口和处理器相连)NorFlash;区别主要就是:1、SPI NorFlash每次传输一bit位的数据,parallel连接的NorFlash每次传输多个bit位的数据(有x8和x16bit两种); 2、SPI NorFlash比parallel便宜,接口简单点,但速度慢。
2.7 XIP?
选自:XIP技术
  什么是XIP?工作原理又是怎么样的?
  XIP eXecute In Place,即芯片内执行,指应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。flash内执行是指nor flash 不需要初始化,可以直接在flash内执行代码。但往往只执行部分代码,比如初始化RAM。
  (注:片内执行不是说程序在存储器内执行哦,CPU的基本功能就是取指、译码和执行。norflash能在芯片内执行,就是指CPU的取指模块能够直接从norflash中把指令取出来,供后面的译码和执行模块使用)
个人理解,想要能够片内执行,需要能够被CPU随机访问任何一个地址。
阅读(2681) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~