我用的芯片是LPC2468,SDRAM是K4S561632H,在调试EMC模块(SDRAM)的时候碰到下面的问题,请教周工及高手帮忙<br />EMC_DYN_RP = 2; /* command period: 3(n+1) clock cycles */<br /> EMC_DYN_RAS = 3; /* RAS command period: 4(n+1) clock cycles */<br /> EMC_DYN_SREX = 7; /* Self-refresh period: 8(n+1) clock cycles */<br /> EMC_DYN_APR = 2; /* Data out to active: 3(n+1) clock cycles */<br /> EMC_DYN_DAL = 5; /* Data in to active: 5(n+1) clock cycles */<br /> EMC_DYN_WR = 1; /* Write recovery: 2(n+1) clock cycles */<br /> EMC_DYN_RC = 5; /* Active to Active cmd: 6(n+1) clock cycles */<br /> EMC_DYN_RFC = 5; /* Auto-refresh: 6(n+1) clock cycles */<br /> EMC_DYN_XSR = 7; /* Exit self-refresh: 8(n+1) clock cycles */<br /> EMC_DYN_RRD = 1; /* Active bank A->B: 2(n+1) clock cycles */<br /> EMC_DYN_MRD = 2; /* Load Mode to Active cmd: 3(n+1) clock cycles */<br /> EMC_DYN_RD_CFG = 1; /* Command delayed strategy */<br /> /* Default setting, RAS latency 3 CCLKs, CAS latenty 3 CCLKs. */<br /> EMC_DYN_RASCAS0 = 0x00000303;<br />//#if ENG_BOARD_LPC24XX /* NXP engineering board */<br /> /* 256MB, 16Mx16, 4 banks, row=12, column=9 */<br /> //EMC_DYN_CFG0 = 0x00000480;<br />//#else /* Embedded Artists board */<br /> /* 256MB, 16Mx16, 4 banks, row=13, column=9 */<br /> EMC_DYN_CFG0 = 0x00000680;<br />//#endif<br /> delayMs(1, 100); /* use timer 1 */<br /> /* Mem clock enable, CLKOUT runs, send command: NOP */<br /> EMC_DYN_CTRL = 0x00000183;<br /> delayMs(1, 200); /* use timer 1 */<br /> <br /> /* Send command: PRECHARGE-ALL, shortest possible refresh period */<br /> EMC_DYN_CTRL = 0x00000103;<br /> /* set 32 CCLKs between SDRAM refresh cycles */<br /> EMC_DYN_RFSH = 0x00000002;<br /> for(i = 0; i < 0x40; i++); /* wait 128 AHB clock cycles */<br /> <br /> /* set 28 x 16CCLKs=448CCLK=7us between SDRAM refresh cycles */<br /> EMC_DYN_RFSH = 28;<br /> <br /> /* To set mode register in SDRAM, enter mode by issue<br /> MODE command, after finishing, bailout and back to NORMAL mode. */ <br /> /* Mem clock enable, CLKOUT runs, send command: MODE */<br /> EMC_DYN_CTRL = 0x00000083;<br /> <br /> /* Set mode register in SDRAM */<br /> /* Mode regitster table for Micron's MT48LCxx */<br /> /* bit 9: Programmed burst length(0)<br /> bit 8~7: Normal mode(0)<br /> bit 6~4: CAS latency 3<br /> bit 3: Sequential(0)<br /> bit 2~0: Burst length is 8<br /> row position is 12 */<br /> dummy = *((volatile DWORD *)(SDRAM_BASE_ADDR | (0x33 << 12)));<br /> <br /> EMC_DYN_CTRL = 0x00000000; /* Send command: NORMAL */<br /> EMC_DYN_CFG0 |= 0x00080000; /* Enable buffer */<br /> delayMs(1, 1); /* Use timer 1 */<br /> return;<br />}<br /><br />1。请问一下这条指令是为了实现什么功能?dummy = *((volatile DWORD *)(SDRAM_BASE_ADDR | (0x33 << 12)));<br />2。为何要写四个EMC_DYN_CTRL(红色部分)?一定要这样的顺序写吗?<br />3。我现在遇到了个问题,比如我第一次存入256个字节(1到256的数)到SDRAM,显示结果没问题,之后重新上电,看到SDRAM为全0,第二次写入10个字节(全为0)到SDRAM,显示结果确是低10个字节是全0,但是从第10个字节之后的数确是我第一次存入的那些数(两次存的起始地址是一样)怎么会这样? |
|