|
IAP в LPC17x, запись без стирания - возможно-ли? |
|
|
|
Oct 4 2013, 14:55
|
Гуру
     
Группа: Свой
Сообщений: 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 такая запись без стирания возможна. В еррате ничего нет.
Сталкивался-ли кто-нибудь с подобным?
|
|
|
|
|
 |
Ответов
|
Oct 7 2013, 10:03
|
Гуру
     
Группа: Свой
Сообщений: 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 котоорый я упоминал выше), но вот насчёт ограничений я не в курсе. Может там это и описано, но я его читал по диагонали и уже после реализации своего алгоритма.
|
|
|
|
Сообщений в этой теме
jcxz IAP в LPC17x, запись без стирания - возможно-ли? Oct 4 2013, 14:55 aaarrr Дозапись возможна, но только блоками, размер котор... Oct 4 2013, 15:27 jcxz Ясен пень - пишу блоками по 256 (пробовал и по 512... Oct 4 2013, 16:29  aaarrr Цитата(jcxz @ Oct 4 2013, 20:29) Ясен пен... Oct 4 2013, 19:07   jcxz Цитата(aaarrr @ Oct 5 2013, 01:07) Не о т... Oct 5 2013, 10:45    Axel Цитата(jcxz @ Oct 5 2013, 14:45) Что Вы и... Oct 6 2013, 03:13     jcxz SYSCFG.FLASHCFG = (CCLK - 1) / 20000 << 12 |... Oct 6 2013, 15:51      Axel Цитата(jcxz @ Oct 6 2013, 18:51) SYSCFG.F... Oct 6 2013, 18:55 Axel Вполне себе работает. У меня таким образом организ... Oct 4 2013, 21:08 Sanya_kv Та же проблема (В один блок нельзя писать более 1 ... Oct 7 2013, 04:36   aaarrr Цитата(KRS @ Oct 7 2013, 12:48) а вот в 1... Oct 7 2013, 09:54
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|