微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM开发步步深入之NandFlash 4KB突围

ARM开发步步深入之NandFlash 4KB突围

时间:12-07 来源:互联网 点击:

(因为1 Block = 32 Pages,5bit的寻址范围是0~31,可以对1 Block里面的所有Page进行寻址)。A14~A25的12bit则是对Block进行寻址,12bit的寻址范围是0~4095,对整个 Device的4096个Blocks进行寻址。Read 2操作:该操作是对16 Bytes * 32 Pages * 4096 Blocks =2MB的备用位(ECC)进行寻址。50h命令为Read2操作,对1 Page里面的后16 Byte寻址。这样,通过四个周期的发送即可对整个Device的所有存储单元进行寻址。

三、NandFlash存储控制器

S3C2410 为简化对NandFlash的操作,提供了一组NandFlash控制器来实现对K9F1208U0M命令字的操作,主要有配置寄存器NFCONF、控制 寄存器NFCONT、命令寄存器NFCMD、地址寄存器NFADDR、数据寄存器NFDATA和状态寄存器NFSTAT。

★NFCONF被用来使 能/禁止NandFlash控制器、使能/禁止控制引脚信号nFCE、初始化ECC、设置NandFlash的时序参数。TACLS、TWRPH0、 TWRPH1---这三个参数控制着NandFlash信号线CLE/ALE与写控制信号new的时序关系。根据NandFlash的Datasheet 中对其最小读/写/控制时间的要求,联系HCLK实际取值一般为100MHz,可以设这三个参数分别为1:3:1个HCLK即可(貌似ViVi中是 1:3:1),这样可以满足其时序要求。

★NandFlash状态寄存器NFSTAT。只用到最低位[0],0:busy;1:ready。

NandFlash 存储控制器根据OM[1:0]位的取值可以工作在①自动启动模式---OM[1:0]=00时,复位之后,NandFlash的最先4KB的代码被复制到 Steppingstone中即内部4KB的SRAM。Steppingstone被映射为Bank0(nGS0),且CPU在此4KB内部SRAM中开 始执行启动代码;②NandFlash模式。

示例代码解析:

★head.S头文件来设置SDRAM,设置SDRAM,将第二部分代码复制到SDRAM,然后跳到SDRAM继续执行。

.equ MEM_CTL_BASE, 0x48000000

.text

.global _start

_start:

bl disable_watch_dog @关门喂狗

bl mem_control_setup @设置存储控制器

ldr sp, =4096 @设置栈指针,以下C函数调用前需要设好栈

bl nand_init @初始化NandFlash

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

ldr r0, =0x30000000 @目标地址=0x30000000,SDRAM起始地址

mov r1, #4096 @源地址=4096,连接的时候led代码在4096开始处

mov r2, #1024 @复制长度=1024,对于本实验的led足够

bl nand_read @调用C函数nand_read

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

ldr sp, =0x34000000 @重新设置栈

ldr pc, =main @使用向pc赋值的方法进行跳转到点灯代码

halt_loop:

b halt_loop

★nand.c文件实现NandFlash的初始化和数据读取

#define BUSY 1

typedef unsigned long S3C2410_REG32; //貌似此处定义为unsigned int反汇编结果一样的,也没问题。猜可能是ARM指令直接按32位存储了吧,知道的可以和我说一下!

/* NandFlash结构体 */

typedef struct {

S3C2410_REG32 NFCONF;

......

S3C2410_REG32 NFECC;

}S3C2410_NAND;

static S3C2410_NAND * s3c2410nand = (S3C2410_NAND *)0x4e000000;

/* 供外部调用的函数声明 */

void nand_init(void);

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

/* S3C2410的NandFlash处理函数声明 */

static void s3c2410_nand_reset(void);

......

static unsigned char s3c2410_read_data();

/* S3C2410的NandFlash操作函数实现 */

/* 复位 */

static void s3c2410_nand_reset(void)

{

s3c2410_nand_select_chip();

s3c2410_write_cmd(0xff); //发命令字0xFF实现复位操作复位

s3c2410_wait_idle();

s3c2410_nand_deselect_chip();

}

/* 等待NandFlash就绪 */

static void s3c2410_wait_idle(void)

{

int i;

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

while(!(*p & BUSY))

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

}

/*

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top