sdram初始化
1.主要是寄存器的设置
- 1.1 BWSCON
STx:网上资料说是什么启动/禁止SDRAM的数据掩码引脚,对于SDRAM,此位为0;对于SRAM,此位为1,也不知道对不对,不确定的情况就参考u-boot的设置
#define B6_BWSCON (DW32)
#define B7_BWSCON (DW32)
SMRDATA:
.word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
所以bit[31:28] = 0010'b表示数据宽度为32bit,16位不够寻址64MByte,s6设置成同样的值
例子里是这么设置的
p[0] = 0x22011110; //BWSCON
但是你也可以设置成下面的值,sdram也能工作
p[0] = 0x22000000; //BWSCON
现在是把例子里的值改成了自己设置的,下载进去也能跑起来,并且通过openjtag读取寄存器,确实是自己设置的值
> mdw 0x48000000
0x48000000: 22000000
- sdram的原理图
- 1.2 BANKCON0-BANKCON7
这里我们只关心6和7,其他使用默认值即可,这里涉及到时序图需要参考cpu手册和sdram手册来进行设置
cpu手册nGCS时序图
- MT
选择sdram,也就是11
bit[16:15] = 11'b
-
Tacs:地址信号稳定稳定一段时间,发出片选信号,其实也叫地址建立时间.
sdram时序图,从下图看,应该是可以同时发出来的,实际应用这些参数都是可以通过程序进行调节的,在确保程序正常工作时调到最小,这里我们先设为1,
Tacs = 0x1 [14:13] = 0x1
- Tcos:在发出oe或者we信号之前,cs片选信号已经稳定的时间,从下面的时序图上看,两者也是可以同时发出的.这里先选为0x1好了
Tcos bit[12:11] = 0x1'b
- Tacc 读写信号脉冲肯定要保持一定的宽度才能正确被识别,这个就是脉冲应该维持多长时间,从图上看应该是TIS+TIH的值,参考sdram时间参考表那张图,图中的时间都是ns,从描述上看是建立时间加上保持时间,应该就是这个,我们用的是-6系列的芯片
Tacc bit[10:8] = 000'b,这里是1 个clock(周期是10ns),HCLK是100MHZ,应该够使用了
- Tcoh读写信号之后,片选信号还要维持多久,从Tacc脉冲宽度那张图,看着好像不需要预留这个时间
Tcoh bit[7:6] = 01'b这里预留1 个 clock吧
- Tcah 这个是片选信号过后,地址线的数据还要维持多久,看起来好像也不需要,这里也预留1个clock好了
Tcah bit[5:4] = 01'b
- Trcd RAS到CAS的延迟,这个时间应该是activitate一行后,隔多久sdram才准备好接受你的读写操作(也可以说列地址才能发出来,因为从时序上看,读写操作和列地址是在同一个时钟沿有效的,所以应该是同一时间发生的两件事情,采用哪一种说法应该都没问题),参考时间表那张图,应该最小是18ns,这里我们这是为0好了
Trcd [3:2] = 00'b 2个 clock
- SCAN列地址的位宽 column address A0-A8
设为01
最终这个寄存器的值就是
bankcon6 = 0x18851,设置成0x18005也是能够正常工作的,就是上面那些所有设置成预留一个clock的变成0.
2.3 REFRESH
- REFEN 使能控制,使能设为1
- TREFMD 刷新模式控制寄存器位
- Trp [21:20] SDRAM RAS pre-charge Time,pre-charge需要多长时间,最小是18ns,这里选00,2个clock
- Tsrc [19:18]: activate命令激活same bank最小的时间间隔是trc 而trp + tsrc = trc, trc参照手册 最小是60ns,我们取70ns吧!这样tsrc就是4 clock,取00
The minimum time interval between successive BankActivate commands to the same bank is defined by tRC(min.).
- Refresh Counter [10:0] 刷新周期的控制
sdram:8192 refresh cycles/64ms刷新周期是8192行耗时64ms,周期就是64ms/8192,只能比这个周期快,不能慢,满了就要丢失数据了.
64ms/8192 >= (2048 + 1 - counter)/100MHZ
counter >= 2049 - 781.25 = 1267.75,
这里我们取1269好了,刚好周期是7.8us
最终该寄存器的值是 0x8004f5
2.4 BANKSIZE
- BURST_EN [7] 使能突发操作
- SCKE_EN [5] 这一位使不使能都能正常工作,以防万一,使能上
- BK76MAP [2:0] 这里映射成32M/和32M不能正常工作,只能映射64或128以上
2.5 MRSRB6和MRSRB7
WBL [9] Write burst length 这里我们选为0,设置成了1也是能够正常工作的
0: Burst (Fixed)
1: ReservedTM [8:7] Test mode 设置为00,试了一下配置成01也能正常工作
00: Mode register set (Fixed)
01, 10 and 11: Reserved
8 Mode Register Set command (RAS# = "L", CAS# = "L", WE# = "L", A0-A12 = Register Data)
The mode register stores the data for controlling the various operating modes of SDRAM. The Mode Register Set command programs the values of CAS# latency, Addressing Mode and Burst Length in the Mode register to make SDRAM useful for a variety of different applications. The default values of the Mode Register after power-up are undefined;
-----mode寄存器配置sdram的地址模式,cas latency,和突发长度以适用不同的应用场景,默认值是不确定的
therefore this command must be issued at the power-up sequence.
-----因此上电的时候需要发出这个命令
The state of pins A0~A9 and A12 in the same cycle is the data written to the mode register. Two clock cycles are required to complete the write in the mode register (refer to the following figure). The contents of the mode register can be changed using the same command and the clock cycle requirements during operation as long as all banks are in the idle state.
-----a0-a9,a12引脚上的值就是写入该寄存器的值,上电之后也能进行更改,只要all bank是空闲的
CL [6:4] CAS latency这个值应该是根据sdram芯片支持的cas latency配置的
000 = 1 clock, 010 = 2 clocks, 011=3 clocksBT [3] Burst type 设为0
0: Sequential (Fixed)
1: ReservedBL [2:0] Burst length 这里设为000
000: 1 (Fixed)
Others: Reserved
以下是例程提供的设置.
p[0] = 0x22011110; //BWSCON
p[1] = 0x00000700; //BANKCON0
p[2] = 0x00000700; //BANKCON1
p[3] = 0x00000700; //BANKCON2
p[4] = 0x00000700; //BANKCON3
p[5] = 0x00000700; //BANKCON4
p[6] = 0x00000700; //BANKCON5
p[7] = 0x00018005; //BANKCON6
p[8] = 0x00018005; //BANKCON7
/* REFRESH,
* HCLK=12MHz: 0x008C07A3,
* HCLK=100MHz: 0x008C04F4
*/
p[9] = 0x008C04F4;
p[10] = 0x000000B1; //BANKSIZE
p[11] = 0x00000030; //MRSRB6
p[12] = 0x00000030; //MRSRB7