在一般的读写外部RAM的程序中,经常看到这样的句子:
采用XBYTE后,就不用顾及其时序,就是说,读写数据的时候,WR和RD怎么都不用用程序去控制。
读写外部RAM的程序,不需关注WR和RD端口的控制。
#define W_DATA XBYTE[0x1000]
W_DATA=0X55;
上面语句转为汇编表示如下:
mov dptr,#1000h
mov a,#55h
movx @dptr,a
因为对于单片机仅仅MOVX指令(16位指令)才能访问外部数据存储器,又因为单片机P0口已经作为数据口与单片机相连,因此只能使用拥有高8位地址的P2口,且P2口仅仅在16位地址操作中才有用,因此编址采用16位形式,用不到的补零。
而对于Nandflash访存操作XBYTE[1000]中的地址是由硬件电路的连线所决定的,一般来说flash的操作分为命令、地址、数据,而这三个操作是由ALE、CLE信号(引脚)来区别的,一般这两个引脚会与单片机P2口相连接。ALE、CLE信号如下:(0,1)写命令、(1,0)写地址、(0,0)写数据,因此ALE、CLE与P2口连接情况决定了Nand的命令端口、地址端口和数据端口。
例如若ALE与P2.7,CLE与P2.6,WP与P2.5相连,且由于P2口对应XBYTE的高位,因此可知Nand的命令端口地址为:0x6000(01100000),地址端口地址为:0xA000(10100000),数据端口地址为:0x2000(00100000)。
Nandflash 的存储结构如下(不同的flash的行、列数不同):
(上传不了图片。。)
Flash共分位64K个行(页),2K+64个列。其中每页含2K+64个字节,每列1个字节。下图Flash容量为64K*(2112)= 132MB。
其访存时的4个地址序列中,A0-A11(2048)个地址确定列,A12-A27(65536)确定页也就是行,这样就能确定所要访问的字节地址了。
例如,若想访问第3页的第1列的数据,则4个地址序列分别为:0x80(A0-A7),0x00(A8-A11),0xc0,0x00