2. nWE, nWBE, nBE三者之间的关系
(1)nWE为写使能信号。
(2)nWBE为“写字节使能(write byte enable)”信号,而nBE 为高/低字节选择信号。nWBE与nBE共用引脚,可以通过对相关寄存器设置来进行功能选择。
(3)什么时候需要nWBE而不是nWE?
nWE和nWBE都带有写使能的功能。但既然有nWE,为什么还需要nWBE?这是因为,当使用几片储存芯片进行数据位扩展时,有时需要对芯片分开写数据,此时可使用nWBE。
在图5-4中,仅有一片8bit的ROM,因此仅需要nWE,而不需要nWBE。而在图5-5中,用了2片8bit的ROM,如果不使用nWBE,则写操作是对2片ROM同时进行的,这样,当执行写字节指令时可能会破坏另一芯片中的数据。(注意nWBE的信号是自动产生的。)从这个角度来说,nWBE有字节数据屏蔽的功能。
后面我们也会看到,SDRAM中有DQM信号也是用来进行数据屏蔽作用的,那么它们之间区别何在?
(4)nWBE, nBE有什么区别?什么时候应该配置成nBE?
根据手册描述“nBE[3:0] is the 'AND' signal nWBE[3:0] and nOE”,即nBE是nWBE和nOE的“与”信号,这句话给了我们非常重要的启示,应该说深刻揭示出了nWBE, nBE之间的本质、内涵。
首先看一下真值表:
nWBE |
nOE |
nBE |
说明 |
1 |
1 |
1 |
nWBE, nOE均无效(低电平有效),于是nBE无效 |
0 |
0 |
0 |
nWBE, nOE任意一个有效(低电平有效),则nBE有效 |
1 |
0 |
0 |
|
0 |
1 |
0 |
注意到nWBE[3:0],nOE仅一根信号线。由此可见,nBE就是字节选通信号(读、写选通)。读的时候,多片均选通,写的时候,分片进行选通。其实质,nBE可看作字节片选信号。
那么,能不能把上图5-5中nWBE换成nBE?
如果这样连接,我们思考一下有什么问题:注意表格阴影行,当nWBE无效而nOE有效,nBE有效,这会使存储器的nWE有效,致使读写信号混乱,显然不行。
事实上,到底用什么,应该根据存储器芯片来决定。
究竟什么时候需要nBE呢?手册上给出的SRAM连接图5-8,5-9给出了示例。同样我们要问,图5-8中能不能把SRAM的nWE接nWBE?
如果这样接,芯片的nBE信号就无法解决,因为nBE和nWBE不能同时工作,这样就无法单独操控片内的高字节与低字节读写。这里的nBEx就像是片内的高字节与低字节的片选信号。
再问,能否将图5-8中nBE信号换成nWBE信号(硬件连接不变,寄存器配置改变)?
当按字节写芯片,没有问题,这时候可以产生有效的nWBE信号,以选择U/L字节;而当需要按字节读芯片时,nWBE无效,无法提供正确的nUB/nLB选择信号,就无法读出数据,可见行不通。注意,似乎无法真正做到按字节读芯片,因为只要nOE有效,nBE一定有效,这样势必造成nBE0,nBE1同时有效。即便如此,应该不会有什么麻烦,大不了将不需要的字节数据丢弃即可。
3.
(1)ROM
(2)SDRAM
注意nSCS[1:0]就是nGSC[7:6],参看三星官方评估板电路图。
这里重点关注DQM[3:0]。经查2440手册,DQM与nWBE引脚是复用的。参考友善之臂提供的mini2440手册中所提供的SDRAM电路(同三星官方):
可见,DQM正是连接到了nWBE。又参考SDRAM的数据手册,对DQM的描述:“Controls output buffers in read mode and masks input data in write mode(即:在读模式下控制输出缓冲;在写模式下屏蔽输入数据。)”。
我们的问题是:为什么DQM连的是nWBE而不是nBE?能不能为nBE?
下图是SDRAM的数据手册中截取的真值表,从中可以发现,读写控制和DQM毫无关系。DQM主要在读、写时起屏蔽作用。读-写是通过nWE的电平状态来控制的。
倘若DQM连nBE,需要写字节屏蔽信号,则与nWBE没有分别;读的时候,若nWBE无效,nBE是否有效取决于2440的nOE——如果nOE无效,那么nBE完全与nWBE一致,而此处确实不需要nOE,所以我个人的结论认为它连nBE也是可行的(未知对否?需通过写程序验证)。
另外还有个问题:nWBE是什么时候有效的?读SDRAM时,需要控制的只是使nWE为高,但这时候nWBE会自动有效吗?需要程序控制吗?(较容易设想的是nWE为低时nWBE自动根据读写字宽确定是否有效)。这个问题看看2440的时序图就了然了。
附2440时序图(早没发现它;早发现它早清楚了J):
另外,ROM/SRAM的时序图:
附网友帖子(讲得太肤浅):
这个一点也不复杂。 内存的这种接法,使它可以以8位访问,也可以16位访问,也可以32位访问 那4个信号nWBE3~0,正是字节选通控制。 按8位访问,也就是代码中若有: *(unsigned char *) 0x30000000 = 0x78; 就是一个字节写,这时只有nBWE0信号有效 如果是0x30000001,则只有nBWE1有效(低),其它无效(高)。 再举个例,如果是按16位访问呢? 如果是16位访问,代码一般就是: *(unsigned short *)0x30000000 = 0x1978; 这是一个16位写。但此时要注意,最低位必须是0,而不能是1,比如地址0x30000001就会使CPU异常,因为必须16位对齐! dat16 = *(unsigned short *)0x30000002; 这是一个16位读 在16位访问时,0x30000000地址写操作中,nWBE1, 0 = 低,nWBE3, 2 = 高。当0x30000002时,则是nWBE3,2为低,nWBE1,0为高(无效) 32位时则是4字节对齐,也就是最低的两个地址位A1,A0必须为0,即对于32位访问,0x30000001, 0x30000002, 0x30000003都会导致异常(出错) 对于32位访问,0x30000000的下一个地址是0x30000004,因为这个地址是字节地址,但一下子就访问了0x30000000~0x30000003四个字节,也就是nWBE3~0四个信号一起反应!!! 不同的CPU访问的机制是不一样的,这要具体看手册了,是分开片选的