nandflash的读写(2440)

发布者:中和子最新更新时间:2019-12-03 来源: eefocus关键字:nandflash  读写 手机看文章 扫描二维码
随时随地手机看文章

说明:

根据物理结构上的区别 , 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  读写 引用地址:nandflash的读写(2440)

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

推荐阅读最新更新时间:2024-11-09 19:35

S3C2440A之ARM学习的所有的问题
正文: 问题1:关于Nor/Nand启动判断的问题: 视频讲解是用写0到 ,取出还是0则Nand启动,视频例程: mov r1, 0 ldr r0, str r1, ldr r2, cmp r1, r2 //如果r1 != r2, nor启动 ldr sp, =0x40000000 + 4096 //如果r1 == r2, nand启动 moveq sp, #4096 streq r0, 如果:拨码开关为Nor启动,Norflash 地址中数据原本 即为0,Nor启动不能写入,但cmp r1, r2时,r1==r2依然 成立,系统是否会判断为Nand启动?有没有影响?怎么判断? 答:1 【传说】hceng(13
[单片机]
S3C<font color='red'>2440</font>A之ARM学习的所有的问题
STM32HAL内部EEPROM读写L151
简单生成代码后找到MDK的驱动文件 官方建议步骤 #####数据EEPROM编程功能##### =============================================================================== 擦除或编程的任何操作都应遵循以下步骤: (#)调用@ref HAL_FLASHEx_DATAEEPROM_Unlock()函数启用数据EEPROM访问 和Flash程序擦除控制寄存器访问。 (#)调用所需的功能来擦除或编程数据。 (#)调用@ref HAL_FLASHEx_DATAEEPROM_Lock()来禁用数据EEPROM访问 和Flash程
[单片机]
S3C2440裸机------异常与中断__CPU的工作模式和状态以及寄存器
1.CPU工作模式(Mode) ARM CPU有七种模式,各种模式如下图所示。注意用户模式下不可进入其他模式,用户模式是在有操作系统的时候给应用程序使用的,写应用程序的人水平千差万别,不能保证写的程序是好是坏,所以让应用程序运行在用户模式,限制应用程序的权限,防止破坏整个系统, 2.状态(State) ARM架构的CPU有ARM state和Thumb state, ARM State:用的是ARM指令集,每个指令占据4 byte, Thumb State:用的是Thumb指令集,每个指令2 byte. 比如对于同样的一条指令,MOV R0,R1 对于ARM指令集就要占据四个字节,对于Thumb指令集占据两个字节
[单片机]
S3C<font color='red'>2440</font>裸机------异常与中断__CPU的工作模式和状态以及寄存器
mini2440简单的lcd显示驱动程序
这几天学习了一下lcd显示原理和Linux内核的framebuffer类型的设备驱动框架,值得学习的是内核中对驱动的分层概念,fbmem.c中实现了对framebuffer的共性的抽象,lcd驱动其实就是设置lcd控制器的工作方式,然后对显存进行读写,对显存的操作其实不管什么lcd,都是差不多的,所以这些相似的操作都抽取到了内核的fbmem.c里面,实现驱动的时候只需要填充fb_info结构体,把lcd硬件相关的参数填入该结构体中,然后用register_framebuffer函数进行注册,该函数会根据自动生成设备节点,就是/dev/fb0, /dev/fb1等等,对于显存的读写函数就用内核已经实现的默认的cfb_fillrect
[单片机]
mini<font color='red'>2440</font>简单的lcd显示驱动程序
十四、s3c2440裸机—中断控制器
14.1 中断体系 ARM 体系的CPU 有 7 种工作模式 用户模式(usr):ARM 处理器正常的程序执行状态 快速中断模式(fiq):用于高速数据传输或通道处理 中断模式(irq):用户通用的中断处理   管理模式(svc):操作系统使用的保护模式 数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护 系统模式(sys):运行具有特权的操作系统任务 未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真   可通过软件来进行模式切换,或者发生各类中断、异常时CPU自动进入相应的模式。除用户模式外,其他6种工作模式都属于特权模式,
[单片机]
十四、s3c<font color='red'>2440</font>裸机—中断控制器
STM32CubeMX的SDIO模式下对SD卡读写测试
1.问题描述:使用STM32CubeMX,配置SDIO的4bit模式,对SD卡进行读写测试。 2.准备工作: 软件版本:STM32CubeMX–4.22.0 ;KEIL5 硬件平台:原子战舰V3 (1)软件设置: I. SDIO选择,这里选择4bits模式,实际选1bits也可以。 II. 时钟树配置 III. SDIO模式时钟分频设置,其他默认。 其他详细配置请自行打开源码压缩包里的MP3_Test.ioc查看。 (2)Keil工程测试代码: 测试代码参考硬石的HAL库例程,其资料下载地址在最下方。 I.首先是测试要用到的宏定义及变量的声明。 II.接下来是对主函数代码的添加与修改。 III.主要代码段修
[单片机]
【51单片机快速入门指南】4.1: I2C 与 AT24C02 (EEPROM) 的跨页连续读写
普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《普中 51 单片机开发攻略》、《24C02/24C04/24C08/24C16/24C32/24C64芯片手册》 AT24Cxx 介绍 AT24C01/02/04/08/16…是一个1K/2K/4K/8K/16K 位串行 CMOS,内部含有 128/256/512/1024/2048 个 8 位字节,AT24C01 有一个 8 字节页写缓冲器, AT24C02/04/08/16 有一个 16 字节页写缓冲器。该器件通过 I2C
[单片机]
【51单片机快速入门指南】4.1: I2C 与 AT24C02 (EEPROM) 的跨页连续<font color='red'>读写</font>
单片机模拟I2C总线控制EEPROM读写程序
之前写的EEPROM程序虽然能够软仿成功,但烧到单片机里的时候却不能用,无疑是时序的问题,今天修正了时序,总算硬仿成功了。对照上次的程序可以发现就是添加了头函数: intrins.h ,这样就可以通过 _nop_() 指令较为准确的控制时序。 上次那个问题依然没有解决:就是接收缓冲区的数据是从readbuf 开始的,以这个程序为例: readbuf 中存放0x96 readbuf 中存放0x84 readbuf 中存放0xd5 readbuf 中存放0x63 readbuf 中存放0x7c readbuf 中存放0x8c 其实我是想把收到的数据存放在readbuf ~ 中的,我也不知道为什么结果会这样,有知道的麻烦指教
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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