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

...
Сумбурно :-( Очень. На мой взгляд в документации и в AN все изложено вполне доступно.
За примерами железки и программ можете сходить на
http://olimex.com/dev/index.html
vesago
Apr 25 2006, 06:49
Я правильно вас понял, что есть апликейшн нот по данной тематике? Я вроде все скачивал, но оного не обнаружил у себя. Просто некоторые высказывались, что к работе с внешней памятью LPC без бубна лучьше не подходить.
doomer#gp
Apr 25 2006, 07:44
Только что проверил. (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
Apr 25 2006, 07:57
Цитата(vesago @ Apr 25 2006, 09:49)

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

Вроде работает. Закралась досадная ошибочка в программе. По крайней мере срам работает как часы.
Ну вот, а то сразу "бубен" :-)
Цитата
Хотел еще спросить - применяете ли тесты памяти при старте или это лишнее? И если применяете то каков их принцип?
По привычке да. При POST только простейшие 0x5...5 и 0xA....A и 'адрес' в 'данные'.
Люди, помогите разобраться с записью в AM29LV320.
Не могу в нее ничего записать. Перед созданием схемы посмотрел как у олимекса собрано. Единственное у меня две 16 битные флешки в 32 битном режиме. Поэтому трудно представить какие команды подавать надо. Читаю пишу с помощью родных дров амд. Может кто приведет пример кода.
Пример кода:
Код
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?
Вроде бы, все правильно прописано. BLS заводить не надо.
А на осциллографе что видно?
Завтра загоню в цикл чтение сигнатуры, посмотрю осциллоскопом сигналы. Сейчас прозвонил плату - все как надо. К тому же у меня кроме флешек на 0 банке срам. Та как часы работает. А использует те же адресные шины, данных и we. Флешь отличается тока сбросом и подтяжками на wp и byte. Сброс флеши у меня через транзисторный ключ, который управляется с P3.24. Может тут собака зарыта. Сей сигнал имеет альтернативную функцию - CS3. Может в момент обращения к памяти все левые цс-ы в высокий уровень заводятся? Я его в принципе на вывод с 0 установил, чтоб он не сбрасывал флешь через ключ.
Посмотрел осцилом - все нормально. В смысле на адресных ногах, на данных, на wr, oe, cs вижу импульсы, на ресете чистый высокий уровень. 2aaarrr - вышеприведенный код вами использовался в указанной мной конфигурации?
Использовался, только не с LPC. Флеш была AMD...
Посмотрет тут еще Вашу схемку (v2.rar) - на DD6 дублируется адрес A15.
Еще посмотрел фото платы, и возник вопрос: на целостность сигналов оно проверялось?
Благодарю. 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
May 10 2006, 14:33
Память я запустил, за что особенно спасибо aaarrr. Видно исходники с амд расчитаны на другое подключение. Вопрос - у этих микросхем есть секьюре силикон сектор. Мне не очень подвезло - купили с ботом расположением - т.е. младшие 128К. Я не совсем понял - можно ли их пользовать как обычные сектора - читать/писать. Или есть какие-то сложности? Пока особенно не эксперементировал - работаю по смещению.
aaarrr
May 10 2006, 16:39
Вроде как сложностей нет, если только SecSi не запрограммирован на фабрике...
vesago
May 16 2006, 16:11
Чертовщина какая-то. Пишу слово по адресу 0h. Данные читаются и с 0 и с 40000h. Пишу в 10000h. Читаются и с 10000 с 50000. Тоже самое с 20000, 30000 и 60000, 70000 соответственно. И наоборот пишу в 60000 получаю в 20000. А вот в 80000 не записались нули - я так понимаю, что разводка не виновата. Помогите советом.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.