1.3.3SDRAM的设置
2440的CPU通过内存控制器与外部的SDRAM相连,开发板上外接有64MB的SDRAM。
有关SDRAM的详细介绍,可以参考《高手进阶 终极内存技术指南-完整进阶版》,附链接https://max.book118.com/html/2017/1224/145792037.shtm
SDRAM的结构和Flash不同,操作Flash时只需要给定一个地址即可,但是操作SDRAM需要三个地址,分别是快地址,行地址,还有列地址。
使用SDRAM,我们只需要设置内存控制器即可,当我们读SDRAM的数据时,内存控制器会:
- 判断范围:根据电路图可以看出,SDRAM接到2440的第六块,起始地址为0x3000,0000;
- 根据类型(SDRAM)拆分地址为块地址,行地址,列地址;(这里需要设置行地址和列地址分别几条线)
- 读数据。
下面是2440需要设置的相关的寄存器。
1.BWSCON,设置外接SDRAM的位宽和等待状态的寄存器。2440外接两个16位的SDRAM,所以DW6设置为10,如果外接的内存类芯片速度很慢,在发出相关时序之后还是不能读取数据,这时候就可以发出WAIT信号,等待一段时间后再去读取数据,根据电路图,并没有外接WAIT信号,所以WS6设置为0,ST6是用于SRAM,我们外接的是SDRAM,故不使用UB/LB,nWBE的意思写某个字节的时候,是否真正写进去,我们的内存是32位的,如果只想去修改其中的某个字节,这个时候就需要用到这个引脚来帮助我们确定具体要写入哪个字节。同理,nBE就是确定想要读哪个字节 。这里我们使用了nWBE但不用nBE,这是由于我们设置的内存类设置为32位,这样每次都会读进来4字节,然后内存控制器会挑出我们要的字节,所以不用设置。一般来说,我们把BANK7设置和BANK6一样,所以这个寄存器设为0x2200,0000。
2.BANKCONn,块控制器,MT设置为11,选择SDRAM控制器,SCAN为列地址的线数,根据芯片手册为9位,设为01,Trcd表示发出行地址后多久可以发出列地址,设置为20ns,所以BANKCON6,BANKCON7寄存器设置为0x18001。
4.REFRESH,SDRAM刷新控制寄存器,SDRAM和DRAM一样,使用时需要动态刷新,所以要使能刷新,设置为自动刷新模式,刷新的周期需要根据芯片手册设定,64 / 8192 = 7.8us,表示7.8us刷新1行。我们的HCLK也为100MHz,所以设为1269 = 0x4F5。
Trp意思为SDRAM行预充电时间,具体功能不熟悉,但是根据芯片手册可以设为20ns,也就是2个周期。
搜索Tsrc找不到结果,根据公式Trc=Tsrc+Trp尝试搜索Trc,意思还是不清楚,但是值可以设置为70ns,所以Tsrc = Trc - Trp = 50ns,所以Tsrc设置为01,所以REFRESH设置为0x8404f5。5.BANKSIZE,首先,BK76MAP设置为001,因为外接的是64MB。然后,burst operation表示是否可以连续访问,即一次访问多个字节 ,设为1,低功耗模式使能设为1,SCLK_EN根据推荐值设为1,所以BANKSIZE = 0xb1。
6.MRSRBn,除了CL外,其他只能选择固定值。**内存控制器读SDRAM时,发出块地址,然后行地址,然后列地址,发完之后它并不能像SRAM那样马上读取数据而是需要等待一定的时钟周期之后,才能读取数据。芯片手册描述如下,可以设置为2或3个时钟周期。这里我们设置为2个clock。需要注意的是,这个值设定之后是会发给SDRAM的,SDRAM的mode register(含有CL)会保存这个值,它以后就会在收到列地址之后,过两个时钟周期才返回数据。**所以MRSRB6,MRSRB7设置为0x20。
综上,2440中SDRAM的初始化设置完毕,然后可以试验一下SDRAM是否可以正常使用。测试代码如下图。