典型的Nand Flash 引脚定义和内部结构框图
I/O0~I/O7 可以到I/O15
CLE 指令锁存使能 高电平时控制命令在WE上升沿锁存
ALE 地址锁存使能 高电平时 数据在WE上升沿锁存
nCE 片选信号
nRE 读信号 高电平锁存
nWE 写信号 高电平锁存
nWP 写保护引脚
RDY/B 可用/忙标志,控制操作的同步
Vcc Vss
小常识:
引脚上面带横杠或者加‘#’WE# 或者加面加nWE都表示低电平有效
开发板使用的是K9F2G08U0A
可以存储空间256M X 8bit
page size:2K+64 B
block size:64 * (2K + 64)B
block count: 2048
编程/读写大小以页进行
page Program: 2K+64 B
擦除以块进行
block Erase: 128K+4K B
三类地址:
Block Address:A0-A11
Page Address:A12-A17
column Address:A18-A28
传送顺序依次是 列地址,页地址,块地址
S3C2440A的Nand Flash控制器
*支持读写擦除
*自动启动模式(steppingstone)
*硬件ECC检测快
工作模式
1.自启动模式
注意:在自动启动模式下(Nand 启动),ECC不被检测,所以一般Nand 前4KB不允许有错误
2.当做普通存储器使用
步骤
写命令寄存器
写地址寄存器
写数据寄存器
读数据寄存器
读主ECC寄存器和备份ECC寄存器
注意:必须软件检测RnB状态输入引脚
NAND flash控制器的引脚配置
DATA[7:0]
CLE
ALE
nFCE
nFRE
nFWE
nWAIT 读忙标志
nCON 内存地址补偿
OM[1:0] = 00;enable Nand Flash启动
寄存器配置:
NFCONF :TACLS=1 TWRPH0=4 TWRPH1=0 BUSW=8bi(GPG15)
NFCONT : 初始化ECC 主/备ECC锁定 允许nand使能 禁止片选
NFSTAT : 只用到第一位和第三位用于判断RnB忙。?
NFADDR
NDDATA(以字进行读写,但只取低八位)
NFCMD (只用到低八位)
NFMECCD0/1(只用到第一第三字节单元)
NFMECC0/1(8位NAND只用到一个)
NFSECCD
NFSECC
NFESTAT0/1(只用到一个)
NAND控制寄存器命令
分为单周期和双周期命令,一个总线周期是AHB,即HCLK=100M,大概10nS,NAND要求WE/RE至少50nsTcls=1THO=4 Tclh=0
双周期命令第一个命令用来启动,第二个命令用来执行,中间是地址
例如在写入写命令第二个命令后,NAND开始讲缓存的数据写入指定页,此时系统自动进入读状态寄存器模式,此时可以读取状态寄存器STAT的值,可以通过RnBd引脚状态 或I/O第6个字节若为"1",则说明写入完成。页写入擦除应检测I/O 0位。复位时,状态寄存器为0xC0
ECC校验原理:
Nand Flash的每一页有两区:main区和spare区,main区用于存储正常的数据,spare区用于存储其他附加信息,其中就包括ECC校验码。当我们在写入数据的时候,我们就计算这一页数据的ECC校验码,然后把校验码存储到spare区的特定位置中,在下次读取这一页数据的时候,同样我们也计算ECC校验码,然后与spare区中的ECC校验码比较,如果一致则说明读取的数据正确,如果不一致则不正确。S3C2440共产生4个字节的main区ECC码和2个字节的spare区ECC码。规定,在每一页的spare区的第0个地址到第3个地址存储main区ECC,第4个地址和第5个地址存储spare区ECC。
ECC校验码的过程为:在写入哪个区的数据之前,先解锁该区的ECC,以便产生该区的ECC。在写入完数据之后,再锁定该区的ECC,这样系统就会把产生的ECC码保存到相应的寄存器中。main区的ECC保存到NFMECC0/1中,spare区的ECC保存到NFSECC中。对于读操作来说,我们还要继续读取spare区的相应地址内容,以得到上次写操作时所存储的main区和spare区的ECC(当数据写入时自动产生ECC),并把这些数据分别放入NFMECCD0/1和NFSECCD的相应位置中。最后我们就可以通过读取NFESTAT0/1中的低4位来判断读取的数据是否正确,其中第0位和第1位为main区指示错误,第2位和第3位为spare区指示错误。
NAND FLASH 操作:
1.写操作
首先判断是否是坏块,在两个写命令周期间写入地址和数据,把CPU产生的Main,Spare区的ECC校验码写入到Spare区前六个字节
,然后读取NAND的状态寄存器(I/O 0 位)判断此次写操作是否正确;
如果是坏块还要进行标记!
2.读操作
在两个读命令间写入地址,待数据读到缓存后,复制到目的地址
读取过程中CPU会产生ECC校验码(存储于NFMCC0),在解锁Spare区的ECC,读取2048~2051的内容(Main区的校验码),保存到NFMCCD0/1,由于读取了Spare区,又会产生Spare区得校验码 CPU保存在NFSCC寄存器,继续读取Spare区的四个地址内容(虽然只用了前两个字节,但读取只能以字进行),并保存到NFSECCD中,接下来才关闭片选使能,这个时候CPU会自动进行校验,即比较NFMECCD0/1 与NFMECC内容 和比较NFSECCD 和NFSECC内容 若相等则NFESTAT0 = = 00(8位);
3.擦除操作
类似于写操作
首先判断是否是坏块,坏块不能进行擦除
在擦除命令之间写入块地址(A18-A28),当I/O 6 ==0时,再判断 I/O 0 ==0?为0 则说明擦除正常,否则擦拭失败,并进行标记
4.随机读写
首先将整页读取到缓存,在随机读写命令间写入页地址 完成读写