实验四--nand flash的使用

发布者:龙腾少年最新更新时间:2023-10-12 来源: elecfans关键字:nand  flash  编译器  jz2440 手机看文章 扫描二维码
随时随地手机看文章

一。环境和编译器


  开发板:jz2440


       系统:ubuntu12.04


       编译器:gcc


二。验证代码


1.head.S


 1 @******************************************************************************

 2 @ File:head.s

 3 @ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行

 4 @auther:

 5 @******************************************************************************       

 6   

 7 .text

 8 .global _start

 9 _start:

10             @函数disable_watch_dog, memsetup, init_nand, nand_read_ll在init.c中定义

11             ldr     sp, =4096               @设置堆栈 

12             bl      disable_watch_dog       @关WATCH DOG

13             bl      memsetup                @初始化SDRAM

14             bl      nand_init               @初始化NAND Flash

15 

16             @将NAND Flash中地址4096开始的1024字节代码(main.c编译得到)复制到SDRAM中

17                                             @nand_read_ll函数需要3个参数:

18             ldr     r0,     =0x30000000     @1. 目标地址=0x30000000,这是SDRAM的起始地址

19             mov     r1,     #4096           @2.  源地址   = 4096处

20             mov     r2,     #2048           @3.  复制长度= 2048(bytes)

21             bl      nand_read               @调用C函数nand_read

22 

23             ldr     sp, =0x34000000         @设置栈

24             ldr     lr, =halt_loop          @设置返回地址

25             ldr     pc, =main               @b指令和bl指令只跳转32M的范围,所以这里使用向pc赋值的方法进行跳转

26 halt_loop:

27             b       halt_loop


2.init.c


 1 #define     WTCON    (*(volatile unsigned long *)0x53000000)

 2 #define     MEM_CTL_BASE        0x48000000

 3  

 4 void disable_watch_dog();

 5 void memsetup();

 6 

 7 /*关掉看门狗 */

 8 void disable_watch_dog()

 9 {

10     WTCON    = 0;

11 }

12 

13 /* 设置SDRAM */

14 void memsetup()

15 {

16     int     i = 0;

17     unsigned long *p = (unsigned long *)MEM_CTL_BASE;

18 

19     /* SDRAM 13个寄存器的值 */

20     unsigned long  const    mem_cfg_val[]={ 0x22011110,     //BWSCON

21                                             0x00000700,     //BANKCON0

22                                             0x00000700,     //BANKCON1

23                                             0x00000700,     //BANKCON2

24                                             0x00000700,     //BANKCON3  

25                                             0x00000700,     //BANKCON4

26                                             0x00000700,     //BANKCON5

27                                             0x00018005,     //BANKCON6

28                                             0x00018005,     //BANKCON7

29                                             0x008C07A3,     //REFRESH

30                                             0x000000B1,     //BANKSIZE

31                                             0x00000030,     //MRSRB6

32                                             0x00000030,     //MRSRB7

33                                     };

34 

35     for(; i < 13; i++)

36         p[i] = mem_cfg_val[i];

37 }


3.nand.c  以下代码不支持2410 也不支持小页读写,是裁剪源码的结果。


  1 #define GSTATUS1        (*(volatile unsigned int *)0x560000B0)

  2 #define BUSY            1

  3 

  4 #define NAND_SECTOR_SIZE_LP    2048

  5 #define NAND_BLOCK_MASK_LP     (NAND_SECTOR_SIZE_LP - 1)

  6 

  7 typedef unsigned int S3C24X0_REG32;

  8 

  9 

 10 typedef struct {

 11     S3C24X0_REG32   NFCONF;

 12     S3C24X0_REG32   NFCONT;

 13     S3C24X0_REG32   NFCMD;

 14     S3C24X0_REG32   NFADDR;

 15     S3C24X0_REG32   NFDATA;

 16     S3C24X0_REG32   NFMECCD0;

 17     S3C24X0_REG32   NFMECCD1;

 18     S3C24X0_REG32   NFSECCD;

 19     S3C24X0_REG32   NFSTAT;

 20     S3C24X0_REG32   NFESTAT0;

 21     S3C24X0_REG32   NFESTAT1;

 22     S3C24X0_REG32   NFMECC0;

 23     S3C24X0_REG32   NFMECC1;

 24     S3C24X0_REG32   NFSECC;

 25     S3C24X0_REG32   NFSBLK;

 26     S3C24X0_REG32   NFEBLK;

 27 } S3C2440_NAND;

 28 

 29 static S3C2440_NAND * s3c2440nand = (S3C2440_NAND *)0x4e000000;

 30 

 31 

 32 

 33 /* 供外部调用的函数 */

 34 void nand_init(void);

 35 void nand_read(unsigned char *buf, unsigned long start_addr, int size);

 36 

 37 

 38 /* S3C2440的NAND Flash处理函数 */

 39 static void s3c2440_nand_reset(void);

 40 static void s3c2440_wait_idle(void);

 41 static void s3c2440_nand_select_chip(void);

 42 static void s3c2440_nand_deselect_chip(void);

 43 static void s3c2440_write_cmd(int cmd);

 44 static void s3c2440_write_addr_lp(unsigned int addr);

 45 static unsigned char s3c2440_read_data(void);

 46 

 47 

 48 

 49 /* 复位 */

 50 static void s3c2440_nand_reset(void)

 51 {

 52     s3c2440_nand_select_chip();

 53     s3c2440_write_cmd(0xff);  // 复位命令

 54     s3c2440_wait_idle();

 55     s3c2440_nand_deselect_chip();

 56 }

 57 

 58 /* 等待NAND Flash就绪 */

 59 static void s3c2440_wait_idle(void)

 60 {

 61     int i;

 62     volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFSTAT;

 63     while(!(*p & BUSY))

 64         for(i=0; i<10; i++);

 65 }

 66 

 67 /* 发出片选信号 */

 68 static void s3c2440_nand_select_chip(void)

 69 {

 70     int i;

 71     s3c2440nand->NFCONT &= ~(1<<1);

 72     for(i=0; i<10; i++);    

 73 }

 74 

 75 /* 取消片选信号 */

 76 static void s3c2440_nand_deselect_chip(void)

 77 {

 78     s3c2440nand->NFCONT |= (1<<1);

 79 }

 80 

 81 /* 发出命令 */

 82 static void s3c2440_write_cmd(int cmd)

 83 {

 84     volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFCMD;

 85     *p = cmd;

 86 }

 87 

 88 

 89 

 90 

 91 static void s3c2440_write_addr_lp(unsigned int addr)

 92 {

 93     int i;

 94     volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFADDR;

 95     int col, page;

 96 

 97     col = addr & NAND_BLOCK_MASK_LP;

[1] [2]
关键字:nand  flash  编译器  jz2440 引用地址:实验四--nand flash的使用

上一篇:实验五--中断系统
下一篇:实验三——SDRAM

推荐阅读最新更新时间:2024-11-08 11:48

Intel-镁光反击,2xnm制程NAND芯片将试制
  在本月22日召开的一次电话会议上,镁光公司声称他们很快便会试制出2x nm制程NAND闪存芯片产品,并对其进行取样测试。尽管镁光没有透露这种2xnm制程的具体规格数字,但外界认为他们很可能会于明年初公布有关的细节信 息。这样,镁光及其NAND技术的合作伙伴Intel公司很有希望在明年利用这种新制程技术,甩开对手三星和东芝,重新回到领先全球NAND制作技术的宝 座上。目前Intel和镁光两家公司合资创立有一家专门负责NAND业务的IM闪存技术公司。    除了制造闪存芯片之外,Intel和镁光还有出售基于NAND闪存芯片的SSD硬盘产品,其中Intel的SSD硬盘业务状况可谓相当不错,而镁光则在这方面进行得不太顺利。  
[半导体设计/制造]
大容量Flash型AT91系列ARM核微控制器
引 言 AT91FR40162是美国Atmel公司生产的AT91系列微控制器中的一员,具有ARM7TDMI核、大容量Flash存储器以及片内SRAM和外围。这种微控制器的特点是高性能--32位RISC体系结构、高密度--16位指令集、低功耗以及实时性,扩充的Flash存储器还增加了开发者使用的灵活性。除此以外,大量的内部分组寄存器加速了对异常的处理过程,从而使其更适合于实时控制的应用。8级基于向量的优先级中断控制器和外围数据控制器PDC大大增强了实时器件的性能。此器件适用于开发工业自动化系统、MP3、销售终端、GPS接收机以及无线网络产品等对功耗敏感且要求具有实时性的产品。AT91FR40162微控制器的特点是在一个1
[单片机]
大容量<font color='red'>Flash</font>型AT91系列ARM核微控制器
s3c2440裸机-nandflash编程(二. nand控制器和nand访问时序)
一.Steppingstone 我们知道nand没有独立地址线,cpu无法直接访问nand上的指令,所以nand不能片上执行。那么为何程序还能支持nand启动的呢? 为了支持NAND启动,S3C2440A配备了一个称为“ Steppingstone”的内部SRAM缓冲区,容量为4K。 开机时,Nandflash中的前4K数据将被加载到Steppingstone中,而引导代码将被加载到SRAM中将被执行,如下图所示: 我们知道s3c2440支持2种boot方式,nand或者nor,那么需要配置OM引脚来设置引导方式,如下图: 内存控制器的地址映射表如下: 我们得知OM1接地,OM0接了一个开关SW2,那么我们的OM
[单片机]
s3c2440裸机-nandflash编程(二. <font color='red'>nand</font>控制器和<font color='red'>nand</font>访问时序)
搞定新唐error:flash download failed - cortex-m0
新唐Cortex-M0下载Flash失败-设置正确但下载失败的一个解决方法 今天在调试程序时、DEMO板下载几次后就提示Flash下载失败: Keil v4里面的设置都没有动过、不可能被修改。 此时、使用新唐的ICP Programming Tool软件来链接芯片,提示需要擦除芯片,然后才能下载。 这下、发现了在Keil v4里面老是下载失败的解决方法了: 在Keil v4里面、先擦除芯片:
[单片机]
搞定新唐error:<font color='red'>flash</font> download failed - cortex-m0
JTAG口及其对Flash的在线编程
摘要:通过JTAG实现对Flash在线编程。首先,介绍JTAG的定义、结构及引脚的定义,并阐述JTAG状态机的工作原理。然后,介绍JTAG口的边界扫描寄存器,给出实现JTAG在线写Flash的电路,和如何通过JTAG实现Flash的编程及程序流程图。 关键词:JTAG Flash 在线编程 随着嵌入式技术的发展,在一些高端的掌上设备中,都使用了Flash芯片,如Compaq的iPAQ、联想的天祺系列等产品。但对于研发人员来说,在开发阶段需要大量的程序调试,就意味着要对Flash进行擦除和改写的工作,因此,如何对Flash进行在线编程是问题的关键所在。本文介绍一种通过JTAG对Flash进行的在线编程方法。 1 JTAG简介
[应用]
SanDisk推出64GB iNAND嵌入式闪存驱动器
支持现在通用的e.MMC 4.4接口 用单一组件进行iNAND EFDs执行启动、系统代码和海量存储功能 SanDisk公司先进的32纳米3-bit-per-cell (X3) NAN闪存技术降低了高容量嵌入式解决方案的复杂度 2010年2月20日,中国–全球领先闪存供货商 SanDisk ® (闪迪) 在西班牙巴塞罗那移动通信世界大会推出了全新SanDisk® iNAND™嵌入式闪存驱动器(Embedded Flash Drives, EFD),支持e.MMC 4.4规格。这些驱动器基于3-bit-per-cell (X3) NAND闪存技术,在单一组件中提供最高达64GB1的容量,并能用于启动、系统代码和海量存储
[嵌入式]
利用Flash实现DSP对多个程序有选择的加载
摘要:主要介绍一种利用Flash存储器实现双DSP系统对多份用户代码有选择的上电加载的方法。其中,重点介绍M29W800AB Flash的使用和编程方法,TMS320VC54X DSP的上电自动引导过程,以及HPI模式和并行模式加载用户代码的方法。 关键词:Flash存储器 DSP 主机接口 Bootloader 引导表 引 言   在TMS320C54X系列DSP系统的开发中,由于DSP片内只有ROM和RAM存储器,如要将用户代码写入ROM中,必须要由DSP芯片厂家来完成;但这样做用户就不能再更改代码,很不实用。由于RAM在DSP掉电后不能再保存数据,因此,常常利用EPROM、 Flash等一些外部存储器来存放用户代码
[应用]
C51编译器-语言扩展(3)-指针
Pointers指针 Cx51支持使用字符*来声时一个指针类型的变量。Cx51的指针可以完成标准C的所有功能。然而,由于8051及其变种的特殊构架,Cx51使用两种类的指针: memory-specific pointers and generic pointers(特定存储器类型指针和通用指针), Generic Pointers 通用指针的定义方法与标准C指针的定义方法相同。通用指针总是使用三个字节来存储。第一个字节是存储器类型。第二字节是偏移量的高位,第三字节是偏移量的低位。通用指针可以访问所用的变量,而不论变量位于8051的哪一个存储区内。因为这个原因,许多8051的运行时库都使用这个种指针。通过使用通用指针,函数可以访
[单片机]

推荐帖子

allegro怎么画整齐的孔
求助,在allegro中怎么画整齐的孔,除了利用坐标还有没有其他方便点的办法啊allegro怎么画整齐的孔难道用坐标不是最简单的么??:time:坐标就是最好的方法,非常精确 {:1_134:}坐标就是要算数据啊。。感觉要算好烦。。数学不好 工程师们啊,这点计算算什么。就是定位一下圆心坐标,,以前我们我们国家哪些前辈搞原子弹的时候,都是手工计算,那样计算机啊
ohahaha PCB设计
PCB完整加工过程
大多数工程师把PCB文件,或者gerber文件发给厂家之后,就可以等着回板了。但是往往硬件研发岗位工作很多年都没有机会去PCB生产厂去看看整个生产的过程。今天带你走一遭。看一看完整的过程。第一步,开料PCB板厂的原材料一般都是1020mm×1020mm和1020mm×1220mm规格的多,如果单板或拼板的尺寸不合适,PCB生产过程中,就会产生很多的原料废边,PCB板厂会把之些废边的价格都加到你的板子上,这样你的PCB板单位价格就贵一些;如果板子大小设计得好,单板或拼板的尺寸是
ohahaha PCB设计
DIY扫描电子显微镜
转自果壳网。原标题《厉害炸了!一个自制扫描电子显微镜的人》。有删节,有修改。一个名叫BenKrasnow的工程师自己做了一个扫描电子显微镜!这可是电子显微镜啊,绝对不是摆弄几个玻璃镜片就能搞定的事情,简直是有史以来最难的DIY项目了……下面这位就是作者,以及他自己做的电镜:玻璃罩子里面的是核心部件,其他那些大坨的东西是真空泵和电源,另外因为泵在工作时会过热,所以他还加了冷却。主体部分特写:这东西花了他大约100小时时间,制作期间所有的周末全都一心扑在做电镜上。至于花费嘛,大约是150
maychang 综合技术交流
lm3s811和jlink连不上,求高人指路
lm3s811和jlink连不上,求高人指路连不上的原因很多,软件,硬件jlink!如果可以的话,我可以通过远程帮你看一下.FredQQ:1246696660回答提示什么错误啊,传个图也行啊把连不上的问题帖出来,好大家帮你!楼上说的不错,把连不上的错误截个图发上来。回复楼主zsxchina的帖子论坛的兄弟姐妹们,我的问题解决了,因为键盘引脚焊错了,导致复位端持续低电平,无法与jtag口连接,感谢亲们的关注,我太喜欢这个论坛了,特别感谢二楼的大哥,他在第一时间给予我了
zsxchina 微控制器 MCU
ARM异常中断返回的几种情况
ARM异常中断返回的几种情况异常中断返回的几种情况:重要基础知识:R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;而ADS中的pc,是为了调试看着方便而修改过的,它指向的是正在执行的指
单片机的应用 ARM技术
【2024 DigiKey创意大赛】- 基于毫米波雷达的生命体征检测及健康监护系统-环境监测
##【2024DigiKey创意大赛】-基于毫米波雷达的生命体征检测及健康监护系统-环境监测模块开发##一、模块概述本环境监测模块旨在通过温湿度传感器,实时监测室内温度和湿度,并将数据展示在LCD触摸屏和手机APP上。当温湿度参数超出正常范围时,系统会自动报警,提醒用户采取措施改善环境。##二、功能需求1.**温湿度监测**-利用空气温湿度传感器监测室内温度和湿度。2.**环境信息展示**-在LCD触摸屏和手机APP上实时展示温湿度等环境信息。
zygalaxy DigiKey得捷技术专区
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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