S3C2440/S3C6410 NandFlash地址序列注意点

1. 地址时序

K9F2G08U0A.pdf(p9)

1) Column Address [A0 - A10]- 页内访问

2K 一页 = 2048 Byte

需要2^11 = 2048 的范围访问到每一个字节.

列地址需要11.

Addr[0~10]

因为I/O(0~7) 每次只能传输8, 所以11 个位要分两次,

一次,8 位,下一次3 位。

NFADDR = addr & 0xff;

NFADDR = (addr >> 8) & 0x7;

 

2) 页内指针 A11

datasheet 地址序列中的A11 并不是表示Nand Addr 中的一个位,而是一个用于访问oob 区的指针,如果A11=0, 则不访问oob 区,如果A11=1 ,则访问。

 

他是如何控制的呢?

因为,[0-10]112^11 次方正好访问2048 Byte, [11] 正好就是2048 的边界。

如果[11] 给一个1 ,那么列地址再发个[0-5]62^6=64 Byte, 就可以访问64ByteOOB.

 

3) Row Address - 页索引地址

1 块有64 个页.

一个256MNand Device2048 个块。

那么整个设备有2048*64 个页。

2048*64 = 131072 = 2^17

行地址需要17 位才可以访问到整个设备的所有页。

因为I/O(0~7) 每次只能传输8, 所以17 个位要分三次,

1st, 8 位,

2nd , 8 位,

3rd , 1 位。

NFADDR = (addr >> 11) & 0xff;

NFADDR = (addr >> 19) & 0xff;

NFADDR = (addr >> 27) & 0x1

 

4) 访问Nand Flash的某个页里的某个字节。(Main区,不包括OOB区)

NFADDR 是某个字节的起始地址。低11[0-10] 是列地址(页内地址),[11-27]17 位是行地址(页索引)

例如,

NFADDR = 0x0123_4567

= 0b(0000 0001 0010 0011 _ 0100 0 101 0110 0111 )

红色的是[0-10]11 位列地址.

蓝色的是[11-27]17 位行地址.

 

NFADDR = addr & 0xff;

NFADDR = (addr >> 8) & 0x7;

NFADDR = (addr >> 11) & 0xff;

NFADDR = (addr >> 19) & 0xff;

NFADDR = (addr >> 27) & 0x1;

 

???5)访问Nand Flash的某个页里的某个字节。(OOB区)

OOB 区只有64Byte, 只需要[0-5] 6 位列地址即可访问.

但是要给出一个A112048 )页内指针指向OOB;

NFADDR = addr & 0x3f;

NFADDR = (addr >> 8) & 0x??;

NFADDR = (addr >> 11) & 0xff;

NFADDR = (addr >> 19) & 0xff;

NFADDR = (addr >> 27) & 0x1;

 

2. 写操作注意不要写到了OOB区

 

3. GCC march=armv4

在写nand flashc 程序时要注意,nand 很多寄存器都是8 位或16 位的,相应我们也要用的相应的强制转换:

(unsigned long *) --> 触发 ldr

(unsigned char *) --> 触发 ldrb

 

你可能感兴趣的:(7,嵌入式技术)