|
IAP в LPC, баянистый вопрос наверное... |
|
|
|
Apr 29 2006, 13:41
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Грабли будут по любому Цитата(Romario @ Apr 28 2006, 14:59)  нужно ли копировать код, который вызывает функцию IAP в раму? Если прямо на вопрос, то толку вызавать IAP из RAM если сам IAP передаст управление опять во FLASH? А если взглянуть шире, то к любым слухам стоит прислушаться. IAP в LPC вещь очень ненадежная и странная. На мой взгляд у них серьезные проблемы с модулем Error Correction Code или контроллером FLASH. Я например знаю последовательность данных запись которых во FLASH через IAP гарантировано приведет к искажению информации в соседних ячейках. Выражаться будет в том, что в соседней ячейке с записанным 0 и которую при записи совершенно не трогаем возникнет бит 1, который нельзя будет в последствии перезаписать в 0! (ну не считая полного стирания сектора) Ни отключение MAM, ни отключение PLL, ничего от этого эффекта не помогает. Проверено на нескольких LPC2148, и в разных секторах. Использование IAP полностью корректное, прерывания отключены, питание стабильное, эффект тоже очень стабильный - 100%-ый. Процедура использования IAP сверена с тем как делается в примерах у IAR и у Keil, в файловой системе Keil-а и как рекомендует сам Philips. Тонкость в том, что в файловых системах применяется многократная дозапись страниц в сектора FLASH-и. Если писать страницы сразу и не трогать потом, эффект не заметил пока. Но, скажем, знаю разработчиков которые имели проблемы и с однократной постраничной записью.
|
|
|
|
|
Apr 29 2006, 15:24
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AlexandrY @ Apr 29 2006, 16:41)  Грабли будут по любому .... А если взглянуть шире, то к любым слухам стоит прислушаться. ... Я например знаю последовательность данных запись которых во FLASH через IAP гарантировано приведет к искажению информации в соседних ячейках. Ну вот кто-то где-то что-то сказал :-( 1. Давайте сюда эту жуткую последовательность. 2. Городить файловую систему (32K блоки после стирания восстанавливать :-( ) на встроенном FLASH на запись - наверное не стоит по любому. 3. ISP загрузчик сам через ISP (естественно без дозаписи 512 байтовыми страницами а сразу сектором) работает с абсолютно разной информацией и никаких проблем......
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 29 2006, 16:41
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(zltigo @ Apr 29 2006, 18:54)  Цитата(AlexandrY @ Apr 29 2006, 16:41)  Грабли будут по любому .... А если взглянуть шире, то к любым слухам стоит прислушаться. ... Я например знаю последовательность данных запись которых во FLASH через IAP гарантировано приведет к искажению информации в соседних ячейках. Ну вот кто-то где-то что-то сказал :-( 1. Давайте сюда эту жуткую последовательность. 2. Городить файловую систему (32K блоки после стирания восстанавливать :-( ) на встроенном FLASH на запись - наверное не стоит по любому. 3. ISP загрузчик сам через ISP (естественно без дозаписи 512 байтовыми страницами а сразу сектором) работает с абсолютно разной информацией и никаких проблем...... Ну например: При чистом FLASH секторе т.е. где все 0xFF делаете так: Организуете в RAM буфер скажем на 1024 байт (или 512 , это ничего не изменит ) Весь буфер заполняем 0xFF в конец только припишем по смещению 0x3F8 массив {0x0C, 0x00, 0x00, 0x00} Записываем буфер (1024 байт) во FLASH по адресу 0x1FС00 используя IAP Теперь обратно из FLASH по адресу 0x1FC00 считываем в буфер те же 1024 байта и дописываем в буфер по смещению 0x3FС массив {0xF0, 0xF0, 0xF0, 0xF0} Снова записываем буфер во FLASH по адресу 0x1FС00 используя IAP Теперь проверяем че там во FLASH записалось и видим по адресу 0x1FFFB байт 0x01 Попытки забить это байт 0-ем ни к чему не приведут. Таких вариантов могу привести кучу. Эффект проявлялся как в конце сектора FLASH так и в начале и в разных секторах
|
|
|
|
|
Apr 29 2006, 18:55
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AlexandrY @ Apr 29 2006, 19:41)  Таких вариантов могу привести кучу. Описано подробно. Проверить легко. Проэкспериментирую. Цитата Теперь обратно из FLASH по адресу 0x1FC00 считываем в буфер те же 1024 байта ... Этот шаг явно ни причем... Однако! Эксперимент провел. С дозаписью явные проблемы - у меня в результате обнулился 6 бит в 0x1FFF0. Результат другой, но от этого не меннее неприятный. Меня правда никогда не тянуло дозаписывать во внутренний Flash и теперь уж точно не буду. Спасибо за информацию.
Сообщение отредактировал zltigo - Apr 29 2006, 22:20
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 5 2006, 15:18
|

Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 26-06-04
Пользователь №: 192

|
Цитата(AlexandrY @ May 5 2006, 16:44)  Выяснил проблему. Оказывается Philips всех лоханул. ECC то его работает на 128 битах, а в мануалах они везде пишут что шить можно по 4-е байта, а на самом деле надо по 16-ть. На это повелся Keil и написал нерабочую файловую систему для LPC А за ними и я. Итак вывод: Во FLASH LPC надо писать блоками данных кратными 16-и байтам и повторно в эти блоки больше ничего записывать нельзя даже если там осталось много FF. Отсюда видно, что файловую систему типа той что написал Keil в принципе нормально реализовать нельзя для LPC . опередили!:))) аккурат я об этом и хотел сегодня написать в этот топик. вчера проводил эксперимент  ) p.s. т.к. что то уж смутно верилось в то, что филипок так облажался.
Сообщение отредактировал Romario - May 5 2006, 15:20
|
|
|
|
|
May 5 2006, 15:34
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Romario @ May 5 2006, 18:18)  p.s. т.к. что то уж смутно верилось в то, что филипок так облажался. Ну насчет 'облажался' - разве они где-то написали, что можно писать поверх записанного блока??? Цитата ECC то его работает на 128 битах, а в мануалах они везде пишут что шить можно по 4-е байта, а на самом деле надо по 16-ть. Ну когда я читал в последний раз мануалы, там было 512 байт и далее кратно..... В последних на 213x/4x 256 и кратно, так что на счет "везде пишут 4 байта" - нет такого. Посему наибольшую лажу спорол Keil, родив 'файловую систему'.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 10 2006, 04:31
|
Частый гость
 
Группа: Участник
Сообщений: 120
Регистрация: 2-09-05
Из: Екатеринбург
Пользователь №: 8 165

|
Цитата(AlexandrY @ May 5 2006, 22:22)  Не, видать не поняли. В IAP - да, совать надо страницами по 512 и т.д. байт. Но для файловой системы важнее грануляция секторов на немодифицируемые в дальнейшем ячейки. Для обычных флешей можно модифицировать каждый байт забивая 1-цы нулями. Филипс утверждает что в его флеши это 4-е последовательных байта (смотрите внимательнее мануал где про FLASH) А на самом деле 16-ть и реверс ихнего IAP-а показывает, что за раз они шьют по 16-ть байт. Действительно, у них в мануале на LPC213x есть ошибка: A byte of ECC corresponds to every consecutive 128 bits of the user accessible Flash. Consequently, Flash bytes from 0x0000 0000 to 0x0000 0003 are protected by the first ECC byte, Flash bytes from 0x0000 0004 to 0x0000 0007 are protected by the second ECC byte, etc. Пока все нормально: 4 слова = 16 байт = 128 бит. Therefore, for the implemented ECC mechanism to perform properly, data must be written into the Flash memory in groups of 4 bytes (or multiples of 4), aligned as described above. А вот здесь они опечатались, т.к. described above 16 байт, а не 4. Спасибо за информацию.
|
|
|
|
|
May 14 2006, 07:30
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ May 14 2006, 07:49)  Но я не хочу писать ботлоадер. Меня интересует можно ли это сделать на встроенном. Просто, можно или нельзя обрабатывать прерывания? Ну официально, как Вы уже поняли, нельзя. Если "очень хочется" - либо пишите свой(вдруг получится), либо разбирайтесь с родным (вдруг когда "можно"). Для этого и ссылка была дана. Цитата Во флэше нужно хранить журнал с показаниями. Такую систему можно сделать на двух последовательно соединённых LPC-шках. А меня интересует, можно ли сделать на одной? Для этого просто вешается последовательная FLASH/EEPROM на I2C или SPI (можно съемную) а отнюдь не второй контроллер. Заодно и ресурс контроллера не выработаете.....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|