zoukankan      html  css  js  c++  java
  • s3c2440裸机-nandflash编程(三. 初始化及识别)

    nandFlash命令表

    对NAND FLASH的操作需要发出命令,下面有个NAND FLASH的命令表格,那么我们可以此表格上的命令来访问我们的nandflash.

    1)时序分析

    上面命令表中的读id还不太直观,下图是从nand芯片手册中截取出的读id时序图:

    ①第一条竖线位置,发送了nCE,CLE,nWE信号,所以90命令被锁存(readID命令);

    ②第二条竖线位置,发送了nCE,ALE,nWE信号,所以地址00被锁存;

    继续往后,命令、地址都发完了,要read数据了,所以释放nWE,ALE,这里tAR表示ALE释放多久后才可以发送nRE信号,tREA表示nRE信号的建立时间;

    ③第三条竖线位置,发送了nCE,nRE信号,所以数据被锁存,第一个访问周期锁存的数据为marker code,值为0xEC,第二个访问周期的数据为device code,值为0xDA。读id时读5个周期含义对应如下表:

    该款nandflash的5个周期读出来的值对应如下:

    第四个访问周期含义如下表:

    第五个访问周期含义如下表:

    根据第4、5个访问周期的结果0x15、0x44我们得知该flash的block_size=128K,page_size=2k, 有2个plane,plane_size=1Gb = 128M, 共256M。

    2)初始化

    nand控制器要按照我们nandflash的实际型号和性能来设置初始值。

    NFCONF(nand配置寄存器)

    前面一节nand控制器和访问时序分析了TACLS = max(tCLS,tALS) - tWP,我们得知tCLS、tALS、tWP最小都可以取到12ns, 所以我们可以取TACLS=0;

    TWRPH0 = tWP,我们的nand手册上要求tWP最少12ns, 那么取TWRPH0 =1, Duration = HCLK*(TWRPH0+1)=20ns>12ns,满足要求;

    TWRPH0 = max(tCLH,tALH), 我们的nand手册上要求tCLH、tALH最少5ns, 那么取TWRPH1 =0, Duration = HCLK*(TWRPH1+1)=10ns>5ns,满足要求。

    再配置BusWidth总线位宽为8bit;
    所以NFCONF寄存器设置如下:

    #define  TACLS   0
    #define  TWRPH0  1
    #define  TWRPH1  0
    /*设置NAND FLASH的时序*/
    NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);
    

    NFCONT控制寄存器(nand控制寄存器)


    MODE [0]: 设置为1,使能NAND控制器。
    Reg_nCE [1]: 设置为1,禁止片选(等要使用的时候再使能片选信号)
    

    所以NFCONF寄存器设置如下:

    /*使能NAND FLASH控制器,禁止片选*/
    NFCONT = (1<<1) | (1<<0);
    

    3)识别nandflash

    NFCMMD(nand命令寄存器)

    我们可以使用2440上的NAND FLASH控制器简化操作,只需要往NFCMMD寄存器写入要传输的命令就可以了,NAND FLASH控制器默认把上面复杂的时序发出来。

    NFADDR(nand地址寄存器)


    发命令后,后面就需要发送地址了,当nWE和ALE有效的时候,表示锁存的是地址,往NFADDR寄存器中写值就可以了,比如:NFADDR=0x00。
    我们得知地址需要用5个周期来发送,前2个周期为col地址,后三个周期为row(page)地址。上一节nand控制器和访问时序已详细分析过了命令、地址、数据锁存时序过程。

      ① column:列地址A0~A10,就是页内地址,地址范围是从0到2047。(A11用来确定oob的地址,即2048-2111这64个字节的范围)
      ② page:A12~A30,称作页号,page(row)编号。
    

    NFDATA(nand数据寄存器)

    当命令、地址都发送完后就可以从数据总线上DATA[7:0]获取数据或者写入数据。同样往NFDATA寄存器中写值或者读值就可以了,如unsigned char buf=NFDATA,由于是数据位宽是8位的,所以访问时数据组织形式如下:

    从上图可以看出,当byte access时,只需一个时钟周期;当wold access的时候,需要4个时钟周期,小端模式下第一个时钟周期对应低字节,第四个时钟周期对应高字节。

    识别nandflash代码如下:

    /*初始化nand控制器*/
    void nand_init(void)
    {
    	#define  TACLS   0
    	#define  TWRPH0  1
    	#define  TWRPH1  0
    	NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);
    
    	NFCONT = (1<<1) | (1<<0);
    }
    
    /*使能片选*/
    void nand_select(void)
    {		
    	NFCONT &=~(1<<1);
    }
    /*禁止片选*/
    void nand_deselect(void)
    {
    	NFCONT |= (1<<1);
    }
    /*发命令*/
    void nand_cmd(unsigned char cmd)
    {
    	volatile int i;
    	NFCCMD = cmd;
    	for(i=0; i<10; i++);
    }
    /*发地址*/
    void nand_addr_byte(unsigned char addr)
    {
    	volatile int i;
    	NFADDR = addr;
    	for(i=0; i<10; i++);
    }
      /*读数据*/
      unsigned char nand_data(void)
      {
          return	NFDATA;
      }
    /*识别nandflash*/
    void nand_chip_probe(void)
    { 
    	unsigned char buf[5]={0};
    	
    	nand_select(); 
    	nand_cmd(0x90);
    	nand_addr_byte(0x00);
    
    	buf[0] = nand_data();
    	buf[1] = nand_data();	
    	buf[2] = nand_data();
    	buf[3] = nand_data();
    	buf[4] = nand_data();	
    	nand_deselect(); 	
    
    	printf("maker   id  = 0x%x
    
    ",buf[0]);
    	printf("device  id  = 0x%x
    
    ",buf[1]);	
    	printf("3rd byte    = 0x%x
    
    ",buf[2]);		
    	printf("4th byte    = 0x%x
    
    ",buf[3]);			
    	printf("page  size  = %d kb
    
    ",1  <<  (buf[3] & 0x03));	
    	printf("block size  = %d kb
    
    ",64 << ((buf[3] >> 4) & 0x03));	
    	printf("5th byte    = 0x%x
    
    ",buf[4]);
    }
    

    坏块初始化

    https://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html#ref.linux_mtd

  • 相关阅读:
    Luogu 4841 城市规划
    Luogu 4721 【模板】分治 FFT
    Luogu 4091 [HEOI2016/TJOI2016]求和
    Luogu 3723 [AH2017/HNOI2017]礼物
    FFT笔记
    Luogu 4900 食堂
    Luogu 4155 [SCOI2015]国旗计划
    Luogu 4069 [SDOI2016]游戏
    Luogu 4254 [JSOI2008]Blue Mary开公司
    Luogu 4251 [SCOI2015]小凸玩矩阵
  • 原文地址:https://www.cnblogs.com/fuzidage/p/13053882.html
Copyright © 2011-2022 走看看