Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобраться с подключением внешней памяти к LPC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
vesago
В моей системе к LPC2214 подключены две срам as7c34098a и две флешки am29lv320b. В данный момент через уарт пытаюсь писать/читать данные. В срам если не более 5 байт длина блока пишется читается нормально. Если больше, то левые данные. Из флешки читаются нули, хотя по идее должны FF. Первое подозрение на кривой код, но я его в симуляторе кейла проверил. Потом ошибки монтажа. Но как я упоминал в отношении срам - по несколько байт нормально обрабатывается. Впрочем еще проверю. Меня интересует какие значения задержек надо выставлять при конфигурации EMC и надо-ли пины настраивать на вход/выход. В пинселе я сконфигурировал как надо. Еще - надо ли что-то подтягивать к питанию. Срам у меня 12 нс, флешь 90 нс.
zltigo
Цитата(vesago @ Apr 25 2006, 09:13) *
...

Сумбурно :-( Очень. На мой взгляд в документации и в AN все изложено вполне доступно.
За примерами железки и программ можете сходить на
http://olimex.com/dev/index.html
vesago
Я правильно вас понял, что есть апликейшн нот по данной тематике? Я вроде все скачивал, но оного не обнаружил у себя. Просто некоторые высказывались, что к работе с внешней памятью LPC без бубна лучьше не подходить.
doomer#gp
Только что проверил. (Olimex -LPC-2214) Записал/прочитал 256K все ОК.
Вот мои настройки:

// Set Data bus functionality
PINSEL2 = 0x0F000924;

// Initialization of EMC
//FLASH 16bit; IDCY = F; WST1 = 4; RBLE = 1; WST2 = 6
BCFG0=0x1000348F;
// SRAM 32bit; IDCY = F; WST1 = 0; RBLE = 1; WST2 = 0
BCFG1=0x2000040F;

Стоят две K6R4016V1D, flash 26LV800BTC
zltigo
Цитата(vesago @ Apr 25 2006, 09:49) *
Я правильно вас понял, что есть апликейшн нот по данной тематике? Я вроде все скачивал, но оного не обнаружил у себя. Просто некоторые высказывались, что к работе с внешней памятью LPC без бубна лучьше не подходить.

AN10402 есть.
Бубен не нужен, ибо все достаточно ясно описано в документации.
Про "некоторых" ничего сказать не могу.
vesago
Спасибо. Буду разбираться.
vesago
Вроде работает. Закралась досадная ошибочка в программе. По крайней мере срам работает как часы. Хотел еще спросить - применяете ли тесты памяти при старте или это лишнее? И если применяете то каков их принцип?
zltigo
Цитата(vesago @ Apr 25 2006, 14:44) *
Вроде работает. Закралась досадная ошибочка в программе. По крайней мере срам работает как часы.

Ну вот, а то сразу "бубен" :-)
Цитата
Хотел еще спросить - применяете ли тесты памяти при старте или это лишнее? И если применяете то каков их принцип?

По привычке да. При POST только простейшие 0x5...5 и 0xA....A и 'адрес' в 'данные'.
vesago
Люди, помогите разобраться с записью в AM29LV320.
Не могу в нее ничего записать. Перед созданием схемы посмотрел как у олимекса собрано. Единственное у меня две 16 битные флешки в 32 битном режиме. Поэтому трудно представить какие команды подавать надо. Читаю пишу с помощью родных дров амд. Может кто приведет пример кода.
aaarrr
Пример кода:

Код
void cmd_reset(void)
{
    *(volatile u_int *)(base_addr + 0x15554) = 0xaa00aa;    // Read/Reset sequence
    *(volatile u_int *)(base_addr + 0x0aaa8) = 0x550055;    //
    *(volatile u_int *)(base_addr + 0x15554) = 0xf000f0;    //
}

u_int cmd_write_word(u_int data)
{
    *(volatile u_int *)(base_addr + 0x15554) = 0xaa00aa;    // Program sequence
    *(volatile u_int *)(base_addr + 0x0aaa8) = 0x550055;    //
    *(volatile u_int *)(base_addr + 0x15554) = 0xa000a0;    //
    *(volatile u_int *)(base_addr + offset) = data;
    return cmd_data_poll(data);
}

u_int cmd_erase_flash(void)
{
    cmd_erase_seq();
    *(volatile u_int *)(base_addr + 0x15554) = 0x100010;
    offset = 0x00;
    return cmd_data_poll(0xff00ff);
}

void cmd_identify(void)
{
    *(volatile u_int *)(base_addr + 0x15554) = 0xaa00aa;    // Autoselect sequence
    *(volatile u_int *)(base_addr + 0x0aaa8) = 0x550055;    //
    *(volatile u_int *)(base_addr + 0x15554) = 0x900090;    //
    manuf_code  = *(volatile u_int *)(base_addr);
    device_code = *(volatile u_int *)(base_addr + 0x04);
}

u_int cmd_erase_sector(void)
{
    cmd_erase_seq();
    *(volatile u_int *)(base_addr + offset) = 0x300030;
    return cmd_data_poll(0xff00ff);
}

void cmd_erase_seq(void)
{
    *(volatile u_int *)(base_addr + 0x15554) = 0xaa00aa;    // Erase sequence
    *(volatile u_int *)(base_addr + 0x0aaa8) = 0x550055;    //
    *(volatile u_int *)(base_addr + 0x15554) = 0x800080;    //
    *(volatile u_int *)(base_addr + 0x15554) = 0xaa00aa;    //
    *(volatile u_int *)(base_addr + 0x0aaa8) = 0x550055;    //
}    

u_int cmd_data_poll(u_int data)
{
    u_int a;

    do
    {
        a = *(volatile u_int*)(base_addr + offset);
    } while(((data & 0x800080) != (a & 0x800080)) && ((a & 0x200020) != 0x200020));
    if((data & 0x800080) != (*(volatile u_int*)(base_addr + offset) & 0x800080)) return 0x01;
    return 0x00;
}
vesago
Большое спасибо! Сейчас попробую.
vesago
Попал я как кур во щи. Не пашут флешки хоть тресни. Чтобы я не делал - с них читается FF. Пробовал задействовать cmd_identify() тоже выдает 0xFF. Или сгорели или не правильно подключил сконфигурировал. Висят они на BCFG1. Проверьте если не затруднит - правильно ли я ее прописал. Ноги в пинселах тоже попрописывал.
Еще - надо ли для флешек заводить BLS?
aaarrr
Вроде бы, все правильно прописано. BLS заводить не надо.
А на осциллографе что видно?
vesago
Завтра загоню в цикл чтение сигнатуры, посмотрю осциллоскопом сигналы. Сейчас прозвонил плату - все как надо. К тому же у меня кроме флешек на 0 банке срам. Та как часы работает. А использует те же адресные шины, данных и we. Флешь отличается тока сбросом и подтяжками на wp и byte. Сброс флеши у меня через транзисторный ключ, который управляется с P3.24. Может тут собака зарыта. Сей сигнал имеет альтернативную функцию - CS3. Может в момент обращения к памяти все левые цс-ы в высокий уровень заводятся? Я его в принципе на вывод с 0 установил, чтоб он не сбрасывал флешь через ключ.
vesago
Посмотрел осцилом - все нормально. В смысле на адресных ногах, на данных, на wr, oe, cs вижу импульсы, на ресете чистый высокий уровень. 2aaarrr - вышеприведенный код вами использовался в указанной мной конфигурации?
aaarrr
Использовался, только не с LPC. Флеш была AMD...
aaarrr
Посмотрет тут еще Вашу схемку (v2.rar) - на DD6 дублируется адрес A15.
Еще посмотрел фото платы, и возник вопрос: на целостность сигналов оно проверялось?
vesago
Благодарю. A15 был поправлен на этапе рисования платы. А плату я вчера всю вызвонил. Впрочем дело пошло. Я вставил ваш код и случилось чудо - правильно считалась сигнатура - F9220100. Вчера видно что-то не так сделал. А родные дрова оказались кривые:
Допустим альтернатива вашему cmd_identify:
Код
unsigned int lld_GetDeviceId
(
FLASHDATA * base_addr   /* device base address in system */
)
{
  unsigned int id;

  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, NOR_UNLOCK_DATA1);
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR2, NOR_UNLOCK_DATA2);
  FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, NOR_AUTOSELECT_CMD);
  id  = (unsigned int)(FLASH_RD(base_addr, 0x0001) & 0x000000FF) << 16;
  id |= (unsigned int)(FLASH_RD(base_addr, 0x000E) & 0x000000FF) <<  8;
  id |= (unsigned int)(FLASH_RD(base_addr, 0x000F) & 0x000000FF)     ;
  lld_ResetCmd(base_addr);
  return(id);
}


Адреса и данные - верно, а вот получение данных - не так.
vesago
Память я запустил, за что особенно спасибо aaarrr. Видно исходники с амд расчитаны на другое подключение. Вопрос - у этих микросхем есть секьюре силикон сектор. Мне не очень подвезло - купили с ботом расположением - т.е. младшие 128К. Я не совсем понял - можно ли их пользовать как обычные сектора - читать/писать. Или есть какие-то сложности? Пока особенно не эксперементировал - работаю по смещению.
aaarrr
Вроде как сложностей нет, если только SecSi не запрограммирован на фабрике...
vesago
Чертовщина какая-то. Пишу слово по адресу 0h. Данные читаются и с 0 и с 40000h. Пишу в 10000h. Читаются и с 10000 с 50000. Тоже самое с 20000, 30000 и 60000, 70000 соответственно. И наоборот пишу в 60000 получаю в 20000. А вот в 80000 не записались нули - я так понимаю, что разводка не виновата. Помогите советом.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.