Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подключаем 3,3V SDRAM к LPC3250
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
V_TC
Здравствуйте, уважаемые форумчане!
Помогите разобраться с подключением SDRAM к LPC3250. В доступных примерах подключения для питания SDRAM (или DDR SDRAM) используется напряжение 1,8 или 2,5В. Однако напряжение 3,3В для питания SDRAM заявлено в даташите как допустимое. Используем память MT48LC16M16A2BG-75IT при питании 3,3В. Схема подключения SDRAM к LPC3520 -
Нажмите для просмотра прикрепленного файла
scorp1969
главное запитайте те IO которые относятся к SDRAM тоже 3.3В(VDD_EMC), но при этом не забудьте что и другие IO относящиеся к той ветке питаниа(VDD_EMC) тоже будут иметь 3.3В вход/выход.
а в чём проблема то? вроде всё правильно.
V_TC
Проблема в следующем:
в IAR EWARM v5.4 проект из примера записывает код во внутреннее ОЗУ и исполняет его корректно. При записи во внешнее ОЗУ для исполнения Debug Log выдает сообщение о том, что не может записать данные в память. Записываются разные байты, но считываются всегда нули. Ошибки выдаются по всем адресам внешнего ОЗУ, начиная с начального. После 200 ошибок процесс завершается фатально.
zltigo
А слабо начать с написания простейших тестов памяти запускаемых из внутренней SRAM, вместо пустых рассуждений об неисполнении некоего кода залитого в SDRAM? Простейшие вещи можно просто попробовать потестировать через JTAG написав скриптик. Ну и осциллограф в руки...
V_TC
Согласен. Раз схема подключения SDRAM сомнений не вызывает, попробуем использовать осциллограф.
zltigo
Цитата(V_TC @ Jun 8 2010, 16:16) *
Согласен. Раз схема подключения SDRAM сомнений не вызывает..

Я не смотрел sad.gif
scorp1969
Цитата(V_TC @ Jun 8 2010, 12:25) *
Проблема в следующем:
в IAR EWARM v5.4 проект из примера записывает код во внутреннее ОЗУ и исполняет его корректно. При записи во внешнее ОЗУ для исполнения Debug Log выдает сообщение о том, что не может записать данные в память. Записываются разные байты, но считываются всегда нули. Ошибки выдаются по всем адресам внешнего ОЗУ, начиная с начального. После 200 ошибок процесс завершается фатально.

если вы пользуетесь дебагером то он использует фаил типа LPC3250_SDRAM.mac(зависит от проекта, посмотрите в настроиках) для загрузки SDRAM. в нём команды инициализации SDRAM. естественно они для SDRAM установленнои на китовои плате. вам нужно изменить параметры под вашу SDRAM учитывая и режим питания. не забудьте потом такую же инициализацию делать в основной програме

вот тут еще почитаите про address memory mapping, у вас же похоже 16-bit интерфеис а не 32, или забыли вторую микруху на верхнюю шину данных?
http://www.ctpim.org.br/lpc24xx_esternalmemory.pdf
toweroff
Цитата(scorp1969 @ Jun 8 2010, 18:46) *
у вас же похоже 16-bit интерфеис а не 32, или забыли вторую микруху на верхнюю шину данных?

+1
если микросхема памяти одна, адресацию нужно начинать с A1 процессора
scorp1969
Цитата(toweroff @ Jun 8 2010, 16:15) *
+1
если микросхема памяти одна, адресацию нужно начинать с A1 процессора

нет, это для static RAM верно но не для dynamic. в документе по ссылке есть инфа.
V_TC
Мы рассчитывали на возможность использования 16-ти разрядной шины данных:
"16-bit and 32-bit wide SDRAM memory support".
Документ действительно интересный. В примере подключения 16-ти разрядной SDRAM
использован именно наш чип памяти с питанием 3,3В. Но налицо отличие в использовании
сигнала CKEx для 16-ти разрядной шины: мы используем CKE0, а в документe - CKE1.
Ладно, завтра продолжим разбираться: почему рекомендуют использовать SDRAM bank 1, а не bank 0?
scorp1969
Цитата(V_TC @ Jun 8 2010, 16:36) *
Так вроде ж LPC3250 должен поддерживать и 16-ти разрядную шину:
"16-bit and 32-bit wide SDRAM memory support"

я не говорю что не будет работать. соединение вроде правильное. осталось проинициализировать систему правильно. судя по ошибкам в каждом баите вроде пока дело не в 16-бит конфигурации а в глобальном режиме работы EMC.

кстати в ссылке что я дал вроде пример инициализации даже вашеи микросхемы

Цитата(V_TC @ Jun 8 2010, 16:36) *
Мы рассчитывали на возможность использования 16-ти разрядной шины данных:
"16-bit and 32-bit wide SDRAM memory support".
Документ действительно интересный. В примере подключения 16-ти разрядной SDRAM
использован именно наш чип памяти с питанием 3,3В. Но налицо отличие в использовании
сигнала CKEx для 16-ти разрядной шины: мы используем CKE0, а в документe - CKE1.
Ладно, завтра продолжим разбираться: почему рекомендуют использовать SDRAM bank 1, а не bank 0?

тоже обратил на это внимание но честно говоря не знаю и не разбирался, подумал просто для старших адресов реализация. не забудьте что это для LPC24хх, хотя думаю нет разницы
scorp1969
вот тут 16 разрядныи пример CKE0
http://www.hitex-download.de/lpc/lpc-stick...50-Stick-A2.pdf
так что проблемы надо искать в програмировании EMC SDRAMконтроллера в LPC3250
V_TC
Относительно последнего документа в нашей схеме недостает обратной связи на вывод EMC_CLKIN процессора через резистор R601.
Может это быть причиной проблемы доступа к памяти?
scorp1969
Цитата(V_TC @ Jun 9 2010, 16:09) *
Относительно последнего документа в нашей схеме недостает обратной связи на вывод EMC_CLKIN процессора через резистор R601.
Может это быть причиной проблемы доступа к памяти?

что да то да, упустил. смотрел на подключение SDRAM а на АРМе не проверил. CLK_IN подключается к CLK_OUT в любом исполнении, 16-бит или 32 не важно
V_TC
Попробуем сомкнуть эти выводы на самом процессоре
scorp1969
Цитата(V_TC @ Jun 9 2010, 16:34) *
Попробуем сомкнуть эти выводы на самом процессоре

через резистор 22 Ом
V_TC
to scorp1969:
Спасибо за помощь! Так и сделали - память теперь работает!
-= Александр =-
Та-же ситуация - LPC2478 и память 3.3В MT48LC16M16A2 - подключена правильно - эффекта ноль... Можно поглядеть ваш код инициализации EMC?
-= Александр =-
В общем устал тыркаться - взял какой-то пример - и все заработало! Дальше буду его ковырять....

Код
void SDRAMInit( void )
{
  DWORD i, dummy = dummy;

  /*************************************************************************
  * Initialize EMC and SDRAM
  *************************************************************************/
//  SCS     |= 0x00000002;        /* Reset EMC */
  EMC_CTRL = 0x00000001;        /*Disable Address mirror*/
  PCONP   |= 0x00000800;        /* Turn On EMC PCLK */
  PINSEL4  = 0x50000000;
  PINSEL5  = 0x05050555;
  PINSEL6  = 0x55555555;
  PINSEL8  = 0x55555555;
  PINSEL9  = 0x50555555;  
  
  EMC_DYN_RP     = 2;        /* command period: 3(n+1) clock cycles */
  EMC_DYN_RAS    = 3;        /* RAS command period: 4(n+1) clock cycles */
  EMC_DYN_SREX   = 7;        /* Self-refresh period: 8(n+1) clock cycles */
  EMC_DYN_APR    = 2;        /* Data out to active: 3(n+1) clock cycles */
  EMC_DYN_DAL    = 5;        /* Data in to active: 5(n+1) clock cycles */
  EMC_DYN_WR     = 1;        /* Write recovery: 2(n+1) clock cycles */
  EMC_DYN_RC     = 5;        /* Active to Active cmd: 6(n+1) clock cycles */
  EMC_DYN_RFC    = 5;        /* Auto-refresh: 6(n+1) clock cycles */
  EMC_DYN_XSR    = 7;        /* Exit self-refresh: 8(n+1) clock cycles */
  EMC_DYN_RRD    = 1;        /* Active bank A->B: 2(n+1) clock cycles */
  EMC_DYN_MRD    = 2;        /* Load Mode to Active cmd: 3(n+1) clock cycles */

  EMC_DYN_RD_CFG = 1;        /* Command delayed strategy */

  /* Default setting, RAS latency 3 CCLKs, CAS latenty 3 CCLKs. */
  EMC_DYN_RASCAS0 = 0x00000303;

#if ENG_BOARD_LPC24XX        /* NXP engineering board */
  /* 256MB, 16Mx16, 4 banks, row=12, column=9 */
  EMC_DYN_CFG0 = 0x00000480;
#else                        /* Embedded Artists board */
  /* 256MB, 16Mx16, 4 banks, row=13, column=9 */
  EMC_DYN_CFG0 = 0x00000680;
#endif
  delayMs(1, 100);            /* use timer 1 */

  /* Mem clock enable, CLKOUT runs, send command: NOP */
  EMC_DYN_CTRL = 0x00000183;
  delayMs(1, 200);            /* use timer 1 */
    
  /* Send command: PRECHARGE-ALL, shortest possible refresh period */
  EMC_DYN_CTRL = 0x00000103;

  /* set 32 CCLKs between SDRAM refresh cycles */
  EMC_DYN_RFSH = 0x00000002;
  for(i = 0; i < 0x40; i++);    /* wait 128 AHB clock cycles */
    
  /* set 28 x 16CCLKs=448CCLK=7us between SDRAM refresh cycles */
  EMC_DYN_RFSH = 28;
    
  /* To set mode register in SDRAM, enter mode by issue
  MODE command, after finishing, bailout and back to NORMAL mode. */    
  /* Mem clock enable, CLKOUT runs, send command: MODE */
  EMC_DYN_CTRL = 0x00000083;
  
  /* Set mode register in SDRAM */
  /* Mode regitster table for Micron's MT48LCxx */
  /* bit 9:   Programmed burst length(0)
     bit 8~7: Normal mode(0)
     bit 6~4: CAS latency 3
     bit 3:   Sequential(0)
     bit 2~0: Burst length is 8
     row position is 12 */
  dummy = *((volatile DWORD *)(SDRAM_BASE_ADDR | (0x33 << 12)));
  
  EMC_DYN_CTRL = 0x00000000;      /* Send command: NORMAL */

  EMC_DYN_CFG0 |= 0x00080000;      /* Enable buffer */
  delayMs(1, 1);                  /* Use timer 1 */
  return;

}

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.