花了好几天研究这个东西,理解了很难讲的明白,不过我试试看吧。
约定:
CPU 44b0,Flash sst39vf160(1M*16bit).
44b的地址写成Addr0,flash的地址写成A0.
flash连接在bank0.
移位问题,主要是ARM地址是按照8位编,但是flash按照16未来编。
说白一点就是,对于ARM来讲,0x000000 和0x000001每一个地址对应的是一个字节(8b),但是flash呢?0x00000和0x00001每一个地址对应一个半字(16b)。
那么flash在ARM里面的地址范围0x000000-0x1fffff。2MByte.flash本身的地址范围0x00000-0xfffff。1MHWord。这样建立的ARM地址与flash地址的联系。
假如,ARM和flash连接地址一一对应,那么ARM要读取连续的两个字节,会出现什么情况?
ARM按照字节编址,0x00000和0x00001分别对应的是flash的0x00000的半字(低8位和高8位)。问题就出来了,对于我们编写程序,是从ARM的角度出发的,那么你要读取字节,但是读到的是2个字节。0x00001本来我们编的地址是第二个字节的,现在对不上座位了,成了第2,3字节了。
因此,你的地址不能够理想的读到你需要的字节。明明我1是第二个字节的地址在flash那一头成了第三第四个字节了。
不要紧,采用硬件方法,让你的ARM地址的Addr1对应flash的A0。从新分析一下。读取连续的连个字节的情况。地址线送出0x00000 的到16位(包含你需要的字节),地址线送出0x00001的到一个16位,这个16位其实和前面的16位是一个数,虽然对于我们来说是两个地址,但对于flash来说,我们只是送出了同一个地址,数据当然相同了。因为地址已经偏移一位了;)
那么0x5555这个经常用到的flash的地址(这可是个16位数的地址,比ARM的地址整整大了一圈:)2倍),如我们要写入数据到这个地址,那么这个0x5555还得再次左移一位(0x5555<<1或者0x5555*2)。现在该明白了吧。 |