16+
Суббота
23 сентября
Вход |Карта сайта | |Upload |codebook | PARTS

 О смысле всего сущего 0xFF

 Средства и методы разработки

 Мобильная и беспроводная связь

 Блошиный рынок Объявления

caxapa

Микроконтроллеры ARM 

AVR PIC MSP PLD,FPGA,DSP 

Кибернетика Технологии 

Схемы, платы, компоненты 

ARM-контроллеры

 
   Новая тема Правила Регистрация Поиск »» Архив
Вернуться в конференциюТопик полностью
AlexG  (04.09.2017 09:02, просмотров: 566)
Прицепил к 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.
     [x][x][x][x][x][x] [x][x][x][x][x][x][x][x]

    Тема выделяется по переводу строки или автоматом

     

    Имя


    Регистрация позволит вам редактировать и перемещать ваши сообщения и прикреплять к ним файлы.
     
    Символы: á é ó ú ý « »
    Главная | Карта сайта | О проекте | Проекты | Файлообменник | Регистрация | Вебмастер | RSS
    Лето 7526 от сотворения мира. При использовании материалов сайта ссылка на caxapу обязательна.
    MMI © MMXVII