原创 存储控制器的寄存器使用方法

2009-2-6 09:41 4430 5 5 分类: MCU/ 嵌入式

BWSCON中每4位控制一个BANK,最高四位对应BANK7,……


1STx:启动/禁止SDRAM的数据掩码引脚,对于SDRAM,此位为0;对于SRAM,此位为1<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


2WSx:是否使用存储器的WAIT信号,通常设为0


3DWx:使用两位来设置存储器的位宽:00-8位,01-16位,10-32位,11-保留。


比较特殊的是BANK0对应的4位,它们由硬件跳线决定,只读。


 


BANKCON0-BANKCON5的相关设置可以参考手册,我没用到,使用默认值0x00000700即可。


 


BANKCON6-BANKCON7


8BANK中,只有BANK6BANK7可以使用SRAMSDRAM,所以BANKCON6-7BANKCON0-5有点不同:


aMT([16:15]):用于设置本BANK外接的是SRAM还是SDRAMSRAM-0b00SDRAM-0b11 


b.当MT=0b11时,还需要设置两个参数:


Trcd([3:2])RAS to CAS delay,设为推荐值0b01


SCAN([1:0])SDRAM的列地址位数,对于YL-PS3C2440开发板使用的SDRAM W9825G6EH-75,列地址位数为9,所以SCAN=0b01。如果使用其他型号的SDRAM,您需要查看它的数据手册来决定SCAN的取值:00-8位,01-9位,10-10


 


“Multiplexed pins for row and column address.


Row address: A0-A12. Column address: A0-A8.”  来自数据手册


 


综上所述,BANKCON6/7均设为0x00018005


 


4REFRESH(SDRAM refresh control register):设为0x008C0000+ R_CNT(参考网上时,发现别人用的是0x008e0000自认为是错的)


因为从下面可以算出:


REFEN[23]:开启刷新功能,设为
TREFMD[22]
:设为Auto refresh模式,设为
Trp[21:20]
:看看RAS precharge Time,查看SDRAM手册,发现-H系列此参数至少为20ns,现在Hclk对应的时钟周期为10ns,所以至少应该为2clock。可以设为00 
Tsrc
Semi Row Cycle Time,也就是RAS Cycle Time,至少65ms,所以至少得6.5clock,按照可选值,应该设置为11 


 


其中R_CNT用于控制SDRAM的刷新周期,占用REFRESH寄存器的[10:0]位,它的取值可如下计算(SDRAM时钟频率就是HCLK)


R_CNT = 2^11 + 1 – SDRAM时钟频率(MHz) * SDRAM刷新周期(uS)


在未使用PLL时,SDRAM时钟频率等于晶振频率12MHzSDRAM的刷新周期在SDRAM的数据手册上有标明,在本开发板使用的SDRAM HY57V561620CT-H的数据手册上,可看见这么一行“8K Refresh Cycles/64 mS s”:所以,刷新周期=64ms/8192 = 7.8125 uS


对于本实验,R_CNT = 2^11 + 1 – 12 * 7.8125 = 1995


 


所以,在未使用PLL时,REFRESH=0x008C0000+1955=0x8C07A3


 


BANKSIZE寄存器:


BANKSIZE     地址0x48000028


BURST_EN [7]    ARM核突发操作允许


                   0--禁止突发操作


                   1--允许突发操作


Reserved    [6]    不使用


SCKE_EN[5]    SCKE允许控制


                     0=SDRAM SCKE 禁止,不使用SCKE信号令SDRAM进入省电模式,


                   1=SDRAM SCKE 允许,使用SCKE信号令SDRAM进入省电模式,


SCLK_EN [4]    SCLK仅在减少功耗期间SDRAM存取周期内允许,当SDRAM不进行


                   存取时,SCLK'L'电平


                   0=SCLK总是激活


                   1=SDRAM仅在访问SDRAM期间发出SCLK信号(推荐)


Reserved    [3]    不使用


BK76MAP     [2:0]   BANK6/7存储映射


                    010=128MB/128MB    001=64MB/64MB


                    000=32MB/32MB      111=16MB/16MB


                    110=8MB/8MB        101=4MB/4MB


                    100=2MB/2MB


 


[7]=1Enable burst operation


[5]=1SDRAM power down mode enable


[4]=1SCLK is active only during the access (recommended)


[2:1]=0b10BANK6BANK7对应的地址空间与BANK0-5不同。BANK0-5的地址空间都是固定的128M,地址范围是(x*128M)(x+1)*128M-1x表示05。但是BANK7的起始地址是可变的,本开发板仅使用BANK664M空间,我们可以令位[2:1]=0b10(128M/128M)0b01(64M/64M):这没关系,多出来的空间程序会检测出来,不会发生使用不存在的内存的情况——后面介绍到的bootloaderlinux内核都会作内存检测。


[6]、位[3]没有使用


 


SDRAM模式寄存器设置寄存器(MRSR):


MRSRB6       地址0x4800002C


MRSRB7       地址0x48000030


能让我们修改的只有位[6:4](CL)SDRAM W9825G6EH-75不支持CL=1的情况,所以位[6:4]取值为010(CL=2)011(CL=3)


取最保守的值0b011,所以MRSRB6/7的值为0x30


 


 


其中的head.S如下:


.equ MEM_CTL_BASE, 0x48000000 @BWSCON
.equ SDRAM_BASE, 0x30000000


.text
.global _start
_start:
 bl disable_watch_dog
 bl memsetup
 bl copy_steppingstone_to_sdram
 ldr pc, =on_sdram
on_sdram:
 ldr sp, =0x34000000
 bl main
halt_loop:
 b halt_loop


disable_watch_dog:


 mov r1, #0x53000000
 mov r2, #0x0
 str r2, [r1]
 mov pc, lr


copy_steppingstone_to_sdram:
 mov r1, #0
 ldr r2, =SDRAM_BASE
 mov r3, #4*1024
1:
 ldr r4, [r1], #4
 str r4, [r2], #4
 cmp r1, r3
 bne 1b
 mov pc, lr


memsetup:


 mov r1, #MEM_CTL_BASE
 adrl r2, mem_cfg_val
 add r3, r1, #52
1:
 ldr r4, [r2], #4
 str r4, [r1], #4
 cmp r1, r3
 bne 1b
 mov pc, lr


.align 4
mem_cfg_val:
 .long 0x22011110 @BWSCON
 .long 0x00000700 @BANKCON0
 .long 0x00000700 @BANKCON1
 .long 0x00000700 @BANECON2
 .long 0x00000700 @BANKCON3
 .long 0x00000700 @BANKCON4
 .long 0x00000700 @BANKCON5
 .long 0x00018005 @BANKCON6
 .long 0x00018005 @BANKCON7
 .long 0x008C07A3 @REFRESH
 .long 0x000000B1 @BANKSIZE
 .long 0x00000030 @MRSRB6
 .long 0x00000030 @MRSRB7
 .long 0x00018005 @BANKCON6
 .long 0x00018005 @BANKCON6

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条