1. 地址时序
《K9F2G08U0A.pdf 》 (p9)
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;
在datasheet 地址序列中的A11 并不是表示Nand Addr 中的一个位,而是一个用于访问oob 区的指针,如果A11=0, 则不访问oob 区,如果A11=1 ,则访问。
他是如何控制的呢?
因为,[0-10]11 位2^11 次方正好访问2048 Byte, [11] 正好就是2048 的边界。
如果[11] 给一个1 ,那么列地址再发个[0-5]6 位2^6=64 Byte, 就可以访问64Byte 的OOB 区.
1 块有64 个页.
一个256M 的Nand Device 有2048 个块。
那么整个设备有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
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;
OOB 区只有64Byte, 只需要[0-5] 6 位列地址即可访问.
但是要给出一个A11 (2048 )页内指针指向OOB;
NFADDR = addr & 0x3f;
NFADDR = (addr >> 8) & 0x??;
NFADDR = (addr >> 11) & 0xff;
NFADDR = (addr >> 19) & 0xff;
NFADDR = (addr >> 27) & 0x1;
在写nand flash 的c 程序时要注意,nand 很多寄存器都是8 位或16 位的,相应我们也要用的相应的强制转换:
(unsigned long *) --> 触发 ldr
(unsigned char *) --> 触发 ldrb