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

 
 
> 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



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 11:16
Рейтинг@Mail.ru


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