裸板程序记录之sdram初始化-s3c2440

sdram初始化

1.主要是寄存器的设置

裸板程序记录之sdram初始化-s3c2440_第1张图片
sdram相关的寄存器
  • 1.1 BWSCON
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初始化-s3c2440_第2张图片
BWSCON
裸板程序记录之sdram初始化-s3c2440_第3张图片
内存映射图
  • sdram的原理图
裸板程序记录之sdram初始化-s3c2440_第4张图片
sdram的原理图
  • 1.2 BANKCON0-BANKCON7
裸板程序记录之sdram初始化-s3c2440_第5张图片
寄存器示意图

这里我们只关心6和7,其他使用默认值即可,这里涉及到时序图需要参考cpu手册和sdram手册来进行设置
cpu手册nGCS时序图

裸板程序记录之sdram初始化-s3c2440_第6张图片
cpu sdram读时序图
裸板程序记录之sdram初始化-s3c2440_第7张图片
cpu sdram写时序图
  • MT
     选择sdram,也就是11
bit[16:15] = 11'b
  • Tacs:地址信号稳定稳定一段时间,发出片选信号,其实也叫地址建立时间.
    sdram时序图,从下图看,应该是可以同时发出来的,实际应用这些参数都是可以通过程序进行调节的,在确保程序正常工作时调到最小,这里我们先设为1,


    裸板程序记录之sdram初始化-s3c2440_第8张图片
    Tacs
Tacs = 0x1 [14:13] = 0x1
  • Tcos:在发出oe或者we信号之前,cs片选信号已经稳定的时间,从下面的时序图上看,两者也是可以同时发出的.这里先选为0x1好了
Tcos bit[12:11] = 0x1'b
裸板程序记录之sdram初始化-s3c2440_第9张图片
sdramTcos
  • Tacc 读写信号脉冲肯定要保持一定的宽度才能正确被识别,这个就是脉冲应该维持多长时间,从图上看应该是TIS+TIH的值,参考sdram时间参考表那张图,图中的时间都是ns,从描述上看是建立时间加上保持时间,应该就是这个,我们用的是-6系列的芯片
Tacc bit[10:8] = 000'b,这里是1 个clock(周期是10ns),HCLK是100MHZ,应该够使用了
裸板程序记录之sdram初始化-s3c2440_第10张图片
Tacc脉冲宽度
裸板程序记录之sdram初始化-s3c2440_第11张图片
sdram时间参考表
  • 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
裸板程序记录之sdram初始化-s3c2440_第12张图片
Trcd时间

最终这个寄存器的值就是

bankcon6 = 0x18851,设置成0x18005也是能够正常工作的,就是上面那些所有设置成预留一个clock的变成0.

2.3 REFRESH

裸板程序记录之sdram初始化-s3c2440_第13张图片
REFRESH
  • REFEN 使能控制,使能设为1
  • TREFMD 刷新模式控制寄存器位
  • Trp [21:20] SDRAM RAS pre-charge Time,pre-charge需要多长时间,最小是18ns,这里选00,2个clock
Trp
  • 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.).

Trc
  • 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
裸板程序记录之sdram初始化-s3c2440_第14张图片
Refresh Counter

2.4 BANKSIZE

  • BURST_EN [7] 使能突发操作
BURST_EN
  • 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: Reserved

  • TM [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 clocks

  • BT [3] Burst type 设为0
    0: Sequential (Fixed)
    1: Reserved

  • BL [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

你可能感兴趣的:(裸板程序记录之sdram初始化-s3c2440)