学习笔记--- S3C2440 对NANDFLASH操作原理与测试代码分析

来源:互联网 发布:成都黑帽seo方案 编辑:程序博客网 时间:2024/05/19 12:38

首先来看一下NANDFLASH接口:


图上看出只有数据口和控制口,没有地址线,所以它不能像网卡,SDRAM那样统一寻址,它的操作方法步骤:

1 使能芯片

2 发操作指令(读,写,擦,复位)

3 发操作地址

5 等待忙信号释放(只有读)

6 发送数据(写),接收数据(读)

7 等待忙信号,低电平忙

8 禁能芯片

这些控制信号线都是通过软件设置寄存器,然后硬件自动产生其他控制线的控制信号;

操作信号含义如下:

R/B :读/忙状态线

CE : 片选

CLE :发送指令信号

ALE :发送地址信号

WE:写信号

RE:读信号

这里要注意的:

1 数据按字节传输,刚好8位数据线,可以直接读取数据寄存器获取数据

2 地址有32位,这里只有8位线,所以一个地址要传完需要多次发送,发送规则看NANDFLASH芯片手册,如下图:



这个芯片需要分4个周期发送地址,地址线的多少取决于存储芯片的大小,写驱动的时候要按照这个表发送地址位。

@******************************************************************************@ File:head.s@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行@******************************************************************************         .text.global _start_start:                                            @函数disable_watch_dog, memsetup, init_nand, nand_read_ll在init.c中定义            ldr     sp, =4096               @设置堆栈             bl      disable_watch_dog       @关WATCH DOG            bl      memsetup                @初始化SDRAM            bl      nand_init               @初始化NAND Flash                                            @将NAND Flash中地址4096开始的1024字节代码(main.c编译得到)复制到SDRAM中                                            @nand_read_ll函数需要3个参数:            ldr     r0,     =0x30000000     @1. 目标地址=0x30000000,这是SDRAM的起始地址            mov     r1,     #4096           @2.  源地址   = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处            mov     r2,     #1024           @3.  复制长度= 1024(bytes),对于本实验的main.c,这是足够了            bl      nand_read               @调用C函数nand_read            ldr     sp, =0x34000000         @设置栈            ldr     lr, =halt_loop          @设置返回地址            ldr     pc, =main               @b指令和bl指令只能前后跳转32M的范围,所以这里使用向pc赋值的方法进行跳转halt_loop:            b       halt_loop
先看这段启动代码,为了使用C语言来设置看门狗与初始化SDRAM等操作,需要先设置好SP,因为C语言函数的入口地址和局部变量都需要栈来存储。

在完成初始化后,就可以调用nandread函数来读取NANDFLSH数据了,这里需要传进3个参数,从汇编语言传参数给C语言函数就只能通过将参数赋值给R0-R4,这里的三个参数,第一个参数对应r0,依次类推。下面这段代码实现把参数传递给nand_read函数了:

            ldr     r0,     =0x30000000     @1. 目标地址=0x30000000,这是SDRAM的起始地址            mov     r1,     #4096           @2.  源地址   = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处            mov     r2,     #1024           @3.  复制长度= 1024(bytes),对于本实验的main.c,这是足够了            bl      nand_read               @调用C函数nand_read
再来看下nand_read的原型:

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

第一个参数是需要传入一个地址,所以在从汇编传入进来的是一个地址,使用LDR 指令将绝对地址装载到r0

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

第二个和第三个参数传入的都是立即数,可以直接使用下面方式赋值

mov     r1,     #4096           @2.  源地址   = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处mov     r2,     #1024           @3.  复制长度= 1024(bytes),对于本实验的main.c,这是足够了








0 0
原创粉丝点击