Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC1778 инициализация emc для sram
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
yanvasiij
Вообщем вот схема подключения памяти.

Инициализация такая:
CODE

void SDRAMInit( void )
{
volatile uint32_t i;
volatile unsigned long Dummy;

LPC_IOCON->P3_0 = 0x21;
LPC_IOCON->P3_1 = 0x21;
LPC_IOCON->P3_2 = 0x21;
LPC_IOCON->P3_3 = 0x21;
LPC_IOCON->P3_4 = 0x21;
LPC_IOCON->P3_5 = 0x21;
LPC_IOCON->P3_6 = 0x21;
LPC_IOCON->P3_7 = 0x21;

LPC_IOCON->P4_0 = 0x21;
LPC_IOCON->P4_1 = 0x21;
LPC_IOCON->P4_2 = 0x21;
LPC_IOCON->P4_3 = 0x21;
LPC_IOCON->P4_4 = 0x21;
LPC_IOCON->P4_5 = 0x21;
LPC_IOCON->P4_6 = 0x21;
LPC_IOCON->P4_7 = 0x21;
LPC_IOCON->P4_8 = 0x21;
LPC_IOCON->P4_9 = 0x21;
LPC_IOCON->P4_10 = 0x21;
LPC_IOCON->P4_11 = 0x21;
LPC_IOCON->P4_12 = 0x21;
LPC_IOCON->P4_13 = 0x21;
LPC_IOCON->P4_14 = 0x21;
LPC_IOCON->P4_15 = 0x21;
LPC_IOCON->P5_0 = 0x21;

LPC_IOCON->P4_24 = 0x21;
LPC_IOCON->P4_25 = 0x21;

LPC_IOCON->P4_31 = 0x00;
LPC_GPIO4->DIR |= (1<<31);
LPC_GPIO4->SET |= (1<<31);
LPC_IOCON->P4_30 = 0x21;
// EMC_Init();
// Init SDRAM controller
LPC_SC->PCONP |= 0x00000800;
/*Init SDRAM controller*/
/*Set data read delay*/
LPC_SC->EMCDLYCTL |= (8<<0);
LPC_SC->EMCDLYCTL |=(8<<8);

LPC_SC->EMCDLYCTL |= (8<<16);

LPC_EMC->Control = 0x01;
LPC_EMC->Config = 0x00;
LPC_EMC->StaticExtendedWait = 0x00;
LPC_EMC->StaticConfig0 = 0x00;
LPC_EMC->StaticWaitWen0 = 0x01;
LPC_EMC->StaticWaitOen0 = 0x01;
LPC_EMC->StaticWaitRd0 = 0x01;
LPC_EMC->StaticWaitWr0 = 0x01;
}



Скаттер файл для кейла такой:
Код
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00000000 0x00080000  {   ; load region size_region
  ER_IROM1 0x00000000 0x00080000  { ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x10000000 0x00010000  { ; RW data
   .ANY (+RW +ZI)
  }
  
  RW_IRAM2 0x20000000 0x00007FFF  { ; RW data
.ANY (+RW +ZI)
  }
  
  RW_RAM1 0x80000000 UNINIT 0x02000000  { ; RW data
  ;rsramTesr.o (.data)
   sramTesr.o (.bss)
  
  }
}


В файле sramTesr.cpp всего одна строчка:
Код
unsigned char sramData[50];


В mаin.cpp делаю следующее:
Код
u8 hello[] = "Hello!\r";
extern unsigned char sramData[50];

int main (void)
{
    SystemInit();

...
    /**< init sram */
    SRAMInit ();
    /** waiting after init */
       ...
    
    /** ложу данные  в sram*/
    for (u8 i = 0; i < 8; i++)
    {
        sramData[i] = hello[i];
    }

    /**  достаю данные из срама */
    for (u8 i=0; i<8; i++)
    {
        while (uart.readyToSend() == 0);
        uart.sendChar (sramData[i]); /** Отправляю в uart и смотрю что вышло. Данные не совпадают */
    }

    while(1)
    {
    }
}


Данные не пишутся в SRAM по не ясной для меня причине. Чип селект дергается, OE при чтении дергается, но вот WE почему то не дергается, хотя по идее должен. Что я делаю не так?

Спасибо!
Golikov A.
а что заставит ваш срам разместиться в срамеsm.gif

unsigned char sramData[50]; - где привязка к области памяти?

может чтобы наверняка
int *sramData = 0x80000000;


toweroff
Цитата(Golikov A. @ Sep 12 2014, 17:24) *
а что заставит ваш срам разместиться в срамеsm.gif

скаттер-файл
Golikov A.
RW_RAM1 0x80000000 UNINIT 0x02000000 { ; RW data
;rsramTesr.o (.data)
sramTesr.o (.bss)

}

а что-то типа

.ANY (+RW +ZI) Не?
toweroff
По идее, это как раз заставит расположить данные модуля sramTesr.o в области 0x80000000 - 0x82000000
Желательно бы ТС приложить map-файл, было бы сразу понятно, почему сигнал /WR не генерится - или настройки EMC какие-то не те, или все-таки данные лежат не в области EMC static
yanvasiij
Прикладываю map-файл и небольшую выдержку из него:
Код
    .bss                                     0x80000000   Section       50  sramtesr.o(.bss)


При обращении к sramData дергается чип-селект (при чтении еще дергается OE). Мне казалось что с размещением данных проблем нет...
toweroff
Установите бит 7 (PB) в Static Memory Configuration registers, будет и /WR дергаться. Старые грабли wink.gif
yanvasiij
Цитата(toweroff @ Sep 15 2014, 19:29) *
Установите бит 7 (PB) в Static Memory Configuration registers, будет и /WR дергаться. Старые грабли wink.gif


Помогло! Спасибо Вам большое!
yanvasiij
А вот такой вопрос еще: можно ли скаттером теперь поместить EMAC_LPC177x_8x.c в сраму. А этот драйвер много памяти ест, я хочу его вместе со стеком туда утащить. Просто когда я так делаю, программа перестает пинговаться
Код
LR_IROM1 0x00000000 0x00080000  {   ; load region size_region
  ER_IROM1 0x00000000 0x00080000  { ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x10000000 0x00010000  { ; RW data
   .ANY (+RW +ZI)
  }
  
  RW_IRAM2 0x20000000 0x00007FFF  { ; RW data
    

  }
  
  RW_RAM1 0x80000000 UNINIT 0x0000FFFF  { ; RW data
{
    EMAC_LPC177x_8x.o (.bss)
  }
  
   RW_RAM2 0x81000000 UNINIT 0x0000FFFF  { ; RW data
    
  }
}


Я просто так делал с SDRAM - там все прекрасно работало. А тут вот беда...
toweroff
Ну так добавить в SRAM обласьт еще к (.bss) и просто EMAC_LPC177x_8x.o
yanvasiij
Цитата(toweroff @ Sep 17 2014, 02:27) *
Ну так добавить в SRAM обласьт еще к (.bss) и просто EMAC_LPC177x_8x.o


Что то не совсем понимаю как. Попробовал вот так:
Код
  RW_RAM1 0x80000000 UNINIT 0x0000FFFF  {; RW data
{
    EMAC_LPC177x_8x.o (.bss)
  }

Но это не помогло.
toweroff
Цитата(yanvasiij @ Sep 17 2014, 08:30) *
Что то не совсем понимаю как. Попробовал вот так:
Код
  RW_RAM1 0x80000000 UNINIT 0x0000FFFF  {; RW data
{
    EMAC_LPC177x_8x.o (.bss)
  }

Но это не помогло.


Код
  RW_RAM1 0x80000000 UNINIT 0x0000FFFF  {; RW data
{
    EMAC_LPC177x_8x.o
    EMAC_LPC177x_8x.o (.bss)
  }

Golikov A.
EMAC_LPC177x_8x.o - а это случаем не разместит весь код в сраме?
Тогда надо еще загрузчик делать, который из флэши его в срам перебросит.

toweroff
Судя по скаттеру, он там присутствует.
Mihey_K
Что-то нескладное получается - у LPC1778 адресация внешней SDRAM памяти начинается с 0xA0000000, а вы почему-то оперируете адресом 0x80000000. С адреса 0x80000000 управляется внешняя шина данных и адреса и используется для задания адресации NAND-flash. При записи в 0x80000000 данные и адрес просто выдаются на порты с нужными стробами для записи в NAND. А для SDRAM используются отдельные CS - EMC_DYCSx и адрес 0xA0000000 (для первого банка - EMC_DYCS0), 0xA1000000 (для второго банка - EMC_DYCS1) и т.д..
toweroff
Цитата(Mihey_K @ Sep 18 2014, 17:46) *
Что-то нескладное получается - у LPC1778 адресация внешней SDRAM памяти начинается с 0xA0000000, а вы почему-то оперируете адресом 0x80000000

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