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

 
 
> IAP в LPC17x, запись без стирания - возможно-ли?
jcxz
сообщение Oct 4 2013, 14:55
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Пытаюсь дописывать в сектор программной flash LPC1758 без предварительного стирания сектора.
Исходное состояние области в которую пишу - все 0xFF.
Так вот: иногда запись проходит нормально, иногда - записанное не соответствует записываемому (как правило - в каком-либо одном байте).
Если предварительно стереть сектор - то всегда всё ок.
Перепробовал уже вроде всё, что можно: запрещал прерывания на всю процедуру записи, менял сектора, размеры записываемого сегмента, писал кодом из ОЗУ и flash и т.п. - всё без толку.
Вот такой блок (hex):
18,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,81,15,3A,18
,94
даёт сбой каждую 4-ю запись. После проверки получаю что записано:
18,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,20,00,81,15,3A,18
,94
И результат всегда такой. Каждая 4-я запись у меня идёт по адресу, кратному 0x20 (может это как-то влияет).
Повторная многократная запись поверх по этим-же адресам этого-же блока не помогает.

Согласно AN11008 с сайта NXP такая запись без стирания возможна. В еррате ничего нет.

Сталкивался-ли кто-нибудь с подобным?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
aaarrr
сообщение Oct 4 2013, 15:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Дозапись возможна, но только блоками, размер которых кратен 16 байтам. По крайней мере, для LPC13xx так. В мануале на 17xx вопрос обошли стороной почему-то...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 4 2013, 16:29
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Ясен пень - пишу блоками по 256 (пробовал и по 512). Иначе бы IAP вообще вылетал-бы с ошибкой.
И в UM на 17x не обошли это стороной - чётко указаны возможные размеры блоков для записи:
------------------------------------------------------------------------------------------
Param0(DST): Destination flash address where data bytes are to be written. This
address should be a 256 byte boundary.
Param1(SRC): Source RAM address from which data bytes are to be read. This
address should be a word boundary.
Param2: Number of bytes to be written. Should be 256 | 512 | 1024 | 4096.
------------------------------------------------------------------------------------------

Ясно что перед записью своей записи, я определяю границы блока выбранного размера, в который она входит, считываю данные блока в буфер в ОЗУ,
копирую туда свою запись, и потом пишу весь блок.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 4 2013, 19:07
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(jcxz @ Oct 4 2013, 20:29) *
Ясен пень - пишу блоками по 256 (пробовал и по 512). Иначе бы IAP вообще вылетал-бы с ошибкой.

Не о тех блоках речь. На каждые строку (16 байт) флеш приходится один байт ECC, поэтому дозапись страницы можно вести исключительно целыми строками.

Цитата(jcxz @ Oct 4 2013, 20:29) *
Ясно что перед записью своей записи, я определяю границы блока выбранного размера, в который она входит, считываю данные блока в буфер в ОЗУ,
копирую туда свою запись, и потом пишу весь блок.

Так вот "своя запись" выровнена по границе 16?
Go to the top of the page
 
+Quote Post
Axel
сообщение Oct 4 2013, 21:08
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Вполне себе работает. У меня таким образом организован кольцевой буфер из двух 32к секторов (контроллер LPC1778, блоки по 256 байт). Может у Вас чего не так с таймингом?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 5 2013, 10:45
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(aaarrr @ Oct 5 2013, 01:07) *
Не о тех блоках речь. На каждые строку (16 байт) флеш приходится один байт ECC, поэтому дозапись страницы можно вести исключительно целыми строками.
Так вот "своя запись" выровнена по границе 16?

Хмм... Нет, она выровнена только на 4.
Странно, что нигде в UM нет упоминания про это... Надо будет попробовать. Спасибо за наводку! beer.gif

Цитата(Axel @ Oct 5 2013, 03:08) *
Может у Вас чего не так с таймингом?

Что Вы имеете в виду?
Go to the top of the page
 
+Quote Post
Axel
сообщение Oct 6 2013, 03:13
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Цитата(jcxz @ Oct 5 2013, 14:45) *
Что Вы имеете в виду?

Да собственно ничего кроме настроек регистра FLASHCFG и парметра частоты при вызове функций IAP драйвера
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 6 2013, 15:51
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



SYSCFG.FLASHCFG = (CCLK - 1) / 20000 << 12 | 0x3A;
где: CCLK - тактовая процессора [кГц]. Это-же значение передаётся IAP.
Если с предварительным стиранием, то Flash пишется нормально всегда.
Go to the top of the page
 
+Quote Post
Axel
сообщение Oct 6 2013, 18:55
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Цитата(jcxz @ Oct 6 2013, 18:51) *
SYSCFG.FLASHCFG = (CCLK - 1) / 20000 << 12 | 0x3A;
где: CCLK - тактовая процессора [кГц]. Это-же значение передаётся IAP.

Ну да, у меня так же... Пока действительно, кроме выравнивания идей нет.
Go to the top of the page
 
+Quote Post
Sanya_kv
сообщение Oct 7 2013, 04:36
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 25-02-09
Из: Россия
Пользователь №: 45 369



Та же проблема (В один блок нельзя писать более 1 раза без стирания).
Ошибка происходит не всегда, а при некоторой комбинации данных (у меня происходила примерно 1/20). Зависимость не выявил.
При записи изменял байты, которые до этого были равны 0xFF. Например до записи блок == 12 34 FF FF FF FF ..., записываю 12 34 56 78 FF FF ..., по идее должно получиться 12 34 56 78 FF FF ..., но почему-то не всегда.
Пробовал писать блоки по 256, 512 и по 1к. Делал частоту в 2 раза медленней. Победить проблему так и не удалось. Обнаружил достаточно давно на LPC24xx, далее подтвердилась на LPC1778.
Ставит в тупик, это то что иногда ошибка появляется появляется в соседнем блоке, отличном от кого в который писал.
Данная тема уже подымалась на этом форуме в районе 1 - 2-х лет назад.
Цитата
На каждые строку (16 байт) флеш приходится один байт ECC, поэтому дозапись страницы можно вести исключительно целыми строками.

Спасибо за инфу. Как доберусь до железки обязательно проверю.
Go to the top of the page
 
+Quote Post
KRS
сообщение Oct 7 2013, 08:35
Сообщение #11


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Вообще в описании IAP однозначно указано что адрес должен быть выравнен на 256 байт! И размер блока может быть тоже от 256 байт.

про 16 байт - это размер шины флеша - 128 бит + ECC, но это был хак опубликованный для LPC2000. Для новых чипов в принципе тоже можно по 16 байт писать, но это не документировано.
Если хотите штатно - размер блока 256 байт и выравнены они на 256 байт! Все работает отлично!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 7 2013, 08:38
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(KRS @ Oct 7 2013, 12:35) *
про 16 байт - это размер шины флеша - 128 бит + ECC, но это был хак опубликованный для LPC2000. Для новых чипов в принципе тоже можно по 16 байт писать, но это не документировано.

Для LPC13xx документировано. По какой причине "забыли" для других - вопрос.
Go to the top of the page
 
+Quote Post
KRS
сообщение Oct 7 2013, 08:48
Сообщение #13


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(aaarrr @ Oct 7 2013, 12:38) *
Для LPC13xx документировано. По какой причине "забыли" для других - вопрос.

с 13xx не работал.
а вот в 17xx и 11xx ограничение в 256 байт есть.
причем и IAP и бутлоадер ЕМНИП выдавал ошибку при нарушении. (DST_ADDR_ERROR)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 7 2013, 09:54
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(KRS @ Oct 7 2013, 12:48) *
а вот в 17xx и 11xx ограничение в 256 байт есть.

Оно и для 13xx есть, записать можно только целую страницу, 256 или более байт.
Вопрос же стоит в возможности и ограничениях по дозаписи внутри страницы.
Кстати, в мануале на LPC11 работа ECC тоже описана (26.3.7).
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 7 2013, 10:03
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(KRS @ Oct 7 2013, 14:48) *
причем и IAP и бутлоадер ЕМНИП выдавал ошибку при нарушении. (DST_ADDR_ERROR)

Вы просто не поняли о чём речь. Перечитайте ещё раз переписку.
Дело не в размере блока, передаваемом функции IAP и не в его стартовом адресе - здесь всё согласно UM, иначе IAP выдавал-бы ошибку.
Дело в записи ПОВЕРХ ранее записанного блока (скажем 256-байтного), новых данных без стирания.
Так вот, уважаемый aaarrr утверждает, что внутри такого 256-байтного блока, нельзя менять те его 16-байтные строки, в которых уже есть 0-ые биты, а можно менять только те 16-байтные строки, в которых только исключительно все биты ==1. Мне кажется это вполне правдоподобная версия и проверю её.
Я же делил страницу (4КБ) флеш на блоки не кратные 16 байт, соответственно записи у меня часто перекрывали (не полностью) несколько соседних 16-байтных строк или даже переходили через границу страницы (256байт) в соседнюю.

Жаль только, что проверить можно только статистически - так как вышеописанный баг у меня проявляется только на некоторых наборах записываемых данных определённой длины. Если размер записи увеличить, то не факт что баг пропадёт из-за решения проблемы, может для такого набора данных такой длины он просто не проявляется.

Цитата(aaarrr @ Oct 7 2013, 15:54) *
Вопрос же стоит в возможности и ограничениях по дозаписи внутри страницы.

Возможность определённо есть (этому посвящён Application Notes котоорый я упоминал выше), но вот насчёт ограничений я не в курсе.
Может там это и описано, но я его читал по диагонали и уже после реализации своего алгоритма.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:30
Рейтинг@Mail.ru


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