yanvasilij 0 20 июля, 2012 Опубликовано 20 июля, 2012 (изменено) · Жалоба Есть у меня плата с вот этой (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 и после этого произвести запись в нужную ячейку? Буду примного признателен за любую помощь. Изменено 20 июля, 2012 пользователем IgorKossak [codebox] для длинного кода!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 21 июля, 2012 Опубликовано 21 июля, 2012 · Жалоба Есть у меня плата с вот этой (s29gl064) флешкой. Чтобы не париться с записью, дергая порты врукопашную логично использовать контроллер внешней памяти EMC, который имеется на борту моего LPC1788. Но проблема в том, что я впервые вообще использую как внешнюю флешку так и собственно сам EMC. Перечитал аппноту LPC1788 по EMC и даташит на флешку, посмотрел готовый пример из CMSIS на флешку sst39vf3201 пришел к выводу, что вроде ничего сложного, тайминги не сильно различаются в этих флешках, так что настройки EMC можно вроде как не трогать (подключение для данного примера такое же как у меня), У S29GL064N есть пин #BYTE, который переключает 8- и 16-битный режим. У Вас этот пин в каком состоянии? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yanvasilij 0 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба У S29GL064N есть пин #BYTE, который переключает 8- и 16-битный режим. У Вас этот пин в каком состоянии? Он у нас в "1" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yanvasilij 0 23 июля, 2012 Опубликовано 23 июля, 2012 (изменено) · Жалоба Люди, пожалуйста, помогите правильно выбрать тайминги. Уже столько времени бьюсь ничего не выходит, дело похоже точно в них, т.к. больше и не может уже чего быть. В EMC нужно указать 3 вида таймингов для чтения/записи по одному слову, насколько я понял: LPC_EMC->StaticWaitWen0 - выбирает задержку для CS (chip select) во время записи, LPC_EMC->StaticWaitOen0 - выбирает задержку до появления корректных данных после установки адреса во время чтения, LPC_EMC->StaticWaitRd0 - выбирает задержку CS при чтении. Привально ли я понял что эти знаения соответственно 90, 25 и 90 нс? Изменено 23 июля, 2012 пользователем yanvasiij Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
afad 0 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба Попробуйте ... сделать следующее: по адресу 0x555 записать 0x00AA, затем в 0x2AA 0x0055, затем в 0x555 0x0090 и после всего этого ...попробовать прочитать по адресу 0x00 число, должно быть 0x01, что означает, что микросхема фирмы Spansion. Не записываться может по причине того, что блоки памяти залочены, нужно сделать unlock. Я так думаю. Сейчас под рукой нет такой микросхемы, проверить не могу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 24 июля, 2012 Опубликовано 24 июля, 2012 · Жалоба Люди, пожалуйста, помогите правильно выбрать тайминги. Уже столько времени бьюсь ничего не выходит, дело похоже точно в них, т.к. больше и не может уже чего быть. В 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 1 25 июля, 2012 Опубликовано 25 июля, 2012 (изменено) · Жалоба Разобрались, была ошибка в трассировке 2х бит адреса... :angry2: За настройки спасибо! Подскажите, кто использует файловую систему для "равномерного" намазывания данных и учета бэдов? YAFFS? Изменено 25 июля, 2012 пользователем LexaryStyle Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 26 июля, 2012 Опубликовано 26 июля, 2012 · Жалоба Подскажите, кто использует файловую систему для "равномерного" намазывания данных и учета бэдов? YAFFS? Если на эту же микросхему, то JFFS2 (http://www.yaffs.net/comparison-yaffs-vs-jffs). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться