Chinaunix首页 | 论坛 | 博客
  • 博客访问: 452012
  • 博文数量: 72
  • 博客积分: 3186
  • 博客等级: 中校
  • 技术积分: 1039
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-07 16:53
文章分类

全部博文(72)

文章存档

2012年(1)

2011年(5)

2010年(10)

2009年(56)

我的朋友

分类: 嵌入式

2009-09-21 19:21:37

sdram控制器的初始化,无非就是向相应的特殊功能寄存器中写值.翻开2410的数据手册,可以看到,sdram有13个特殊功能寄存器,从0x48000000开始向高低连排布.那么我们只要配置好这13个寄存器就完成了对sdram的初始化.


mem_cfg_val:
    .long 0x22111110      @ vBWSCON
    .long 0x00000700      @ vBANKCON0
    .long 0x00000700      @ vBANKCON1
    .long 0x00000700      @ vBANKCON2
    .long 0x00000700      @ vBANKCON3
    .long 0x00000700      @ vBANKCON4
    .long 0x00000700      @ vBANKCON5
    .long 0x00018005      @ vBANKCON6
    .long 0x00018005      @ vBANKCON7
    .long 0x008e0459      @ vREFRESH
    .long 0xb2            @ vBANKSIZE
    .long 0x30            @ vMRSRB6
    .long 0x30            @ vMRSRB7


以上这一段,相当于定义了一个数组,数组名(即数组的首地址)为mem_cfg_val.该数组的长度为13,数组中的每个元素都存放着一个32位的具体数值.我们只要将这个数组的值一一对应的赋给0x48000000开始的13个寄存器即可.

这些数组里的值是如何确定的呢?即,我们将sdram初始化成一个什么样的状态呢?那么我们来一个一个的分析吧:

1. BWSCON
主要控制总线宽度
总共有8个bank,每个bank用4位来控制,共8*4=32位.正好以16进制写出时,每个数字即控制一个bank.
这里我们的sdram放在bank6,所以主要对sdram6要配置正确.
0x22111110 : bank[7:6] 32位总线. bank[5:1] 16位 bank0特殊一些,由OM[1:0]控制,硬件电路里可由跳线来配置.

2. BANKCON
对于bank[5:0],可以不管它,采用默认值0x00000700即可.
对于bank[7:6],由于只有这两个bank能放置ram,所以配置起来会特殊一些.0x00018005.具体可参考数据手册和<2410完全开发流程>,上面讲得很清楚.

3. REFRESH
控制sdram的自刷新.这里我算出来的是0x008e04f3
计算公式为2^11 + 1 - 100 * (64*1000/8192) = 4f3
不知道这个有没有影响.

4. BANKSIZE
bank[7:6]的大小是可配置的,就在这里配置.配置多了没关系,程序可以检测出来.

5. MRSRB
参见参考资料


-----------------------------------------------------------------------------------------
参考资料: <2410完全开发流程>
          <2410数据手册>
阅读(1203) | 评论(0) | 转发(0) |
0

上一篇:code工具学习-gcc

下一篇:vivi分析-memtest

给主人留下些什么吧!~~