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


    平台: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控制器做了初始化,代码如下图

  • 相关阅读:
    android xml属性大全
    Activity 中传递数据
    android 界面布局 很好的一篇总结
    Android基础类之BaseAdapter
    自定义android的tab样式
    android之Uri的常用几个例子
    我的第一篇博客
    [解题报告]272 TEX Quotes
    [解题报告]10071 Back to High School Physics
    [解题报告]113 Power of Cryptography
  • 原文地址:https://www.cnblogs.com/tinyfeather/p/3260466.html
Copyright © 2020-2023  润新知