Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запись во внутренюю Flash lpc1768
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
ruslannd
Всем привет

Пишу во внутренюю флеш lpc1768 следующую последовательность:
0 0 0 0 FE FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

Там оказывается:
Dump memory from 0x48000 to 0x4801F (HEX):
48000: 0 0 0 0 FE FD FF FF FF FF FF FF FF FF FF FF 48010: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

Если писать
0 0 0 0 FС FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

то там все хорошо (как и с многими другими комбинациями):
Dump memory from 0x48000 to 0x4801F (HEX):
48000: 0 0 0 0 FС FF FF FF FF FF FF FF FF FF FF FF 48010: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

Процедура записи:
#define ADR_COUNTS 0x00048000
U8 buffer[1024] = {..........};
tsk_lock();
InitIAP(ADR_COUNTS,100000,1);
EraseSector(ADR_COUNTS);
InitIAP(ADR_COUNTS,100000,1);
InitIAP(ADR_COUNTS,100000,2);
tmp = ProgramPage(ADR_COUNTS,1024,(U8*)&buffer);
tsk_unlock();

Все функции работы с флешкой от Keil, операционка тоже кейловская
ЧТО Я ДЕЛАЮ НЕ ПРАВИЛЬНО???????
ruslannd
Никто не может помочь?
DpInRock
Цитата
Все функции работы с флешкой от Keil, операционка тоже кейловская

Ошибка в этом.
Требуется таки если уж использовать, то понимать что происходит (запись во флэш имеет некоторое количество ограничений, которые следует проверять, что они выполняются).
А ваш вопрос звучит в переводе на русский язык так: у меня чего-то не работает. А чего - не знаю.
Ибо приведенный текст программы ни о чем не говорит. Ибо сие не есть текст.

Аналогичный вопрос по степени неправильности: выполняю printf команду, а она не выполняется...

--
Вот если вообще не разбираться
1) Руками запретите все прерывания (после tsk_lock к примеру)
И посмотрите что поменяется. К примеру.

ruslannd
Цитата(DpInRock @ Jan 14 2011, 18:52) *
Ошибка в этом.
Требуется таки если уж использовать, то понимать что происходит (запись во флэш имеет некоторое количество ограничений, которые следует проверять, что они выполняются).
А ваш вопрос звучит в переводе на русский язык так: у меня чего-то не работает. А чего - не знаю.
Ибо приведенный текст программы ни о чем не говорит. Ибо сие не есть текст.

Аналогичный вопрос по степени неправильности: выполняю printf команду, а она не выполняется...

--
Вот если вообще не разбираться
1) Руками запретите все прерывания (после tsk_lock к примеру)
И посмотрите что поменяется. К примеру.


tsk_lock и запрещает все прерывания (если верить документации от Кейл). Тем не менее попробовал - тоже самое.
Смотрел исходники от кейл и сравнивал с документацией от NXP - все ОК. Может это сам кристал?
DpInRock
Случаем не через UART работаете?

Кстати, там где-то должна быть команда (иап) сравнения флэша и буфера.
Интересно бы глянуть что скажет она.
ruslannd
Цитата(DpInRock @ Jan 14 2011, 17:08) *
Случаем не через UART работаете?

Кстати, там где-то должна быть команда (иап) сравнения флэша и буфера.
Интересно бы глянуть что скажет она.


Да, дамп памяти получаю через UART

Сравнение ругается. Что делать не знаю. С прерываниями пробовал и без. С PLL и без. Смотрел как сделано у Keil и как надо по даташиту - все правильно. Баба Яга в отчаянии. =(

Если никто советом помочь не может - дайте, плиз, примерчик.
ar__systems
Цитата(ruslannd @ Jan 17 2011, 01:19) *
..

Скорее всего временные требования по записи во Флеш не выполняете. Проверку что стирание прошло хорошо добавьте, и данные которые в буфер пишите поменяйте на что-то более содержательное, например 0хАА. Проверять запись 0xFF безсмысленно -- ФФ записано в пасяти сразу после стирания.
ruslannd
Всем спасибо. Я разобрался в проблеме. Оказывается нельзя два раза писать без стирания.

Я вначале после стирания писал:
00 00 00 00 FF FF

Потом без стрирания прямо поверх старой записи:
00 00 00 00 FE FF

и получал:
00 00 00 00 FE DF (последний байт портился)

Самое интересное, что если еще раз поверх записать:
00 00 00 00 FC FF

то в памяти останется:
00 00 00 00 FC FF (!!!!!DF превратилось в FF!!!!!!!)

и получались глюки. Проверено на кристалах разного выпуска типов LPC2388 (тут ситуация похожая) и LPC 1768 (про него я и писал выше). Про запись "поверх" в даташите не сказано ни слова (я не нашел, хотя искал специально). Жирный минус NXP.
У Атмела таких косяков нет!

Это не связано со времянкой. Это связано с программой IAP. NXP прямой доступ к флешу не открывает. Жаль.

ЗЫ: Если у кого есть какие мысли по этому поводу - буду рад услышать.
bus16
Цитата
Всем спасибо. Я разобрался в проблеме. Оказывается нельзя два раза писать без стирания.

Не разобрались sad.gif

Цитата
Про запись "поверх" в даташите не сказано ни слова (я не нашел, хотя искал специально). Жирный минус NXP.
У Атмела таких косяков нет!

Если не сказано - значит и делать так, вероятно, нельзя.

Цитата
Это не связано со времянкой. Это связано с программой IAP. NXP прямой доступ к флешу не открывает. Жаль.

Вам, уверен, он и не помог-бы... Тема неоднократно обсуждалась, ищите не форуме. Если лень лазить по форуму - ищите в UM в разделе "Flash programming" слово "ECC"
andrewlekar
Про минус NXP сильно задвинул!

И DF в FF без стирания превратиться в принципе не способен.
ruslannd
Цитата(andrewlekar @ Jan 19 2011, 08:39) *
Про минус NXP сильно задвинул!

И DF в FF без стирания превратиться в принципе не способен.


А Вы проверьте.

Цитата(bus16 @ Jan 18 2011, 21:37) *
Не разобрались sad.gif


А в чем еще может быть причина? Если стирать перед каждой записью, то все ОК.

Цитата
Если не сказано - значит и делать так, вероятно, нельзя.


Весь мир живет наоборот - если нет нельзя, значит можно.


Цитата(bus16 @ Jan 18 2011, 21:37) *
Вам, уверен, он и не помог-бы... Тема неоднократно обсуждалась, ищите не форуме. Если лень лазить по форуму - ищите в UM в разделе "Flash programming" слово "ECC"


Поискал - ничего не нашел, не для LPC23xx, не для LPC17xx.

EEC - это, если я правильно понял, корекция ошибок? А причем здесь она?

Я так понял что нельзя писать во флеш поверх старой записи, так как есть некая система коррекции данных, поверх данных которой уже не запишешь? Где почитать про это в применении к контроллерам LPC
esaulenka
Цитата(ruslannd @ Jan 19 2011, 13:32) *
Я так понял что нельзя писать во флеш поверх старой записи, так как

... так как флеш. ЛЮБАЯ флеш так устроена.
ruslannd
Цитата(esaulenka @ Jan 19 2011, 13:36) *
... так как флеш. ЛЮБАЯ флеш так устроена.


Не любая. Я говорю про конкретную ситуацию, когда пишем поверх 0хFF. Кстати, только что обнаружил, у lpc1768 если флешку побить на блоки по 16 байт, то можно писать в блоки повторно информацию без стирания, если внутри блока бсе байты OxFF, даже, если в соседних есть информация отличная от 0xFF. ПсевдоEEPROM, однако.
DpInRock
Рекомендую поискать ошибки в программе.
VslavX
Цитата(ruslannd @ Jan 19 2011, 13:15) *
Не любая. Я говорю про конкретную ситуацию, когда пишем поверх 0хFF. Кстати, только что обнаружил, у lpc1768 если флешку побить на блоки по 16 байт, то можно писать в блоки повторно информацию без стирания, если внутри блока бсе байты OxFF, даже, если в соседних есть информация отличная от 0xFF. ПсевдоEEPROM, однако.

Про разбиение на блоки по 16 байт было то ли в каком-то раннем даташите или аппноте. Там же было сказано что каждый 16 байтный (128 битовый блок) защищается корректирующим кодом (ECC) и повышает выход годных изделий (с битыми отдельными битами флеша) и надежность хранения программы. Итого - пишете 16 байт, при этом вычисляется некоторый корректирующий код и пишется где-то в скрытую область памяти. И дописать в эти 16 байт произвольно поверх FF нельзя - корректирующий код будет другой и скорее всего он нормально не запишется, а результат считывания таких 16 байт с некорректным кодом будет непредсказуемым.
ruslannd
Цитата(DpInRock @ Jan 19 2011, 14:38) *
Рекомендую поискать ошибки в программе.


Мои, кейловские и nxp процедуры работают одинаково на трех платах и двух типах контроллеров. Сомневаюсь в наличии существенных ошибок

Цитата(VslavX @ Jan 19 2011, 14:40) *
Про разбиение на блоки по 16 байт было то ли в каком-то раннем даташите или аппноте. Там же было сказано что каждый 16 байтный (128 битовый блок) защищается корректирующим кодом (ECC) и повышает выход годных изделий (с битыми отдельными битами флеша) и надежность хранения программы. Итого - пишете 16 байт, при этом вычисляется некоторый корректирующий код и пишется где-то в скрытую область памяти. И дописать в эти 16 байт произвольно поверх FF нельзя - корректирующий код будет другой и скорее всего он нормально не запишется, а результат считывания таких 16 байт с некорректным кодом будет непредсказуемым.


Именно это я и обнаружил. Всем огромное спасибо.
ruslannd
Если кому интересно, то я нашел документ, описывающий мою проблему. Спасибо VslavX.

дока с сайта nxp (http://www.nxp.com/documents/application_note/AN11008.pdf)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.