BWSCON中每4位控制一个BANK,最高四位对应BANK7,……
(1)STx:启动/禁止SDRAM的数据掩码引脚,对于SDRAM,此位为0;对于SRAM,此位为1。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
(2)WSx:是否使用存储器的WAIT信号,通常设为0。
(3)DWx:使用两位来设置存储器的位宽:00-8位,01-16位,10-32位,11-保留。
比较特殊的是BANK0对应的4位,它们由硬件跳线决定,只读。
BANKCON0-BANKCON5的相关设置可以参考手册,我没用到,使用默认值0x00000700即可。
BANKCON6-BANKCON7:
在8个BANK中,只有BANK6和BANK7可以使用SRAM或SDRAM,所以BANKCON6-7与BANKCON0-5有点不同:
a.MT([16:15]):用于设置本BANK外接的是SRAM还是SDRAM:SRAM-0b00,SDRAM-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。
4.REFRESH(SDRAM refresh control register):设为0x008C0000+ R_CNT(参考网上时,发现别人用的是0x008e0000自认为是错的)
因为从下面可以算出:
REFEN[23]:开启刷新功能,设为1
TREFMD[22]:设为Auto refresh模式,设为0
Trp[21:20]:看看RAS precharge Time,查看SDRAM手册,发现-H系列此参数至少为20ns,现在Hclk对应的时钟周期为10ns,所以至少应该为2个clock。可以设为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时钟频率等于晶振频率12MHz;SDRAM的刷新周期在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]=1:Enable burst operation
位[5]=1:SDRAM power down mode enable
位[4]=1:SCLK is active only during the access (recommended)
位[2:1]=0b10:BANK6、BANK7对应的地址空间与BANK0-5不同。BANK0-5的地址空间都是固定的128M,地址范围是(x*128M)到(x+1)*128M-1,x表示0到5。但是BANK7的起始地址是可变的,本开发板仅使用BANK6的64M空间,我们可以令位[2:1]=0b10(128M/128M)或0b01(64M/64M):这没关系,多出来的空间程序会检测出来,不会发生使用不存在的内存的情况——后面介绍到的bootloader和linux内核都会作内存检测。
位[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条评论)
登录后参与讨论