nandflash的读写(2440)

2019-12-03来源: eefocus关键字:nandflash  读写  2440

说明:

根据物理结构上的区别 , NandFlash主要分为如下两类:
1)•SLC (Single Level Cell): 单层式存储
2)•MLC (Multi Level Cell): 多层式存储
@:SLC在存储格上只存一位数据, 而MLC则存放两位数据。


1.nand.c

#define NFCONF (*(volatile unsigned long*)0x4E000000)
#define NFCONT (*(volatile unsigned long*)0x4E000004)
#define NFCMD  (*(volatile unsigned char*)0x4E000008)
#define NFADDR (*(volatile unsigned char*)0x4E00000C)
#define NFDATA (*(volatile unsigned char*)0x4E000010)
#define NFSTAT (*(volatile unsigned char*)0x4E000020)

#define TACLS 1
#define TWRPH0 2
#define TWRPH1 1


void select_chip()
{
    NFCONT &= ~(1<<1);    
}

void deselect_chip()
{
    NFCONT |= (1<<1);    
}

void clear_RnB()
{
   NFSTAT |= (1<<2); 
}

void send_cmd(unsigned cmd)
{
     NFCMD = cmd;
}

void send_addr(unsigned addr)
{
     NFADDR = addr;
}

void wait_RnB()
{
   while (!(NFSTAT&(1<<2)))    
   {
       ;    
   }
}

void nand_reset()
{
    //选中flash
    select_chip();
    
    //清除RnB
    clear_RnB();
    
    
    //发送0xff命令
    send_cmd(0xff);
    
    
    //等待RnB
    wait_RnB();
    
    
    //取消选中flash
    deselect_chip();
}

void nandflash_init()
{
    //初始化NFCONF
    NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);
    
    //初始化NFCONT
    NFCONT = (1<<0) | (1<<1);
    
    //复位
    nand_reset();    
}

void NF_PageRead(unsigned long addr,unsigned char* buff)
{
    int i;
    
    //选中nandflash芯片
    select_chip();
    
    //清除RnB
    clear_RnB();
    
    //发送命令0x00
    send_cmd(0x00);
    
    //发送列地址
    send_addr(0x00);
    send_addr(0x00);
    
    //发送行地址
    send_addr(addr&0xff);
    send_addr((addr>>8)&0xff);
    send_addr((addr>>16)&0xff);
    
    //发送命令0x30
    send_cmd(0x30);
    
    //等待RnB
    wait_RnB();
    
    //读取数据
    for(i=0;i<2048;i++)
    {
       buff[i] = NFDATA;      
    }
    
    //取消选中nandflash芯片
    deselect_chip();
}


void nand_to_ram(unsigned long start_addr, unsigned char* sdram_addr, int size)
{
     int i;
     
    for( i=(start_addr >>11); size>0;)
    {
        NF_PageRead(i,sdram_addr);    
        size -= 2048;
        sdram_addr += 2048;
        i++;
    }
}

int NF_Erase(unsigned long addr)
{
    int ret;
    
  //选中flash芯片
    select_chip();
    
    //清除RnB
    clear_RnB();
    
    //发送命令0x60
    send_cmd(0x60);
    
    //发送行地址
    send_addr(addr&0xff);
    send_addr((addr>>8)&0xff);
    send_addr((addr>>16)&0xff);
    
    //发送命令D0
    send_cmd(0xD0);
    
    //等待RnB
    wait_RnB();
    
    //发送命令0x70
    send_cmd(0x70);
    
    //读取擦除结果
    ret = NFDATA;
    
    //取消选中flash芯片
    deselect_chip();
    
    return ret;
    
}

int NF_WritePage(unsigned long addr,unsigned char *buff)
{
    unsigned int i,ret = 0;
    //选中nandflash
    select_chip();
    
    //清除RnB
    clear_RnB();
    
    //发送0x80命令
    send_cmd(0x80);
    
    //发送2个列地址
    send_addr(0x00);
    send_addr(0x00);
    
    //发送3个行地址
    send_addr(addr&0xff);
    send_addr((addr>>8)&0xff);
    send_addr((addr>>16)&0xff);
    
    //发送数据
        for(i=0;i<2048;i++)
    {
       NFDATA = buff[i];      
    }
    
    //发送0x10命令
    send_cmd(0x10);
    
    //等待RnB
    wait_RnB();
    
    //发送0x70命令
    send_cmd(0x70);
    
    //读取写入结果
    ret = NFDATA;
    
    //关闭nandflash
    deselect_chip();
     return ret;
    
}

2.uart.c

#define GPHCON (*(volatile unsigned long*)0x56000070)
#define ULCON0 (*(volatile unsigned long*)0x50000000)
#define UCON0  (*(volatile unsigned long*)0x50000004)
#define UBRDIV0  (*(volatile unsigned long*)0x50000028)
#define UTRSTAT0 (*(volatile unsigned long*)0x50000010)
#define UTXH0 (*(volatile unsigned long*)0x50000020)
#define URXH0 (*(volatile unsigned long*)0x50000024)

#define PCLK 50000000
#define BAUD 115200

void uart_init()
{
    //1.配置引脚功能
    GPHCON &= ~(0xf<<4);
    GPHCON |= (0xa<<4);
    
    //2.1 设置数据格式
    ULCON0 = 0b11;
    
    //2.2 设置工作模式
    UCON0 = 0b0101; 
    
    //3. 设置波特率    
    UBRDIV0 =(int)(PCLK/(BAUD*16)-1);
}


void putc(unsigned char ch)
{
    while (!(UTRSTAT0 & (1<<1)));
    UTXH0 = ch;  
}


unsigned char getc(void)
{
    unsigned char ret;

    while (!(UTRSTAT0 & (1<<0)));
    // 取数据
    ret = URXH0;  
    
    if ( (ret == 0x0d) || (ret == 0x0a) )
    {
        putc(0x0d);
        putc(0x0a);    
    }          
    else
        putc(ret);
        
        return ret;
}

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

上一篇:ARM-汇编指令集(总结)
下一篇:ARM详细指令集

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

推荐阅读

STM32F103的FSMC读写NANDFlash的学习
1. STM32的FSMC接口可以控制外部的NANDFlash,因此学习下,先看下硬件电路,地址线是A16.A17,数据线D0-D7,那么映射的地址空间是多少?D0是数据/地址线,两个用途。2. 引脚图,现在关心的是,这个NAND的地址映射的地址空间是多少?3. 看下STM32的手册。4. 看下代码,STM32的库基本都封装好的函数,直接调用即可,函数名字一看就明白,还是回到原来的问题,划分的地址空间是多少?代码为我们划分ZONE,Block, Page,封装了底层的地址,一块nand flash也分为若干block,每个block分为如干page。一般而言,block、page之间的关系随着芯片的不同而不同。需要
发表于 2018-07-23
2018年NAND Flash价格有望缩减10%-20%
  TrendForce研究指出,明年上半年步入淡季,NANDFlash价格有机会走跌,下半年需求回升,可能再次供不应求,预估2018年NANDFlashASP(平均销售单价)将较2017年缩减10%-20%。下面就随网络通信小编一起来了解一下相关内容吧。  相对而言,TrendForce预计,2018年DRAM产能扩增效益有限,价格趋势与供给状况持续看涨、看紧。  TrendForce表示,就移动存储来看,智能手机应用的存储零组件价格从2016年第三季开始不断攀升,以主流规格而言,到今年第四季价格平均上升40%,不仅影响各大品牌在智能手机的获利表现,连带影响品牌厂对于存储规格及容量提升的意愿。  展望2018年,智能手机
发表于 2017-12-12
STM32-FSMC-NANDFLASH
STM32 FSMC 支持两个NAND闪存块,支持硬件ECC并可检测多达8K字节数据其地址映射如下图所示图161  FSMC存储块NAND和PC卡地址映射表88  存储器映像和时序寄存器 对于NAND闪存存储器,通用和属性空间又可以在低256K字节部分划分为3个区(见表89)●  数据区(通用/属性空间的前64K字节区域)●  命令区(通用/属性空间的第2个64K字节区域)●  地址区(通用/属性空间的第2个128K字节区域)表89  NAND存储块选择 应用软件使用这3个区访问NAND闪存存储器:●  发送命令到NAND闪存存储器:软件只
发表于 2017-11-22
STM32-FSMC-NANDFLASH
东芝产能出现大幅损失纯属谣言,对第四季供货影响有限
所产生的影响,以维护其客户权益。  第四季NANDFlash产能明显增加,供需转趋平衡  陈玠玮表示,我们对于市场后续看法仍不变,即NANDFlash第四季供货虽然仍短缺,但供货缺口将小于第三季,意即市场将逐步转趋供需平衡。背后原因在于非三星阵营3D产能逐步开出,再加上需求端苹果新机因iPhoneX上市销售日期较原先预期晚,导致部分拉货需求递延至明年第一季,使市场需求低于原先预期。  虽然东芝阵营第四季生产产线遭遇到一些问题,让整体产出量出现小幅下滑,但因为影响程度并不如外界所传严重,所以市场整体产出量仍较第三季明显增加。此外,渠道市场需求仍不佳,除非未来产品售价下滑,以及供货更加稳定,预期需求状况才会好转。  观察明年供需状况
发表于 2017-10-17
兆易创新24nm NANDFlash进展显著,上半年净利润增幅100%
集微网消息,中国集成电路产业在2017年上半年表现亮眼,保持快速增长,其中北京兆易创新科技股份有限公司(以下简称“兆易创新”)除了营收利润大涨外,产品线也有不错的进展。今年上半年,兆易创新针对物联网(IoT)市场,推出了超低功耗的NORFlash产品;适用性广泛的1.65V~3.6V宽电源电压NORFlash产品实现量产;适用车载和高性能市场,支持DDR接口的高速度传输速率NORFlash研发成功并量产;同时增加对高容量产品的研发,自研的SLCNANDFlash实现量产。8月27日,兆易创新发布2017上半年财报,财报显示,上半年实现营业收入9.39亿元,同比增长43.29%;归属于上市公司股东的净利润1.79亿元,同比增长
发表于 2017-08-28
STM8S存储器的读写操作
/************************************************************************************************************************************ Name    : STM8S存储器的读写操作* Author  : MingMing* Release : 2014/1/2* Update  : 2014/1/2* E-mail  : clint.wang@foxmail.com
发表于 2019-12-05
小广播
何立民专栏 单片机及嵌入式宝典

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

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