ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
777765
AlexG (04.09.2017 09:02, просмотров: 4333)
Прицепил к LPC1788 внешнюю SDRAM. Проверяю - SDRAM глючит, искажается содержимое. Проверяю так:
  • Заполняю кусок последовательными значениями
  • uint16_t* memory_p = (uint16_t*)SDRAM_BASE_ADDR; for(i=0; i<0xFFFF; i++) { memory_p[i]=i; }
  • Проверяю
  • uint16_t tmp1, tmp2; for(i=0; i<0xFFFF; i++) { tmp1 = i; tmp2 = memory_p[i]; if (tmp1!=tmp2) { return false; } } return true; На 496 элементе "массива" всегда сбой, вместо 496 читается 510 стабильно. Причем, до начала цикла проверки в памяти лежит корректное значение. Что это такое вообще может быть? Частота тактирования памяти в допустимы для LPC1788 пределах, в функции инициализации контроллера SDRAM все корректно для выбранного типа памяти (MT48LC4M32B2P-6A): /* Enable EMC clock*/ PCONP_bit.PCEMC = 1; /*The EMC uses CPU clock/2*/ EMCCLKSEL = 1; /*Assign pins to SDRAM controller*/ IOCON_P2_16 = 0x21; IOCON_P2_17 = 0x21; IOCON_P2_18 = 0x21; IOCON_P2_20 = 0x21; IOCON_P2_24 = 0x21; IOCON_P2_28 = 0x21; IOCON_P2_29 = 0x21; IOCON_P2_30 = 0x21; IOCON_P2_31 = 0x21; IOCON_P3_00 = 0x21; IOCON_P3_01 = 0x21; IOCON_P3_02 = 0x21; IOCON_P3_03 = 0x21; IOCON_P3_04 = 0x21; IOCON_P3_05 = 0x21; IOCON_P3_06 = 0x21; IOCON_P3_07 = 0x21; IOCON_P3_08 = 0x21; IOCON_P3_09 = 0x21; IOCON_P3_10 = 0x21; IOCON_P3_11 = 0x21; IOCON_P3_12 = 0x21; IOCON_P3_13 = 0x21; IOCON_P3_14 = 0x21; IOCON_P3_15 = 0x21; IOCON_P3_16 = 0x21; IOCON_P3_17 = 0x21; IOCON_P3_18 = 0x21; IOCON_P3_19 = 0x21; IOCON_P3_20 = 0x21; IOCON_P3_21 = 0x21; IOCON_P3_22 = 0x21; IOCON_P3_23 = 0x21; IOCON_P3_24 = 0x21; IOCON_P3_25 = 0x21; IOCON_P3_26 = 0x21; IOCON_P3_27 = 0x21; IOCON_P3_28 = 0x21; IOCON_P3_29 = 0x21; IOCON_P3_30 = 0x21; IOCON_P3_31 = 0x21; IOCON_P4_00 = 0x21; IOCON_P4_01 = 0x21; IOCON_P4_02 = 0x21; IOCON_P4_03 = 0x21; IOCON_P4_04 = 0x21; IOCON_P4_05 = 0x21; IOCON_P4_06 = 0x21; IOCON_P4_07 = 0x21; IOCON_P4_08 = 0x21; IOCON_P4_09 = 0x21; IOCON_P4_10 = 0x21; IOCON_P4_11 = 0x21; //IOCON_P4_12 = 0x21; IOCON_P4_13 = 0x21; IOCON_P4_14 = 0x21; IOCON_P4_25 = 0x21; /*Init SDRAM controller*/ EMCDLYCTL_bit.CMDDLY = 0x8;// Programmable delay value for EMC outputs in command delayed mode /*Set data read delay*/ EMCDLYCTL_bit.FBCLKDLY = 0x8; /**/ EMCDLYCTL_bit.CLKOUT0DLY = 0x8; // Programmable delay value for the CLKOUT0 output. This would typically be used in clock delayed mode //EMCDLYCTL_bit.CLKOUT1DLY = 0x0; EMCControl = 1; // enable EMC EMCDynamicReadConfig = 1; // Read data strategy - Command delayed strategy, using EMCCLKDELAY (command delayed, clock out not delayed) EMCDynamicRasCas0_bit.CAS = 3;// CAS latency EMCDynamicRasCas0_bit.RAS = 3;// RAS latency (active to read/write delay), Three EMCCLK cycles EMCDynamictRP = P2C(SDRAM_TRP); // Precharge Command Period = 3 EMCCLK cycles EMCDynamictRAS = P2C(SDRAM_TRAS);// EMCDynamictSREX = P2C(SDRAM_TXSR); EMCDynamictAPR = SDRAM_TAPR; EMCDynamictDAL = SDRAM_TDAL+P2C(SDRAM_TRP); EMCDynamictWR = SDRAM_TWR; EMCDynamictRC = P2C(SDRAM_TRC); EMCDynamictRFC = P2C(SDRAM_TRFC); EMCDynamictXSR = P2C(SDRAM_TXSR); EMCDynamictRRD = P2C(SDRAM_TRRD); EMCDynamictMRD = SDRAM_TMRD; EMCDynamicConfig0 = 0x0004500; // 13 row, 9 - col, SDRAM // JEDEC General SDRAM Initialization Sequence // DELAY to allow power and clocks to stabilize ~100 us // NOP EMCDynamicControl = 0x0183; for(volatile int32_t i = 200*30; i; i--); // PALL EMCDynamicControl_bit.I = 2; EMCDynamicRefresh = 2;//2 for(volatile int32_t i= 256; i; --i); // > 128 clk EMCDynamicRefresh = P2C(SDRAM_REFRESH) >> 4; // MODE EMCDynamicControl_bit.I = 1; // Burst 4, Sequential, CAS-3 volatile unsigned long Dummy = *(volatile unsigned short*) ((uint32_t)&SDRAM_BASE_ADDR + (0x33UL << (12))); // NORM EMCDynamicControl = 0x0002; EMCDynamicConfig0_bit.B = 1; for(volatile int32_t i = 100000; i; i--); Во всяком случае, любое изменение приводит к полной неработоспособности памяти. Единственное что я не до конца понял, это почему в регистр MODE микросхемы SDRAM нужно заносить именно 0x33.