第016课 Nand Flash操作原理及裸机程序分析

2020-03-24来源: eefocus关键字:Nand  Flash  操作原理  裸机程序

第001节_NAND_FLASH操作原理

这里写图片描述

NAND FLASH原理图 

NAND FLASH是一个存储芯片 

那么: 这样的操作很合理”读地址A的数据,把数据B写到地址A”


问1. 原理图上NAND FLASH和S3C2440之间只有数据线,怎么传输地址? 

答1.在DATA0~DATA7上既传输数据,又传输地址当ALE为高电平时传输的是地址,


那么在数据线上是不是只传输数据和只传输地址呢?


我们参考NAND FLASH的芯片手册可以知道,对NAND FLASH的操作还需要发出命令,下面有个NAND FLASH的命令表格 

这里写图片描述

问2. 从NAND FLASH芯片手册可知,要操作NAND FLASH需要先发出命令怎么传入命令?


答2.在DATA0~DATA7上既传输数据,又传输地址,也传输命令:


当ALE为高电平时传输的是地址。


当CLE为高电平时传输的是命令。


当ALE和CLE都为低电平时传输的是数据。


问3. 数据线既接到NAND FLASH,也接到NOR FLASH,还接到SDRAM、DM9000等等 

那么怎么避免干扰?


答3. 这些设备,要访问之必须”选中”,没有选中的芯片不会工作,相当于没接一样。


问4. 假设烧写NAND FLASH,把命令、地址、数据发给它之后,NAND FLASH肯定不可能瞬间完成烧写的,怎么判断烧写完成?


答4. 通过状态引脚RnB来判断:它为高电平表示就绪,它为低电平表示正忙


问5. 怎么操作NAND FLASH呢?


答5. 根据NAND FLASH的芯片手册,一般的过程是:


发出命令


发出地址


发出数据/读数据


看上面的命令表格,不容易看,我们看一下读ID的时序图, 

这里写图片描述

每个NAND FLASH都内嵌一些ID(譬如:厂家ID,设备ID),时序图从左往右看,纵向放是一列一列的看。


对于我们s3c2440来说,内部集成了一个NAND FLASH控制器,2440和外设连接的简易图,如下图所示 

这里写图片描述

NAND FLASH控制器,帮我们简化了对NAND FLASH的操作,下面来分析一下不使用NAND FLASH控制器和使用NAND FLASH控制器对外设NAND FLASH的操作。


发命令:

image.png

发地址:

image.png

发数据:

image.png

读数据 :

image.png


用UBOOT来体验NAND FLASH的操作:

  1. 读ID


image.png

下图是读操作时序图 
这里写图片描述


对于存储为256M的NAND FLASH,需要28条地址线,来表示这个地址值,根据原理图可以,只用8根地址线,所以需要4个周期的地址,为了兼容更大容量的NAND FLASH,要发出5个周期的地址:

2,读数据

image.png

第002节_NandFlash时序及初始化

image.png


AND FLASH控制器的时序,是为了让NAND FLASH外设工作起来,假如外接不同的 

NAND FLASH外设,那么它的操作时序可能就会不同,所以NAND FLASH控制器发出 

的时序图,就是不一样的,所以我们根据NAND FLASH外设来设置NAND FLASH控制器, 

这里写图片描述

NAND FLASH时序图,如下所示: 

这里写图片描述
这里写图片描述
这里写图片描述

我们在汇编语言中已经设置HCLK为100MHZ,一个周期T = 1000/100 = 10s,通过上面三个图可以知道:TACLS的值可以为0;TWRPH0的值可以为1;TWRPH1的值可以为0。 
这里写图片描述

所以NFCONF寄存器设置如下:


#define  TACLS   0

#define  TWRPH0  1

#define  TWRPH1  0

/*设置NAND FLASH的时序*/

NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);


到此设置NAND FLASH的时序已经设置完了,我们接着来使能,使能实在NFCONT。 

这里写图片描述
MODE [0]: 设置为1,使能NAND FLASH。

Reg_nCE [1]: 设置为1,禁止片选。因为我们现在还没有使用。为例错误的操作。

InitECC [4]: 初始化ECC的编码器,后边要使用,我们设置为1,来初始化。

所以NFCONF寄存器设置如下:

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



第003节_NandFlash的芯片id读取

上节课我们讲解了NAND FLASH的初始化,这节课我们来讲解读取NAND FLASH的ID, 
我们可以参考NAND FLASHh的芯片手册,如下图所示:(NAND FLASH读操作时序图) 
这里写图片描述



我们一般先操作片选使能,只有片选使能之后才能进行后边的操作,片选是能代码如下:


void nand_select(void)

{

    /*使能片选*/

    NFCONT &=~(1<<1);

}


有使能片选,一定有禁止片选,禁止片选的代码如下:


void nand_deselect(void)

{

    /*禁止片选*/

    NFCONT |= (1<<1);

}


读ID的操作时序图,如下所示 

这里写图片描述

我们按照从左往右的时间点,来分析,片选信号像一个总开关,只有使能了片选信号,后续的操作才会有意义,我们使能片选信号之后,片选引脚nCE后续一直为低电平,在前面的命令时序图中知道tCLS和tWP最小的时间参数都是12us,就表明CLE和nWE这两个信号可以同时发出,就表示要命令了,对于写什么命令,就要看数据总线上要发送的命令了,当CLE从高电平变为低电平后,表示上次的写操作已经结束了。


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


发命令后,后面就需要发送地址了,当nWE和ALE有效的时候,表示写地址,上图中,要写入的地址是0x00,当ALE从高电平变为低电平的时候,表示写地址结束,我们可以简化为:往NFADDR寄存器中写值就可以了,比如:NFADDR=0x00。


下面我们写代码:发命令的函数,和发地址的函数代码如下:


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++);

}


接下来就可以读取数据了,数据可以直接通过读取NFDATA寄存器里面数据来获得数据,根据时序图,是读5个字节的数据,代码如下:


unsigned char nand_data(void)

{

    return  NFDATA;

}


读芯片ID之前先打开片选, 读取芯片ID函数,代码如下:


void nand_chip_id(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%xnr",buf[0]);

    printf("device  id  = 0x%xnr",buf[1]);    

    printf("3rd byte    = 0x%xnr",buf[2]);        

    printf("4th byte    = 0x%xnr",buf[3]);            

    printf("page  size  = %d kbnr",1  <<  (buf[3] & 0x03));   

    printf("block size  = %d kbnr",64 << ((buf[3] >> 4) & 0x03)); 

    printf("5th byte    = 0x%xnr",buf[4]);

}


下面我们再写一个打印菜单的函数,在菜单中调用读取芯片ID的函数,代码如下


oid nand_flash_test(void)

{

    char c;


    while (1)

    {

        /* 打印菜单, 供我们选择测试内容 */

        printf("[s] Scan nand flashnr");

        printf("[e] Erase nand flashnr");

        printf("[w] Write nand flashnr");

        printf("[r] Read nand flashnr");

        printf("[q] quitnr");

        printf("Enter selection: ");


        c = getchar();

        printf("%cnr", c);


        /* 测试内容:

         * 1. 识别nand flash

         * 2. 擦除nand flash某个扇区

         * 3. 编写某个地址

         * 4. 读某个地址

         */

        switch (c)       

        {

            case 'q':

            case 'Q':

                return;

                break;


            case 's':

            case 'S':

                nand_chip_id();

                break;


            case 'e':

            case 'E':

                break;


            case 'w':

            case 'W':

                break;


            case 'r':

            case 'R':

                break;

            default:

                break;

        }

    }

}


在主函数中调用nand flash的初始化函数,和nand flash的测试函数。


int main(void)

{

    led_init();

    //interrupt_init();  /* 初始化中断控制器 */

    key_eint_init();   /* 初始化按键, 设为中断源 */

    //timer_init();


    puts("nrg_A = ");

    printHex(g_A);

    puts("nr");


    //nor_flash_test();

nand_ini

[1] [2] [3]
关键字:Nand  Flash  操作原理  裸机程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492474.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:第015课 NOR Flash操作原理及裸机程序分析
下一篇:第017课 LCD原理详解及裸机程序分析

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

TX2440 ARM开发板Uboot移植(三、添加Nand Flash的有关操作支持)
在上一节中我们说过,通常在嵌入式bootloader中,有两种方式来引导启动内核:从Nor Flash启动和从Nand Flash启动,但不管是从Nor启动或者从Nand启动,进入第二阶段以后,两者的执行流程是相同的。当u-boot的start.S运行到“_start_armboot: .word start_armboot”时,就会调用lib_arm/board.c中的start_armboot函数,至此u-boot正式进入第二阶段。此时注意:以前较早的u-boot版本进入第二阶段后,对Nand Flash的支持有新旧两套代码,新代码在drivers/nand目录下,旧代码在drivers/nand_legacy目录
发表于 2020-03-10
Arm 2440——Nand flash启动模式详解(LED程序为例)
断断续续的研究arm也有2个月了,现在才感觉理解了arm在Nand flash模式下的启动过程,现在来这里记录下来以表达我无比喜悦的心情。闲话少说,趁着还没有忘记学习过程中的感受,直接进入正题。大家都知道,arm在Nand flash启动模式下启动时系统会将Nand flash中的前4KB代码拷贝到SRAM(也就是Steppingstone中),由SRAM配置中断向量表和完成Nand flash访问的必要初始化,然后将Nand flash中的全部程序代码拷贝到SDRAM中,最后由SRAM跳转到SDRAM,然后程序就正常执行了,这一过程看上去很简单,但是真正理解这一过程还是不简单的,尽管这样,还是想告诉大家仔细理解还是比较容易理解
发表于 2020-03-10
【ARM裸板】Nand Flash基础与时序分析
1.硬件知识1.1 如何传输地址信号?DATA0 ~ DATA7上既传输数据,又传输地址(复用)ALE (Address Lock Enable)地址锁存允许信号当ALE = 1时,传输地址当ALE = 0时,传输数据1.2 如何传输命令?命令表由NAND FLASH芯片手册可知,要操作NAND FLASH需要先发出命令DATA0 ~ DATA7上既传输数据,又传输地址,也传输命令CLE (Command Lock Enable)地址锁存允许信号当ALE = 1时,传输地址当CLE = 1时,传输命令当ALE = 0 & CLE = 0时,传输数据1.3.NAND、NOR、SDRAM、DM900数据总线,如何互不
发表于 2020-03-05
【ARM裸板】Nand Flash基础与时序分析
【ARM裸板】Nand Flash编程
1.读芯片ID1.1 读芯片ID时序简化为4个步骤:1.使能片选2.写命令0x903.写地址0x004.读ID信息/* 识别NAND FLASH */void scan_nand_flash(void){   int i;   //保存读取ID信息的数组   unsigned char id_info[5] = {0};   nand_enable_cs();//使能CS   nand_write_cmd(0x90);   nand_write_addr(0x00);   for(i
发表于 2020-03-05
【ARM裸板】Nand Flash编程
NAND闪存Q4出货量环比增长近10% 营收增至125.5亿美元
据国外媒体报道,NAND闪存芯片去年第四季度的出货量环比有明显增长,整体行业的营收也有提升。 从外媒的报道来看,NAND闪存去年第四季度的出货量,较第三季度增长了近10%,NAND闪存行业的收入则是环比增长约8.5%,达到了125.5亿美元。 NAND闪存去年第四季度的出货量和收入环比增长近10%,主要是由于数据中心的需求增加,芯片供应商也得以将库存降至正常水平。 对于2020年的第一季度,外媒预计NAND闪存的出货量将环比下滑或者持平,但价格可能会有上涨,有望抵消出货量下滑的影响。在收入方面,外媒是预计至少能与上一季度持平。 
发表于 2020-02-26
铠侠半导体,估计NAND位错误率新方法
       前不久铠侠(原称东芝存储)半导体公司已研发出采用堆叠112层的3D NAND Flash产品,与目前96层的3D NAND产品相比,此次新产品的单位面积记忆容量提高约20%,除了巩固和扩大SSD,PC,智能手机市场外,还将抢占5G、人工智能、自动驾驶等新市场需求。NAND Flash是目前闪存中最主要的产品,具备非易失,高密度,低成本的优势,其阵列内部包含由晶体管构成的行列单元。在利用NAND进行读写,即对芯片内部编程操作时,需要将电压脉冲施加到正在编程的晶体管,并将电荷注入到晶体管的栅极内部。当使用最大电压脉冲数目后,实际获取的编程电压仍未达到要求电压,则对芯片编程失败
发表于 2020-02-24
铠侠半导体,估计NAND位错误率新方法
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved