打印
[ZLG-ARM]

SDRAM问题

[复制链接]
1426|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ybqchj|  楼主 | 2009-2-10 10:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的芯片是LPC2468,SDRAM是K4S561632H,在调试EMC模块(SDRAM)的时候碰到下面的问题,请教周工及高手帮忙
EMC_DYN_RP     = 2;  /* command period: 3(n+1) clock cycles */
  EMC_DYN_RAS    = 3;  /* RAS command period: 4(n+1) clock cycles */
  EMC_DYN_SREX   = 7;  /* Self-refresh period: 8(n+1) clock cycles */
  EMC_DYN_APR    = 2;  /* Data out to active: 3(n+1) clock cycles */
  EMC_DYN_DAL    = 5;  /* Data in to active: 5(n+1) clock cycles */
  EMC_DYN_WR     = 1;  /* Write recovery: 2(n+1) clock cycles */
  EMC_DYN_RC     = 5;  /* Active to Active cmd: 6(n+1) clock cycles */
  EMC_DYN_RFC    = 5;  /* Auto-refresh: 6(n+1) clock cycles */
  EMC_DYN_XSR    = 7;  /* Exit self-refresh: 8(n+1) clock cycles */
  EMC_DYN_RRD    = 1;  /* Active bank A->B: 2(n+1) clock cycles */
  EMC_DYN_MRD    = 2;  /* Load Mode to Active cmd: 3(n+1) clock cycles */
  EMC_DYN_RD_CFG = 1;  /* Command delayed strategy */
  /* Default setting, RAS latency 3 CCLKs, CAS latenty 3 CCLKs. */
  EMC_DYN_RASCAS0 = 0x00000303;
//#if ENG_BOARD_LPC24XX  /* NXP engineering board */
  /* 256MB, 16Mx16, 4 banks, row=12, column=9 */
  //EMC_DYN_CFG0 = 0x00000480;
//#else      /* Embedded Artists board */
  /* 256MB, 16Mx16, 4 banks, row=13, column=9 */
  EMC_DYN_CFG0 = 0x00000680;
//#endif
  delayMs(1, 100);   /* use timer 1 */
  /* Mem clock enable, CLKOUT runs, send command: NOP */
  EMC_DYN_CTRL = 0x00000183;
  delayMs(1, 200);   /* use timer 1 */
    
  /* Send command: PRECHARGE-ALL, shortest possible refresh period */
  EMC_DYN_CTRL = 0x00000103;
  /* set 32 CCLKs between SDRAM refresh cycles */
  EMC_DYN_RFSH = 0x00000002;
  for(i = 0; i < 0x40; i++); /* wait 128 AHB clock cycles */
    
  /* set 28 x 16CCLKs=448CCLK=7us between SDRAM refresh cycles */
  EMC_DYN_RFSH = 28;
    
  /* To set mode register in SDRAM, enter mode by issue
  MODE command, after finishing, bailout and back to NORMAL mode. */    
  /* Mem clock enable, CLKOUT runs, send command: MODE */
  EMC_DYN_CTRL = 0x00000083;
  
  /* Set mode register in SDRAM */
  /* Mode regitster table for Micron's MT48LCxx */
  /* bit 9:   Programmed burst length(0)
     bit 8~7: Normal mode(0)
  bit 6~4: CAS latency 3
  bit 3:   Sequential(0)
  bit 2~0: Burst length is 8
  row position is 12 */
  dummy = *((volatile DWORD *)(SDRAM_BASE_ADDR | (0x33 << 12)));
  
  EMC_DYN_CTRL = 0x00000000;   /* Send command: NORMAL */
  EMC_DYN_CFG0 |= 0x00080000;   /* Enable buffer */
  delayMs(1, 1);      /* Use timer 1 */
  return;
}

1。请问一下这条指令是为了实现什么功能?dummy = *((volatile DWORD *)(SDRAM_BASE_ADDR | (0x33 << 12)));
2。为何要写四个EMC_DYN_CTRL(红色部分)?一定要这样的顺序写吗?
3。我现在遇到了个问题,比如我第一次存入256个字节(1到256的数)到SDRAM,显示结果没问题,之后重新上电,看到SDRAM为全0,第二次写入10个字节(全为0)到SDRAM,显示结果确是低10个字节是全0,但是从第10个字节之后的数确是我第一次存入的那些数(两次存的起始地址是一样)怎么会这样?

相关帖子

沙发
msleep| | 2009-4-2 17:52 | 只看该作者

这个问题就是比较奇怪

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

56

帖子

0

粉丝