现在来看2440内存控制器初始化代码
;Set memory control registers
ldr r0,=SMRDATA ;be careful!, hzh
ldr r1,=BWSCON ;BWSCON Address
add r2, r0, #52 ;End address of SMRDATA
0
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne %B0
;=========================================
SMRDATA DATA
; Memory configuration should be optimized for best performance
; The following parameter is not optimized.
; Memory access cycle parameter strategy
; 1) The memory settings is safe parameters even at HCLK=75Mhz.
; 2) SDRAM refresh period is for HCLK<=75Mhz.
DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20) + (B6_BWSCON<<24)+(B7_BWSCON<<28))
DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) ;GCS0
DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) ;GCS1
DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) ;GCS2
DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) ;GCS3
DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) ;GCS4
DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) ;GCS5
DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) ;GCS6
DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) ;GCS7
DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Tsrc<<18)+(Tchr<<16)+REFCNT)
DCD 0x32 ;SCLK power saving mode, BANKSIZE 128M/128M
;DCD 0x02 ;SCLK power saving disable, BANKSIZE 128M/128M
DCD 0x30 ;MRSR6 CL=3clk
DCD 0x30 ;MRSR7 CL=3clk
---------对于上面的东西无非是寄存器的参数设置,很明了。我在这里就不注释了。
昨晚,问了一些群里面的人,后来再看看电路图。
发现问题在LDQM,UDQM这两个引脚,接到2440的四个nWBE引脚。内存资料是这么说的:Data Input/Output Mask Controls output buffers in read mode and masks input data in write mode 一些中文文档是这么说的:在读模式下控制输出缓冲;在写模式下屏蔽输入数据。按照这种接法(2片内存都是错位2位)我觉得内存是分开高16位和低16位分别访问的,但是让我纳闷的是2440是怎么控制四个nWBE引脚来完成任务的?并且,我看访问内存的时候都是直接访问32位地址的。真的迷茫了,不知道2440是如何实现的。请高手指点一下。谢谢。
下图是内存连接图,关键部分我都大了红圈。
----------------------------------------------------------------------------------------------
谢谢两位。你们说的在那篇文章我都知道。只是我想了解的更加具体一点——可惜三星已经把所有东西包装得严严实实——很多东西通过硬件实现了。
----------现在我把我的理解发上来。
一、为什么会两片内存都连接相同的地址线?(我一直以为地址线必须是递增的)
答案:因为这是两片独立内存,地址线都是固定的,如果地址递增会造成糟糕的后果(我还真以为是两片内存可以无缝连接呢!大错特错了。)
二、为什么两片内存都要错位两位?
答案:
因为两片内存是独立访问的,并且总线宽度都是32位(高16位数据和低16数据位分开读取。至于错位原因请看ARM字节对齐文章)。
但是难题来了,为什么三星访问内存时候并没有分开呢?LDQM UDQM 这两个引脚起作用了(用来屏蔽高低字节输出,相当于锁存)控制这两个引脚的是三星的nWBE
引脚,三星是怎么控制这些引脚的呢?我也很想知道,在这里我只能说出我的推测:2440/2410有个寄存器设置内存的大小,我想2440/2410就是根据这些信息来控制这些引脚,使最总实现32位一起访问。——所有东西包装得严严实实——很多东西通过硬件实现了。
如果我说的不对,请跟帖。也让我彻底死心,彻底明白。
注意事项:
一、如果文章标题标有【原创】字眼的,gooogleman有原创著作权,请转载的时候不要删除文章的任何部分,并且商业网站转载必须经过gooogleman同意。
二、文章标题标有【转载】也请转载的时候标明原创作者的名字和原文地址,尊重原创作者。
三、本博客为gooogleman的官方博客,并且会和gooogleman官方网站http://www.gooogleman.com/以及gooogleman CSDN 博客同步更新。
四、本博客原创文章所有权属于gooogleman嵌入式开发板联盟。
五、gooogleman嵌入式开发板联盟盟主旗舰店为http://gooogleman.taobao.com/ 旺旺ID 为:gooogleman2009 目前发现网上有类似的ID,请各位网友不要认错, gooogleman和gooogleman2009 是唯一的!