我原来在用atmel9200初始化的时候,记得sdram初始化需要先等待多少us时间,然后预充电,然后写8次刷新什么的,最后写模式寄存器,详细的过程记不清了。
但是这次用s3c2410,网上说SDRAM初始化只需要把BWSCON,BankCON6,Refresh……这几个寄存器写个值就可以了,
请问2410的SDRAM初始化只需要设置几个寄存器吗?为什么没有像9200那样的什么等待、预充电,刷新之类的操作?网上搜得sdram操作过程也应该具备这几个过程
使用SDRAM,这需要设置13个寄存器。这些寄存器很多是类似的:
1.BWSCON:对应BANK0-BANK7,每BANK使用4位。这4位分别表示:
a.STx:启动/禁止SDRAM的数据掩码引脚,对于SDRAM,此位为0;对于SRAM,此位为1。
b.WSx:是否使用存储器的WAIT信号,通常设为0
c.DWx:使用两位来设置存储器的位宽:00-8位,01-16位,10-32位,11-保留。
d.比较特殊的是BANK0对应的4位,它们由硬件跳线决定,只读。
在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的列地址位数,使用SDRAM HY57V561620CT-H,列地址位数为9,所以SCAN=0b01。如果使用其他型号的SDRAM,您需要查看它的数据手册来决定SCAN的取值:00-8位,01-9位,10-10位
2.REFRESH(SDRAM refresh control register):设为0x008e0000+ R_CNT
其中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的数据手册上,可看见这么一行“8192 refresh cycles / 64ms”:所以,刷新周期=64ms/8192 = 7.8125 uS。
对于本实验,R_CNT = 2^11 + 1 – 12 * 7.8125 = 1955,
REFRESH=0x008e0000 + 1955 = 0x008e07a3
3.BANKSIZE:0x000000b2
位[7]=1:Enable burst operation
位[5]=1:SDRAM power down mode enable
位[4]=1:SCLK is active only during the access (recommended)
位[2:1]=010:BANK6、BANK7对应的地址空间与BANK0-5不同。BANK0-5的地址空间都是固定的128M,地址范围是(x*128M)到(x+1)*128M-1,x表示0到5。但是BANK7的起始地址是可变的,您可以从S3C2410数据手册第5章“Table 5-1. Bank 6/7 Addresses”中了解到BANK6、7的地址范围与地址空间的关系。位[6]、位[3]没有使用
4.MRSRB6、MRSRB7:0x00000030
能让我们修改的只有位[6:4](CL),SDRAM HY57V561620CT-H不支持CL=1的情况,所以位[6:4]取值为010(CL=2)或011(CL=3)。
只写这几个寄存器就够吗 不需要8次刷新之类的操作呀
sdram的操作规范都是这样要求的 需要8次刷新……