Jump to content

    
Sign in to follow this  
yanvasilij

EMC + LPC1788 + S29GL064N

Recommended Posts

Есть у меня плата с вот этой (s29gl064) флешкой. Чтобы не париться с записью, дергая порты врукопашную логично использовать контроллер внешней памяти EMC, который имеется на борту моего LPC1788. Но проблема в том, что я впервые вообще использую как внешнюю флешку так и собственно сам EMC. Перечитал аппноту LPC1788 по EMC и даташит на флешку, посмотрел готовый пример из CMSIS на флешку sst39vf3201 пришел к выводу, что вроде ничего сложного, тайминги не сильно различаются в этих флешках, так что настройки EMC можно вроде как не трогать (подключение для данного примера такое же как у меня), вот только команды разные, точнее даже не команды а адреса, по которым эти команды во флешку писать. Переписал пример и вышло следующее:

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 и после этого произвести запись в нужную ячейку?

Буду примного признателен за любую помощь.

Edited by IgorKossak
[codebox] для длинного кода!!!

Share this post


Link to post
Share on other sites
Есть у меня плата с вот этой (s29gl064) флешкой. Чтобы не париться с записью, дергая порты врукопашную логично использовать контроллер внешней памяти EMC, который имеется на борту моего LPC1788. Но проблема в том, что я впервые вообще использую как внешнюю флешку так и собственно сам EMC. Перечитал аппноту LPC1788 по EMC и даташит на флешку, посмотрел готовый пример из CMSIS на флешку sst39vf3201 пришел к выводу, что вроде ничего сложного, тайминги не сильно различаются в этих флешках, так что настройки EMC можно вроде как не трогать (подключение для данного примера такое же как у меня),

У S29GL064N есть пин #BYTE, который переключает 8- и 16-битный режим. У Вас этот пин в каком состоянии?

Share this post


Link to post
Share on other sites

Люди, пожалуйста, помогите правильно выбрать тайминги. Уже столько времени бьюсь ничего не выходит, дело похоже точно в них, т.к. больше и не может уже чего быть. В EMC нужно указать 3 вида таймингов для чтения/записи по одному слову, насколько я понял: LPC_EMC->StaticWaitWen0 - выбирает задержку для CS (chip select) во время записи, LPC_EMC->StaticWaitOen0 - выбирает задержку до появления корректных данных после установки адреса во время чтения, LPC_EMC->StaticWaitRd0 - выбирает задержку CS при чтении. Привально ли я понял что эти знаения соответственно 90, 25 и 90 нс?

Edited by yanvasiij

Share this post


Link to post
Share on other sites

Попробуйте

... сделать следующее: по адресу 0x555 записать 0x00AA, затем в 0x2AA 0x0055, затем в 0x555 0x0090 и после всего этого ...
попробовать прочитать по адресу 0x00 число, должно быть 0x01, что означает, что микросхема фирмы Spansion.

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

Я так думаю. Сейчас под рукой нет такой микросхемы, проверить не могу.

Share this post


Link to post
Share on other sites
Люди, пожалуйста, помогите правильно выбрать тайминги. Уже столько времени бьюсь ничего не выходит, дело похоже точно в них, т.к. больше и не может уже чего быть. В 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?

Share this post


Link to post
Share on other sites

Разобрались, была ошибка в трассировке 2х бит адреса... :angry2: За настройки спасибо!

 

Подскажите, кто использует файловую систему для "равномерного" намазывания данных и учета бэдов? YAFFS?

Edited by LexaryStyle

Share this post


Link to post
Share on other sites
Подскажите, кто использует файловую систему для "равномерного" намазывания данных и учета бэдов? YAFFS?

Если на эту же микросхему, то JFFS2 (http://www.yaffs.net/comparison-yaffs-vs-jffs).

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this