реклама на сайте
подробности

 
 
> EMC + LPC1788 + S29GL064N, как работать с флешь?
yanvasiij
сообщение Jul 20 2012, 14:00
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



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

Сообщение отредактировал IgorKossak - Jul 20 2012, 20:56
Причина редактирования: [codebox] для длинного кода!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
afad
сообщение Jul 23 2012, 13:37
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 212
Регистрация: 26-08-04
Пользователь №: 545



Попробуйте
Цитата
... сделать следующее: по адресу 0x555 записать 0x00AA, затем в 0x2AA 0x0055, затем в 0x555 0x0090 и после всего этого ...
попробовать прочитать по адресу 0x00 число, должно быть 0x01, что означает, что микросхема фирмы Spansion.
Не записываться может по причине того, что блоки памяти залочены, нужно сделать unlock.
Я так думаю. Сейчас под рукой нет такой микросхемы, проверить не могу.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st August 2025 - 11:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01366 секунд с 7
ELECTRONIX ©2004-2016