|
本帖最后由 shandian 于 2014-2-9 23:42 编辑
硬件为LPC1788外扩两片K4S561632E-TC75,组成32bit位宽512Mbit的内存。可是数据读写测试总是通不过,每次校验的时候总会有一小段数据为0,而不等于写入的数据。而且每次运行错误的位置都是不同的。
如果只使用其中1片SDRAM,程序改为16bit位宽的话,可以顺利通过内存测试。
使用两片SDRAM芯片的时候每次出错地址都不同,而且我有两块板子,存在的问题都一样,所以我觉得应该不是硬件的问题(布线的时候SDRAM倒是没有做等长处理,但是我觉得才60MHz,不等长应该也没问题)。
不知道有没有人遇到过相同的问题?
以下是我的原理图和SDRAM控制器的初始化代码?大家帮我看看有没问题。
接线:
初始化代码:
SDRAM.h
- #define SDRAM_BASE_ADDR 0xA0000000
- #define SDRAM_SIZE 0x04000000 /* 64M */
- #define SDRAM_REFRESH 7813 // 'tREFRESH = 64ms/8192'
- #define SDRAM_TRP 20 // 'tRP = 20ns'
- #define SDRAM_TRAS 45 // 'tRAS = 45ns'
- #define SDRAM_TAPR 1 // 'tAPR = 1CLK
- #define SDRAM_TDAL 3 // 'tDAL = 2CLK + tRP'
- #define SDRAM_TWR 3 // 'tWR = 2CLK'
- #define SDRAM_TRC 65 // 'tRC = 65'
- #define SDRAM_TRFC 66 // 'tRFC = 65'
- #define SDRAM_TXSR 67 // 'tXSR = 1CLK'
- #define SDRAM_TRRD 15 // 'tRRD = 15'
- #define SDRAM_TMRD 3 // 'tMRD = 2CLK'
复制代码
SDRAM.c
- void SDRAM_Init( void )
- {
- volatile uint32_t i;
- volatile unsigned long Dummy;
- // PINSEL_ConfigPin(2,14,1); /* P2.14 - /EMC_CS2 */
- // PINSEL_ConfigPin(2,15,1); /* P2.15 - /EMC_CS3 */
- PINSEL_ConfigPin(2,16,1); /* P2.16 - /EMC_CAS */
- PINSEL_ConfigPin(2,17,1); /* P2.17 - /EMC_RAS */
- PINSEL_ConfigPin(2,18,1); /* P2.18 - EMC_CLK[0] */
- // PINSEL_ConfigPin(2,19,1); /* P2.19 - EMC_CLK[1] */
- PINSEL_ConfigPin(2,20,1); /* P2.20 - EMC_DYCS0 */
- // PINSEL_ConfigPin(2,21,1); /* P2.21 - EMC_DYCS1 */
- // PINSEL_ConfigPin(2,22,1); /* P2.22 - EMC_DYCS2 */
- // PINSEL_ConfigPin(2,23,1); /* P2.23 - EMC_DYCS3 */
- PINSEL_ConfigPin(2,24,1); /* P2.24 - EMC_CKE0 */
- // PINSEL_ConfigPin(2,25,1); /* P2.25 - EMC_CKE1 */
- // PINSEL_ConfigPin(2,26,1); /* P2.26 - EMC_CKE2 */
- // PINSEL_ConfigPin(2,27,1); /* P2.27 - EMC_CKE3 */
- PINSEL_ConfigPin(2,28,1); /* P2.28 - EMC_DQM0 */
- PINSEL_ConfigPin(2,29,1); /* P2.29 - EMC_DQM1 */
- PINSEL_ConfigPin(2,30,1); /* P2.30 - EMC_DQM2 */
- PINSEL_ConfigPin(2,31,1); /* P2.31 - EMC_DQM3 */
- // PINSEL_ConfigPin(4,24,1); /* P4.24 - /EMC_OE */
- PINSEL_ConfigPin(4,25,1); /* P4.25 - /EMC_WE */
- // PINSEL_ConfigPin(4,30,1); /* P4.30 - /EMC_CS0 */
- // PINSEL_ConfigPin(4,31,1); /* P4.31 - /EMC_CS1 */
- for(i = 0; i < 32; i++)
- {
- PINSEL_ConfigPin(3,i,1); /* P3.0-P3.31 - EMC_D[0-31] */
- }
- for(i = 0; i < 15; i++)
- {
- PINSEL_ConfigPin(4,i,1); /* P4.0-P4.14 - EMC_A[0-14] */
- }
- // EMC_Init();
- // Init SDRAM controller
- LPC_SC->PCONP |= 0x00000800;
- /*Init SDRAM controller*/
- LPC_SC->EMCDLYCTL |= (8<<0);
- /*Set data read delay*/
- LPC_SC->EMCDLYCTL |=(8<<8);
- LPC_SC->EMCDLYCTL |= (0x08 <<16);
- LPC_EMC->Control =1;
- LPC_EMC->DynamicReadConfig = 1;
- LPC_EMC->DynamicRasCas0 = 0;
- LPC_EMC->DynamicRasCas0 |=(3<<8);
- LPC_EMC->DynamicRasCas0 |= (3<<0);
- LPC_EMC->DynamicRP = P2C(SDRAM_TRP);
- LPC_EMC->DynamicRAS = P2C(SDRAM_TRAS);
- LPC_EMC->DynamicSREX = P2C(SDRAM_TXSR);
- LPC_EMC->DynamicAPR = SDRAM_TAPR;
- LPC_EMC->DynamicDAL = SDRAM_TDAL+P2C(SDRAM_TRP);
- LPC_EMC->DynamicWR = SDRAM_TWR;
- LPC_EMC->DynamicRC = P2C(SDRAM_TRC);
- LPC_EMC->DynamicRFC = P2C(SDRAM_TRFC);
- LPC_EMC->DynamicXSR = P2C(SDRAM_TXSR);
- LPC_EMC->DynamicRRD = P2C(SDRAM_TRRD);
- LPC_EMC->DynamicMRD = SDRAM_TMRD;
- // 13 row, 9 - col, SDRAM
- LPC_EMC->DynamicConfig0 = 0x0004680;
- // JEDEC General SDRAM Initialization Sequence
- // DELAY to allow power and clocks to stabilize ~100 us
- // NOP
- LPC_EMC->DynamicControl = 0x0183;
- for(i= 200*30; i;i--);
- // PALL
- LPC_EMC->DynamicControl = 0x0103;
- LPC_EMC->DynamicRefresh = 2;
- for(i= 256; i; --i); // > 128 clk
- LPC_EMC->DynamicRefresh = P2C(SDRAM_REFRESH) >> 4;
- // COMM
- LPC_EMC->DynamicControl = 0x00000083; /* Issue MODE command */
- Dummy = *((volatile uint32_t *)(SDRAM_BASE_ADDR | (0x32<<13)));
- // NORM
- LPC_EMC->DynamicControl = 0x0000;
- LPC_EMC->DynamicConfig0 |=(1<<19);
- for(i = 100000; i;i--);
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|