Перейти к содержанию
    

Помогите разобраться с подключением внешней памяти к LPC

В моей системе к LPC2214 подключены две срам as7c34098a и две флешки am29lv320b. В данный момент через уарт пытаюсь писать/читать данные. В срам если не более 5 байт длина блока пишется читается нормально. Если больше, то левые данные. Из флешки читаются нули, хотя по идее должны FF. Первое подозрение на кривой код, но я его в симуляторе кейла проверил. Потом ошибки монтажа. Но как я упоминал в отношении срам - по несколько байт нормально обрабатывается. Впрочем еще проверю. Меня интересует какие значения задержек надо выставлять при конфигурации EMC и надо-ли пины настраивать на вход/выход. В пинселе я сконфигурировал как надо. Еще - надо ли что-то подтягивать к питанию. Срам у меня 12 нс, флешь 90 нс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

Сумбурно :-( Очень. На мой взгляд в документации и в AN все изложено вполне доступно.

За примерами железки и программ можете сходить на

http://olimex.com/dev/index.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я правильно вас понял, что есть апликейшн нот по данной тематике? Я вроде все скачивал, но оного не обнаружил у себя. Просто некоторые высказывались, что к работе с внешней памятью LPC без бубна лучьше не подходить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что проверил. (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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я правильно вас понял, что есть апликейшн нот по данной тематике? Я вроде все скачивал, но оного не обнаружил у себя. Просто некоторые высказывались, что к работе с внешней памятью LPC без бубна лучьше не подходить.

AN10402 есть.

Бубен не нужен, ибо все достаточно ясно описано в документации.

Про "некоторых" ничего сказать не могу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде работает. Закралась досадная ошибочка в программе. По крайней мере срам работает как часы. Хотел еще спросить - применяете ли тесты памяти при старте или это лишнее? И если применяете то каков их принцип?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде работает. Закралась досадная ошибочка в программе. По крайней мере срам работает как часы.

Ну вот, а то сразу "бубен" :-)

Хотел еще спросить - применяете ли тесты памяти при старте или это лишнее? И если применяете то каков их принцип?

По привычке да. При POST только простейшие 0x5...5 и 0xA....A и 'адрес' в 'данные'.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Люди, помогите разобраться с записью в AM29LV320.

Не могу в нее ничего записать. Перед созданием схемы посмотрел как у олимекса собрано. Единственное у меня две 16 битные флешки в 32 битном режиме. Поэтому трудно представить какие команды подавать надо. Читаю пишу с помощью родных дров амд. Может кто приведет пример кода.

P_CAD_EDA____MEMORY_.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пример кода:

 

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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попал я как кур во щи. Не пашут флешки хоть тресни. Чтобы я не делал - с них читается FF. Пробовал задействовать cmd_identify() тоже выдает 0xFF. Или сгорели или не правильно подключил сконфигурировал. Висят они на BCFG1. Проверьте если не затруднит - правильно ли я ее прописал. Ноги в пинселах тоже попрописывал.

Еще - надо ли для флешек заводить BLS?

post-1263-1146745960_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде бы, все правильно прописано. BLS заводить не надо.

А на осциллографе что видно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Завтра загоню в цикл чтение сигнатуры, посмотрю осциллоскопом сигналы. Сейчас прозвонил плату - все как надо. К тому же у меня кроме флешек на 0 банке срам. Та как часы работает. А использует те же адресные шины, данных и we. Флешь отличается тока сбросом и подтяжками на wp и byte. Сброс флеши у меня через транзисторный ключ, который управляется с P3.24. Может тут собака зарыта. Сей сигнал имеет альтернативную функцию - CS3. Может в момент обращения к памяти все левые цс-ы в высокий уровень заводятся? Я его в принципе на вывод с 0 установил, чтоб он не сбрасывал флешь через ключ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрел осцилом - все нормально. В смысле на адресных ногах, на данных, на wr, oe, cs вижу импульсы, на ресете чистый высокий уровень. 2aaarrr - вышеприведенный код вами использовался в указанной мной конфигурации?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...