实验四--nand flash的使用

发布时间:2023-06-13  

一。环境和编译器


  开发板: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、集成运算放大器的技术指标 (1) 开环差模电压放大倍数(开环增益)大 Ao(Ad)=Vo/(V+-V-)=107-1012倍......
    为单位)的比值。 四.常见的运算放大器应用 集成运算放大器的工作状态有两种,分为线性状态和非线性状态,当给集成运算放大器加上负反馈电路时,他就......
    VT1~VT2组成反相放大器(其中T1~T2是组成复合管用于放大A2的输出电流,最大可以输出3安培的基准电流),A3是电压跟随器。该恒流源经过多次滤去纹波 ,能确保输出电流恒定。恒流源全部采用集成运算放大器......
    微源半导体推出适配液晶显示的4通道集成运算放大器LP6294HSPF;微源半导体在液晶显示面板偏置电源芯片设计持续耕耘,已经量产多款液晶显示面板的电源管理芯片,可适配a-Si,LTPS,IGZO等不......
    的必要条件是运放引入深度负反馈。 【虚断】 虚断指在理想情况下,流入集成运算放大器输入端电流为零。这是由于理想运算放大器的输入电阻无限大,就好像运放两个输入端之间开路。但事实上并没有开路,称为“虚断”。 话不......
    。 19、三极管的三个工作区域是 截止 , 饱和 , 放大集成运算放大器是一种采用直接耦合方式的放大......
    集成运算放大器应用电路集萃-213页......
    非常低失真的应用可能会受到细微非线性的负面影响。如果不能使用模拟或实验室测试来验证失真性能是否可接受,那么假设输出信号需要与饱和度极限保持几百毫伏的距离是一个好主意。 与输入电压范围一样,输出电压范围取决于运算放大器......
    的平衡电阻 实验证明,在高内阻电流源的微电流放大器中,运算放大器接平衡电阻不仅很难使输入电阻平衡,反而会增加电路噪声,所以图3中AD8608运算放大器同相端不接平衡电阻,而是直接接地。 (2)降低运算放大器......
    位置的非易失性特性允许调光器设置保持在未上电状态。 数码宝贝的刮水器(V雨刮器) 是输入到 LMX358 (U2) 双通道运算放大器运算放大器)的反相输入。然后将其与双通道运算放大器另一半产生的伪锯齿波进行比较。基本......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>