AlexG (04.09.2017 09:02, просмотров: 4325)
Прицепил к 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.