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

EMC + LPC1788 + S29GL064N

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

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

Изменено пользователем IgorKossak
[codebox] для длинного кода!!!

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


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

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

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

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


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

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

Он у нас в "1"

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


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

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

Изменено пользователем yanvasiij

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


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

Попробуйте

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

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

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

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


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

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

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


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

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

 

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

Изменено пользователем LexaryStyle

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


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

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

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

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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