Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: EMC + LPC1788 + S29GL064N
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
yanvasiij
Есть у меня плата с вот этой (s29gl064) флешкой. Чтобы не париться с записью, дергая порты врукопашную логично использовать контроллер внешней памяти EMC, который имеется на борту моего LPC1788. Но проблема в том, что я впервые вообще использую как внешнюю флешку так и собственно сам EMC. Перечитал аппноту LPC1788 по EMC и даташит на флешку, посмотрел готовый пример из CMSIS на флешку sst39vf3201 пришел к выводу, что вроде ничего сложного, тайминги не сильно различаются в этих флешках, так что настройки EMC можно вроде как не трогать (подключение для данного примера такое же как у меня), вот только команды разные, точнее даже не команды а адреса, по которым эти команды во флешку писать. Переписал пример и вышло следующее:
CODE
void delay(uint32_t delayCnt)
{
uint32_t i;

for ( i = 0; i < delayCnt; i++ );
return;
}

void NORFLASHInit( void )
{
TIM_TIMERCFG_Type TIM_ConfigStruct;

EMC_Init();

TIM_ConfigStruct.PrescaleOption = TIM_PRESCALE_USVAL;
TIM_ConfigStruct.PrescaleValue = 1;

TIM_Init(LPC_TIM0, TIM_TIMER_MODE,&TIM_ConfigStruct);
TIM_Waitms(100);

EMC_StaMemConfigMW (0,EMC_StaticConfig_MW_16BITS);
EMC_StaMemConfigPB(0,EMC_StaticConfig_PB);
EMC_SetStaMemoryParameter(0, EMC_STA_MEM_WAITWEN, EMC_StaticWaitWen_WAITWEN(0x0F));
EMC_SetStaMemoryParameter(0, EMC_STA_MEM_WAITOEN, EMC_StaticWaitOen_WAITOEN(0x04));
EMC_SetStaMemoryParameter(0, EMC_STA_MEM_WAITRD, EMC_StaticWaitRd_WAITRD(0x0F));
EMC_SetStaMemoryParameter(0, EMC_STA_MEM_WAITPAGE, EMC_StaticwaitPage_WAITPAGE(0x1f));
EMC_SetStaMemoryParameter(0, EMC_STA_MEM_WAITWR, EMC_StaticWaitwr_WAITWR(0x1f));
EMC_SetStaMemoryParameter(0, EMC_STA_MEM_WAITTURN, EMC_StaticWaitTurn_WAITTURN(0x1f));

//delay time
TIM_Waitms(10);

return;
}


uint32_t ToggleBitCheck( uint32_t Addr, uint16_t Data )
{
volatile uint16_t *ip;
uint16_t temp1, temp2;
uint32_t TimeOut = PROGRAM_TIMEOUT;

while( TimeOut > 0 )
{
ip = GET_ADDR(Addr);
temp1 = *ip;
ip = GET_ADDR(Addr);
temp2 = *ip;

if ( (temp1 == temp2) && (temp1 == Data) )
{
return( TRUE );
}
TimeOut--;
}
return ( FALSE );
}

uint32_t NORFLASHCheckID( void )
{
volatile uint16_t *ip;
uint16_t SST_id1 = 0, SST_id2 = 0;

ip = GET_ADDR(0x555);
*ip = 0x00AA;
ip = GET_ADDR(0x2AA);
*ip = 0x0055;
ip = GET_ADDR(0x555);
*ip = 0x0090;
delay(10);

ip = GET_ADDR(0x0001);
SST_id2 = *ip;

ip = GET_ADDR(0x555);
*ip = 0x00AA;
ip = GET_ADDR(0x2AA);
*ip = 0x0055;
ip = GET_ADDR(0x555);
*ip = 0x00F0;
delay(10);

return SST_id2;
}


void NORFLASHErase( void )
{
volatile uint16_t *ip;

ip = GET_ADDR(0x555);
*ip = 0x00AA;
ip = GET_ADDR(0x2AA);
*ip = 0x0055;
ip = GET_ADDR(0x555);
*ip = 0x0080;
ip = GET_ADDR(0x555);
*ip = 0x00AA;
ip = GET_ADDR(0x2AA);
*ip = 0x0055;
ip = GET_ADDR(0x555);
*ip = 0x0010;
delay(10000000); /* Use timer 1 */
return;

}


uint32_t NORFLASHWriteWord( uint32_t Addr, uint16_t Data )
{
volatile uint16_t *ip;

ip = GET_ADDR(0x555);
*ip = 0x00AA;
ip = GET_ADDR(0x2AA);
*ip = 0x0055;
ip = GET_ADDR(0x555);
*ip = 0x00A0;

ip = GET_ADDR(Addr); /* Program 16-bit word */
*ip = Data;
return ( ToggleBitCheck( Addr, Data ) );
}

Ничего не заработало, увы. Когда читаю серийник ничего не возвращает кроме 0xFFFF. Когда пишу, ничего не записывает (смотрю в дебаггере). Правильно ли я понял, что когда я хочу прочитать серийник мне нужно сделать следующее: по адресу 0x555 записать 0x00AA, затем в 0x2AA 0x0055, затем в 0x555 0x0090 и после всего этого из 0x0001 считать серийник? Аналогично при записи, только по адресу 0x555 нужно записать 0x00A0 и после этого произвести запись в нужную ячейку?
Буду примного признателен за любую помощь.
Zwerg_nase
Цитата(yanvasiij @ Jul 20 2012, 18:00) *
Есть у меня плата с вот этой (s29gl064) флешкой. Чтобы не париться с записью, дергая порты врукопашную логично использовать контроллер внешней памяти EMC, который имеется на борту моего LPC1788. Но проблема в том, что я впервые вообще использую как внешнюю флешку так и собственно сам EMC. Перечитал аппноту LPC1788 по EMC и даташит на флешку, посмотрел готовый пример из CMSIS на флешку sst39vf3201 пришел к выводу, что вроде ничего сложного, тайминги не сильно различаются в этих флешках, так что настройки EMC можно вроде как не трогать (подключение для данного примера такое же как у меня),

У S29GL064N есть пин #BYTE, который переключает 8- и 16-битный режим. У Вас этот пин в каком состоянии?
yanvasiij
Цитата(Zwerg_nase @ Jul 21 2012, 15:06) *
У S29GL064N есть пин #BYTE, который переключает 8- и 16-битный режим. У Вас этот пин в каком состоянии?

Он у нас в "1"
yanvasiij
Люди, пожалуйста, помогите правильно выбрать тайминги. Уже столько времени бьюсь ничего не выходит, дело похоже точно в них, т.к. больше и не может уже чего быть. В EMC нужно указать 3 вида таймингов для чтения/записи по одному слову, насколько я понял: LPC_EMC->StaticWaitWen0 - выбирает задержку для CS (chip select) во время записи, LPC_EMC->StaticWaitOen0 - выбирает задержку до появления корректных данных после установки адреса во время чтения, LPC_EMC->StaticWaitRd0 - выбирает задержку CS при чтении. Привально ли я понял что эти знаения соответственно 90, 25 и 90 нс?
afad
Попробуйте
Цитата
... сделать следующее: по адресу 0x555 записать 0x00AA, затем в 0x2AA 0x0055, затем в 0x555 0x0090 и после всего этого ...
попробовать прочитать по адресу 0x00 число, должно быть 0x01, что означает, что микросхема фирмы Spansion.
Не записываться может по причине того, что блоки памяти залочены, нужно сделать unlock.
Я так думаю. Сейчас под рукой нет такой микросхемы, проверить не могу.
Zwerg_nase
Цитата(yanvasiij @ Jul 23 2012, 15:27) *
Люди, пожалуйста, помогите правильно выбрать тайминги. Уже столько времени бьюсь ничего не выходит, дело похоже точно в них, т.к. больше и не может уже чего быть. В EMC нужно указать 3 вида таймингов для чтения/записи по одному слову, насколько я понял: LPC_EMC->StaticWaitWen0 - выбирает задержку для CS (chip select) во время записи, LPC_EMC->StaticWaitOen0 - выбирает задержку до появления корректных данных после установки адреса во время чтения, LPC_EMC->StaticWaitRd0 - выбирает задержку CS при чтении. Привально ли я понял что эти знаения соответственно 90, 25 и 90 нс?


StaticWaitWen0 - задаёт время появления Write Enable после активного CS. Рекомендую поставить здесь 30 нс.
StaticWaitOen0 - задаёт время появления Output Enable после активного СS. Можно поставить 0 нс.
StaticWaitRd0 - задаёт момент защёлкивания данных на шине памяти процессором. Надо поставить не менее 90 нс.
Ещё надо задать:
StaticWaitPage0 > 25 нс
StaticWaitWr0 > 90 нс
StaticWaitTurn0 = 0х1 (если StaticWaitWen0 = 30 нс)


Надо проверить бит PC в StaticConfig0. Должен быть 0.

Какая частота EMC_CLK?

Вы уверены, что память у Вас на чип-селекте CS0?
LexaryStyle
Разобрались, была ошибка в трассировке 2х бит адреса... angry.gif За настройки спасибо!

Подскажите, кто использует файловую систему для "равномерного" намазывания данных и учета бэдов? YAFFS?
Zwerg_nase
Цитата(LexaryStyle @ Jul 25 2012, 22:04) *
Подскажите, кто использует файловую систему для "равномерного" намазывания данных и учета бэдов? YAFFS?

Если на эту же микросхему, то JFFS2 (http://www.yaffs.net/comparison-yaffs-vs-jffs).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.