分享

深入理解nandflash基本特性

 yliu277 2023-03-30 发布于湖北

nandflash作为嵌入式中的”磁盘”, 被广泛的应用, 以(K9F2G08U0B)为例,其他型号都差不多

  • nandflash的结构 
    这里写图片描述
    nandflash的结构有页(page), block(块)的概念,其中页是真实概念,而块儿是虚拟概念(目的是为了更好的管理存储空间) 
    page: 一个page大小为2K 64bytes, 如上图所示,其中的64bytes是所在页的infomation, 记录着此页的使用情况,比如剩余存空间等 
    block: 一个block由64个页组成, 一个nandflash芯片由2k个block组成,算算就知道,一个nandflash芯片一共能存储256M的数据.
  • nandflash的引脚说明 
    这里写图片描述
  • nandflash与2440的连接 
    这里写图片描述 
    由上连接图可以看出,ALE,CLE这种信号其实就是2440的GPIO(体现了管脚复用的功能) 
    注意,与nandflash的数据传输接口就只有IO0->IO7这8根并行的数据线,所以我们发送读命令还是写命令还是地址,都是通过这8跟先发出的,具体情况如下分析
  • nandflash的读操作,先给出时序图(datasheet),之后在分析 
    这里写图片描述
    首先我们先看一下读取nandflash需要一个什么样的周期 
    1.首先发命令 00H(读命令) 
    2.发送地址 
    3.发送地址 
    4.发送命令 30H(读命令) 
    5.忙等待 
    6.读取数据 
    从数据手册上来看,对于命令代表的意义如下图所示 
    这里写图片描述
    我们看到,读命令确实要发两次,那么为什么要这么操作呢?这其实根据nandflash的硬件来定的,第一次发读命令是把读取的命令放到nandflash的IO BUFFers这个硬件中,之后再发一次读命令才真正的把命令写入nandflash中,这样做的好处是为了降低页的写入时间
  • 根据时序图看过程1 
    我们通过IO1–>IO7来发送读命令,此时nandflash如何区分到底是命令,地址,还是数据呢? 
    很简单: 拉高CLE, 拉低ALE ,之后拉低WE,把命令00H放到I/O总线上,当WE由电平至高电平转变时,发生锁存,nandflash获取读命令
    这个过程要注意的是: 拉高CLE是为了锁存使能,也就是WE上升沿的时候可以锁存成功从而使nandflash获取命令数据,ALE拉低是为了告诉nandflash此时发的是命令数据
  • 根据时序图看过程2 
    我们通过IO1–>IO7来发送地址 
    这里写图片描述 
    上图即我们需要传送地址的顺序,我们通过时序图发现要传送5次(5个周期)地址,每次的格式如上图所示,接着分析, 当拉低CLE,拉高ALE即认为开始发送地址信息, 之后拉低WE,将地址信息放到总线上,之后WE上升沿锁存,nandflash获取地址信息 
    之后的分析过程相信自己就能分析了, 
    注意: 
    1.根据ALE与CLE的变化来区分总线IO1->IO7上的数据type 
    2.关于地址说明:大多nandflash是以页为单位进行读取或者写入的,以K9F2G08U0B为例 子,读取一次数据最小就是2k(一页的数据量)的数据量,这是由硬件特性决定的,但不是绝对的,比如K9F2G08U0C这一款的nandflash支持页内的地址访问,所以我们在写nandflash底层读写函数都应该以页为单位进行读写 
    3.写nandflash时,需要先擦除存储单元, 之后在向存储单元写入数据,要注意的是,nandflash擦除是以block为单位,也就是说一次最少要擦除1个block即64页的数据, 这也是硬件的限制,至于为什么要擦除?是因为硬件的原因,使得nandflash只能写入0,不能写1,所以擦除是为了让存储单元都变为1
  • 对于发送的地址要进行一个问题的讲解 
    这里写图片描述 
    上图中A0—>A11为Column Address,对应的是页内的偏移,问题来了, 一个页为2k大小,理论上A0->A10就可以了,那么为什么多出个A11呢?别忘了,一个页上除了2k大小的地方,还有个64Bytes的地方,要访问它的话,A0->A10地方不够不是,所以多出了个A11,当A11为0时,nandflash也不会理会这个ECC空间(64Bytes) 剩下的A12–>A28为页索引,因为一个块有64个页,所以我们把A12->A17定为页索引, A18->A28定为块索引,其对应关系如下图: 
    这里写图片描述这个图很容易被人误导, 
    比如我要发送读取nandflash 4096这个地址的数据, 换句话讲,应该是nandflash 4k数据后开始的数据,应该是第三个页的数据(即第2页,因为一个页大小为2k),所以将地址传入认为 
    第一周期应该发送:A0-A7 —>00 
    第二周期应该发送:A8-A11 —>00 
    第三周期应该发送:A12-A19 —>01 
    第四周期应该发送:A20-A27—->00 
    第五周期应该发送:A28———>00 
    这里写图片描述
    即上图中错误认为的情况,因为在我们的角度看来,是不存在A11的,所以应该是图中下面表示正确的情况(黄色为4096的2进制),或许说到这里大家还是似懂非懂,那我们在简单一点,比如从2049这个地址上取数据,在我们看来,应该是从第1页开始取数据,但是站在nandflash发送地址周期的角度上看,其实是访问第0页的地址(因为有A11为1,即访问64Bytes的范围),也就是说如果把2049严格按照发送周期送地址的话其实访问的是第0页64Bytes范围中了,这不是我们所希望的,所以我们要把2049这个地址变成第1页开始的地方,怎么办呢?将A11位至0,之后向后串一位即可.上图可以慢慢体会 
    总结: 
    此 Nand Flash 地址周期共有 5 个,2 个列(Column),3个行(Row)周期,而对于对应地,我们可以看出,实际上,列地址 A0~A10,就是页内陆址,地址范围是从0 到2047,而对出的 A11,理论上可以表示 2048~4095,但是实际上,我们最多也只用到了2048~2011, 用于表示页内的oob区域,其大小是 64 字节。对应地,A12~A28,称作页号,页的号码,可以定位到具体是哪一个页。而其中,A18~A28,表示对应的块号,即属于哪个块。
  1. 我们写程序发送地址的时候是这样写的:
  2. ..........
  3. unsigned int col_add = addr & 0x7ff; //A0-->A10(column Address)
  4. unsigned int raw_add = (addr >> 11)&0x1ffff; //A11-->A28(页索引)
  5. NFADDR = col_add & 0xff; //A0-A7 8
  6. NFADDR = (col_add >> 8) & 0x7; //a11为0 A8-A11 3位
  7. NFADDR = raw_add & 0xff;
  8. NFADDR = (raw_add >> 8) & 0xff;
  9. NFADDR = (raw_add >> 16) & 0x1;
  10. .....
  11. ..
  •  

在这里有些人感觉很奇怪,表格里rows明明是从A12开始的可是程序里raw_add= (addr >> 11)&0x1ffff,只向由移11位,不是应该addr >> 12吗? 
最关键的地方到了,你别忘了,我们在存放数据的时候,数据里面不包括ECC信息,也就是说在我们自己看来nandflash页大小就是2K。比如说我往nand的0x0地址存了0x800(2KB)大小数据,接下来,如果我们再存数据就继续从0x800的地址开始存,在这里你跳过前一页的ECC部分了吗?很明显没有,理论上前一页占了0x1000(4KB)大小,我们应该从0x1000开始存接下的数据,可是,我们实际上不会这么干,我们忽略ECC占的空间,我们认为一页大小就是2KB。

所以在我们看来nandflash地址就是这样的: 
nand地址=(rows:A27-A11)(columns:A10-A0) 
接受到地址后,在发送地址时,我们是这么干的,把A0-A10取出来,再添上一位A11=0,,然后把A11-A27取出来,对应A12-A28发过去,这样就实现了在发送地址时跳过每一页的ECC部分,但在用户看来每一页大小还是2KB,这里有些绕,但是好好想一想还是能想清楚的。实在理解不了可以这么想,地址2049,应该是第1页开始地址,如果要访问第1页开始的地址,那么地址如何发?所以转换关系为: 2096—>第1页开始—>转换为5个周期地址

  • 关于nandflash的写擦除时序,与读的过程都大同小异,这里贴出datasheet中写时序,擦除时序图,方便以后查阅
  • 写时序 
    这里写图片描述
    可以看到除了命令之外,其余与读时序基本差不多
  • 擦除block时序 
    这里写图片描述 
    如图可知,擦除的时序以block为单位,发送的地址 Row Add1后的三个地址

转自:https://blog.csdn.net/mxgsgtc/article/details/72272932

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多