S3C2440 NOR FLASH 地址对齐

A

《嵌入式Linux应用开发完全手册》第79页关于地址不对齐的时候,使用异常处理函数,使用0x0,0x2读操作的时候,是CPU地址为0x0,0x2还是Nor Flash地址为0x0,0x2呢?

 Answer

CPU使用的地址是32位的,

但是NOR使用的地址线要根据它的容量来定。

修改CPU发出的地址是0xABCDEFGH,则NOR只会看到低几位的地址,比如0xEFGH。

对于小数值0x0、0x2,CPU发出的地址和NOR接收到的地址信号,是一样的

 

A

书中CPU的ADDR1-ADDR20与NOR Flash的A0-A19相连,也就是地址2对齐的。而CPU的DATA0-DATA15与NOR Flash的D0-D15相连,就是以16位单位读写。

如果CPU使用地址0x6读数据(即0110B),那NOR Flash得到的地址是0011B,这时会将0011B,0100B的数据给CPU。

如果CPU使用地址0x8读数据(即1000B),那NOR Flash得到的地址是0100B,这时会将0100B,0101B的数据给CPU。

那这两个数据中的0100B不是重复了吗?

A

还有书中说如果CUP送出地址0x1来读,则应该用异常处理函数,使用0x0,0x2发起两次读操作,然后组合起来。

但是0x0读到的两个字节为D0=0000B,D1=0001B,

     0x2读到的两个字节为D2=0001B,D3=0010B,

然后D1,D2组合成一个16位的数得到输出,但D2不是等于D3吗??

Answer

1. NOR16位的,那么它就是一个地址对应两字节的数据:

如果CPU使用地址0x6读数据(即0110B),那NOR Flash得到的地址是0011B,这时会将0011B对应的两字节数据给CPU

如果CPU使用地址0x8读数据(即1000B),那NOR Flash得到的地址是0100B,这时会将0100B对应的两字节数据给CPU

 

这样理解:CPU的ADDR1接NOR的ADDR0时,CPU“看到的”,还是一个地址对应一个字节;但是NOR“看到的”,是一个地址对应两字节。

CPU16位进行操作时,它期望以只发出一个地址信号,而获得两字节的数据:发出A地址,想得到AA1对应的两字节数据;

NOR16位的,它根据自身的ADDR0ADDR1、...决定:取“第几个”的数据给CPU,“每个”是两字节。

CPU与NOR相连时,CPU的ADDR0不连,ADDR1与NOR的ADDR0相连,仔细想想,会想通的

 

2.

但是0x0读到的两个字节为D0=00B,D1=01B,

       0x2读到的两个字节为D2=10B,D3=11B,没有重复

 

CPUBANK0设置位宽为16,那么它发出对BANK0的读写操作时,都是以16位进行的。

这意味着,它发出一个地址时,将会读或写两个字节的数据。

你外接的NOR是怎么回事,CPU不理会:CPU只认一点,我发出一个地址,对应两字节的数据。

 

好吧,到NOR了,NOR只能满足CPU的命令:看到一个地址,发回两字节的数据。

NOR是以16位进行组织的,“每个是16位”。

 

CPU发来地址0NOR的地址线为0x00,对应NOR的第116位数据

CPU发来地址0x2NOR的地址线为0x01,对应NOR的第216位数据

CPU发来地址0x4NOR的地址线为0x2,对应NOR的第316位数据

 

CPU想发来地址0x1?不好意思,CPU不会这么做,直接发生异常!


http://blog.sina.com.cn/s/blog_6859cadf0101in3f.html



发布了11 篇原创文章 · 获赞 6 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览