U-boot-2014.04移植到MINI2440(7) nand flash datasheet及arm9控制寄存器分析

时间:2022-10-14 17:12:27

我的MINI2440上有一个256M的nand flash,后面我们需要从nand启动u-boot,然后引导加载内核,再挂载根文件系统,这里先对其做一个较为细致的认识。主要是硬件管脚定义,控制方式,处理器的控制寄存器对其做一个了解,因为现在市面上nand的用途比较广泛,数码相机,mp3都要使用,进入正题。

      

.nand flash datasheeet

在移植好的u-boot下输入nand info会出现下面的信息:

Device 0: NAND 256MiB 3,3V 8-bit, sector size 128 KiB

这说明nand大小为256M,工作电压3.3v,数据总线为8位,扇区大小为128K。首先我们要明确,nand flash的读写原理。我们找找mini2440的原理图,以及nand flash的datasheet来简略分析下。这里我推荐一个datasheet的网站,叫easydatasheet,一般我需要看一个芯片手册都在里面下载。我们板子上的nand型号为:K9F2G08UOC-SCB0。

这里我们有两个地方是要看的,首先是features,也就是第四页,翻译过来如下:

电压:

3.3v的设备,工作范围在2.7~3.6之间

组织(Organization):

存储单元阵列:(256M + 8M) x 8bit

数据寄存器:(2K + 64) x 8bit

自动编程和擦除:

       页面编程:(2K + 64)Byte

       块擦除:(128K + 4K)Byte

页面读取操作:

       页大小:(2K + 64)Byte

       随机读:40μs(Max.)

       串行读:25ns(Min.)

快速写周期时间:

       页编程时间:250μs(Typ.)

       块擦除时间:2ms(Typ.)

I/O口命令/地址/数据复用

硬件数据保护:

       在电源转换时锁住编程/擦除操作

ECC校验要求:

       1bit / 528bytes,命令驱动操作

 

总结一下上面部分,nand大小为256M,一页大小为2k,一块大小为128k,也就是一块包含64个页,一共256M,也就是有2048个块,256M需要多少28位来传送,但是只有8个I/O,所以要分多次传送,分几次呢?按照datasheet,要分五次。下面是网上找的存储结构图,我下载的datasheet里面没有这个图,但是交代了要分五次,每次怎么传,传的什么东西,都有介绍:

U-boot-2014.04移植到MINI2440(7) nand flash datasheet及arm9控制寄存器分析

U-boot-2014.04移植到MINI2440(7) nand flash datasheet及arm9控制寄存器分析

 

接着datasheet给出了各个引脚描述,在第8页的pin description,结合mini2440开发板的pcb 原理图,可以整理如下。

U-boot-2014.04移植到MINI2440(7) nand flash datasheet及arm9控制寄存器分析

       这里的引脚定义做了个表格如下:

信号编号

信号名称

信号功能描述

29-44

I/O0-I/O7

数据输入输出口,地址和数据总线(复用)

7

R/B

Read/busy output忙或者已准备

9

CE

片选信号

16

CLE

命令锁存,用在写操作时锁存写命令

17

ALE

地址/数据锁存,在写时用来锁存地址或者数据

18

WE

写有效使能,表示当前在写操作

8

RE

读有效使能,表示当前正在读操作

6

SE

悬空未知

13,16

VSS

公共接地端

19

WP

写保护,这里连接VDD表示允许正常读写

12,37

VCC

器件工作电压输入端

       再下面,第9页,一开始给出了一段描述,叫production introduction,也就是产品介绍,主要讲了使用了8位复用I/O是为了降低引脚,方便升级,然后各个指令需要几个周期,引脚的电平在读写时高低有何要求,写地址、数据、命令时,CE、WE信号必须为低电平,它们在 WE信号的上升沿被锁存。命令锁存使能信号CLE和地址锁存使能信号ALE用来区别IO引脚上传输的是命令还是地址,这个都可以自己去阅读。

       下面给出了各个控制命令写入命令寄存器的格式:

U-boot-2014.04移植到MINI2440(7) nand flash datasheet及arm9控制寄存器分析

所以我们会看到这些宏定义:

#defineCMD_READ1                 0x00              //页读命令周期1

#defineCMD_READ2                 0x30              //页读命令周期2

#defineCMD_READID               0x90              //读ID命令

#defineCMD_WRITE1               0x80              //页写命令周期1

#defineCMD_WRITE2               0x10              //页写命令周期2

#defineCMD_ERASE1               0x60              //块擦除命令周期1

#defineCMD_ERASE2               0xd0              //块擦除命令周期2

#defineCMD_STATUS                0x70              //读状态命令

#defineCMD_RESET                 0xff               //复位

#defineCMD_RANDOMREAD1         0x05       //随机读命令周期1

#defineCMD_RANDOMREAD2         0xE0       //随机读命令周期2

#defineCMD_RANDOMWRITE         0x85       //随机写命令

 

再下面,在第11页,给出了各个模式的时候,控制引脚的电平状态:

U-boot-2014.04移植到MINI2440(7) nand flash datasheet及arm9控制寄存器分析

       在后面给出了时序图,读写校验等的流程图,这里不多做赘述了。

 

二.S3C2440 and flash控制寄存器

       S3c2440的nand flash控制器主要有以下6个,下表列出了其名称,作用,地址。

寄存器名称

地址

作用

NFCONF:配置寄存器

0x4E000000

设置NAND Flash的时序参数,设置数据位宽,设置是否支持其他大小的页等

NFCONT:控制寄存器

0x4E000004

使能NAND Flash控制器、使能控制引脚信号nCE、初始化ECC,锁定NAND Flash等功能

NFCMD:命令寄存器

0x4E000008

发送Flash操作命令

NFADDR:地址寄存器

0x4E00000C

向Flash发送地址信号

NFDATA:数据寄存器

0x4E000010

读写此寄存器启动对NAND Flash的读写数据操作

NFSTAT:状态寄存器

0x4E000020

0:busy,1:ready

       一般,对于控制器来说,nand相当于一个外围设备,就像我们操作lcd一样,其实有点像,步骤大多都是配置,给命令,给地址,检测状态,读写数据,over。这里对nand flash的操作步骤总结如下:

       第一步:设置NFCONF配置NAND Flash。

       第一步:向NFCMD寄存器写入命令。

       第三步:向NFADDR寄存器写入地址。

       第四步:通过寄存器NFSTAT检测NAND Flash的状态。

       第五步:通过NFDATA读写数据,并进行校验。

 

       下面附上读操作的时序图,以及流程图,操作nand就是根据这两个图来进行细致的步骤,后面我们会用得到。

U-boot-2014.04移植到MINI2440(7) nand flash datasheet及arm9控制寄存器分析

U-boot-2014.04移植到MINI2440(7) nand flash datasheet及arm9控制寄存器分析

       这篇帖子就分析到这里吧,有不正确的地方还请指出,大家共同进步。