[smart210] Nand Flash K9F4G08U0B 的配置与读写控制(一)

来源:互联网 发布:jdk 7u17 windows x86 编辑:程序博客网 时间:2024/05/16 17:43

平台:smart210

CPU:s5pv210

目标:控制核心板上的Nand Flash,对其进行读写操作,本文为基本配置篇

知识储备:从tiny210v2核心板上我们发现,nand flash的型号是K9F4G08U0B,根据nand flash的命名规则,我们不难发现这是一块4Gbits大小的单位地址存储x8bits的SLC nand flash存储器,存储空间换算过来就是512M x 8 bits 。在相似型号K9F4G08U0A的datasheet中发现这种型号的flash具有4096个Blocks,每个Block有64个Pages,每个Pages有2048Bytes的数据,综合起来就是 4096*64*2048 *8bits=512M x 8bits。地址周期为5Cycles,这里解释一下地址周期:


这边有行地址和列地址,行地址row_addr就是寻址页的,列地址column_addr就是页内寻址的。这里我们有个问题需要搞清楚:我们的存储空间是512M,想对它寻址的话需要29位地址,可是我们传输地址的I/O口只有8位,那么就需要至少4个周期来传输地址信息,所以这里我们为了区分行地址和列地址采用了5个地址周期,先传输列地址,再传输行地址,由于页数在数值上是远大于页大小的,所以我们能够发现页地址的地址位数较多。

比如说我们这里有一个针对nand flash的地址addr,字长4字节,寻址空间就有2^32即4G,由于每个地址存有8bits即一个Byte的数据,说明最大存储容量为4GB。然后我们计算row_addr=addr/page_size即行地址(或者称 页地址)=寻址地址/页面大小,而column_addr=addr%page_size即列地址(或者称 页内地址)=(寻址地址/页面大小)的余数。这样的话,我们就能把普通的寻址地址转换成nand flash能读得懂的行列地址了。根据这个算法,我们就不难得知,行地址row_addr最大为2^32/2048=2^21=2M(即一个这样的页面大小为2KB的nand flash最多能有2M个页供我们寻址),列地址就不消说了,最大列地址不可能超过页面大小2K。

接下来就是三个关键时序参数TACLS、TWRPH0与TWRPH1的设置,主要从以下的截图获得相关的信息





s5pv210官方文档给出了这三个值的说明

从图1与图2我们可以看出以下关系,结合图3得出最小值要求

TACLS=tCLS-tWP  最小值0ns

TWRPH0=tWP  最小值12ns+10ns(上图可以发现TWRPH0需要额外的10ns)

TWRPH1=tCLH  最小值5ns

由于我们的HCLK_MSYS的频率为133.4Mhz(7.5ns),当NFCONF寄存器的TACLS设置为1时,得出TACLS的实际时间为7.5*1=7.5ns>0。当TWRPH0=2时,TWRPH0实际时间为7.5ns*(1+2)=22.5ns>12ns+10ns。当TWRPH1=1时,TWRPH1实际时间为7.5ns*(1+1)=15ns>7.5ns。这样的时序设置就能符合要求了,由于TWRPH0的时间被我们设置成22.5ns还是比最小值堪堪大出0.5ns,所以有必要把这个值也设置得大一点,安全值应为TWRPH0=3。

好了,有了上面的知识储备,NFCONF寄存器就知道怎么设置了


这里我们设置为NFCONF=(TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<3)|(0<<2)|(1<<1)|(0<<0);

其中bit1在当我们的pages有2K时设置5个地址周期,bit1=1

而bit3由于我们的Nand Flash是SLC的,所以bit3=0

进而bit2在bit3=0时设置SLC,则此处为page的页面大小,之前已经得知为2k,则bit2=0

#define TACLS  1

#define TWRPH0 3

#define TWRPH1 1

接下来就是NFCONT的设置


MODE=1,使能该nand flash控制器

Reg_nCE0=1,取消片选

Reg_nCE1=1,取消片选

xxxxECC相关的无视,暂时不用到


RnB_TransMode=0,nand flash 的状态检测引脚,上升沿触发

EnbRnBINT=0,禁止RnB中断

其余的不相关的都禁止掉,尤其LOCK与LockTight,这两个是负责保护数据的锁定位,设置这两个位一个不慎就会造成nand flash的某片区只能读不能写。



最后是memory port的设置,由于210支持多种不同类型的外置ROM,如SROM,Nand Flash,One Nand等,所以设置了一整套专门用于连接存储器的复用端口,因此我们还需要指定MP0_1,MP0_2,MP0_3这些端口作为Nand Flash使用,相关的寄存器有点多,就不贴了。


前面所做的工作,最终对nand flash控制器做了初始化,代码如下图


0 0
原创粉丝点击