|
LPC2478 не запускается ИНОГДА, как поймать от чего? |
|
|
|
Oct 9 2012, 17:39
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Есть устройство на этом чипе, выпущено уже 600 плат. С десяток плат замечены в том, что чип ИНОГДА не запускается. Одно из первых вещей которые делается в майн это зажигание светодиода, чего не происходит. Проблема в том, что происходит это весьма редко,и пока я не понял от чего зависит. Я взял 4 платы у заказчика которые я видел, что они не запускаются несколько раз (но не подряд), но повторить у себя в лаборатории не могу. Пробовал их охлаждать, и блок питания тоже. Никакго эффекта.
Дергание ресета когда плата зависла в этот момент не помогает. Подозрений у меня два:
1. Не запускается PLL по каким-то причинам и чип безнадежно его ожидает. Но почему ресет не помогает? 2. Блок питания каким-то образом вводит чип в неправильное состояние. Медленно напряжение нарастает? Может это быть причиной?
Какие могут быть еще варианты, и как можно проверить обе версии? Как можно увеличить вероятность незапуска?
Спасибо!
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 38)
|
Oct 9 2012, 20:03
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(Nixon @ Oct 9 2012, 15:17)  Когда-то был такой вопрос уже на форуме по поводу подобных симптомов - посмотрите не выходите ли вы вы за диапазон допустимого для Fcco при конфигурировании PLL. Mvalue - 45 (в регистр 44) NValue - 1 резонатор - 12МГц, что дает частоту PLL 540МГц. Близко к пределу 550, но все-таки в пределах.
|
|
|
|
|
Oct 9 2012, 23:55
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(Nixon @ Oct 9 2012, 16:34)  При ваших значениях M = 45 и N = 1 мы получим Fcco = 2 * M * Fin / N = 90 * 12 = 1080 Mhz. Многовато будет. Стартовать может и будет, но неустойчиво очень. Пересчитывайте коэффициенты. P.S. Я обычно, если есть какой-то ограничительный диапазон, стараюсь выбирать значения из его середины - спокойнее как-то  я неправильно написал, N = 2, (1 написано в регистре). CCLKSEL = 7, что дает CPU clock 67.5MHz. Код инициализации PLL был взят целиком из Embedded Artists примеров, как и исходные параметры. только частоту я один раз менял с 72 на 67.5. Смотря сейчас на этот код, я вижу там одну подозрительную строку: Код void ConfigurePLL ( void ) { unsigned int MValue, NValue;
if ( PLLSTAT & (1 << 25) ) { PLLCON = 1; /* Enable PLL, disconnected */ PLLFEED = 0xaa; PLLFEED = 0x55; }
PLLCON = 0; /* Disable PLL, disconnected */ PLLFEED = 0xaa; PLLFEED = 0x55; SCS |= 0x20; /* Enable main OSC */ while( !(SCS & 0x40) ); /* Wait until main OSC is usable */
CLKSRCSEL = 0x1; /* select main OSC, 12MHz, as the PLL clock source */
PLLCFG = PLL_MValue | (PLL_NValue << 16); PLLFEED = 0xaa; PLLFEED = 0x55; PLLCON = 1; /* Enable PLL, disconnected */ PLLFEED = 0xaa; PLLFEED = 0x55;
CCLKCFG = CCLKDivValue; /* Set clock divider */ #if USE_USB USBCLKCFG = USBCLKDivValue; /* usbclk = 288 MHz/6 = 48 MHz */ #endif
while ( ((PLLSTAT & (1 << 26)) == 0) ); /* Check lock bit status */ MValue = PLLSTAT & 0x00007FFF; NValue = (PLLSTAT & 0x00FF0000) >> 16; while ((MValue != PLL_MValue) && ( NValue != PLL_NValue) );
PLLCON = 3; /* enable and connect */ PLLFEED = 0xaa; PLLFEED = 0x55; while ( ((PLLSTAT & (1 << 25)) == 0) ); /* Check connect bit status */ } Не нравится мне эта строка: Код while ((MValue != PLL_MValue) && ( NValue != PLL_NValue) ); PLL_MValue и PLL_NValue это defines, две переменные в цикле не меняются. Понятно что этот цинл в теории не должен никогда срабатывать, но... Цитата(KRS @ Oct 9 2012, 16:17)  было подобное у LPC, обычно с питанием и ресетом связано. Внешний супервизор стоит? (еще можно попробовать задержку перед включением PLL) И обязательно проверить что бы код запуска PLL был корректный, например, для отладки вызвать функцию инициализации второй раз (при уже запущенном PLL) т.е. там нужно проверять запущен ли уже и т.п. отключать в нужной последовательности. Супервизора нет. Питание нарастает до 3.3В за 4мс. Ресет просто подвязан к питанию через резистор. Думаю добавлю в процедуру инициализации PLL диагностической печати, чтобы если девайс не стартовал, можно было бы проверить, где он.
|
|
|
|
|
Oct 10 2012, 08:55
|
Частый гость
 
Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371

|
Цитата(Сергей Борщ @ Oct 10 2012, 11:31)  Предполагаю, что процессор сваливается во встроенный загрузчик из-за неправильного уровня на ноге P2.10 У нас было так на плате с LPC2132, когда только начинали с ним работать. У LPC есть нога, нулевой уровень на которой в момент ресета запускает встроенный (заводской) загрузчик. У 2132 это была P0.14. У нас она использовалась еще для работы с внешним АЦП и при включении девайса иногда была ситуация что в момент запуска МК в момент поднятия ресета напряжение на этой ноге еще не установилось. Тоже долго не могли понять почему иногда некоторые платы не стартуют.
|
|
|
|
|
Oct 10 2012, 14:26
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(Сергей Борщ @ Oct 10 2012, 04:31)  Предполагаю, что процессор сваливается во встроенный загрузчик из-за неправильного уровня на ноге P2.10 О, вот это интересно. На ногу Р2.10 выведена схема от интерфеса программатора через последовательный порт (также скопирована с EA платы), и при отключенном программаторе там high-z. Попробовать туда поставить пулл-ап? Или без задержки отпускания ресета все равно не обойтись? И ресет не действует на внутренний загрузчик? Цитата(MBR @ Oct 10 2012, 00:44)  У меня было подобное на STM32, когда flash latency конфигурировалась слишком оптимистично. В итоге зависал конвеер и процессор не реагировал ни на одно из прерываний, включая ресет. Первый случай, при котором нужно увеличивать flash latency был, емнип, как раз 60 МГц. Так что, с 67 как раз может проскакивать в большинстве случаев. Мне интересно как вы в итоге пришли к такому диагнозу, что именно зависал конвеер? Так же мне не очень понятно почему ресет в этом случает не помогал? Ну это не обязательно имеет отношение к моей проблеме, а в общем. Цитата(haker_fox @ Oct 10 2012, 01:37)  Вот так мы инициализируем PLL на LPC24xx. Кореллирует с User Manual. У вас в общем-то все тоже самое что и в нашем (EA) коде.
|
|
|
|
|
Oct 10 2012, 14:37
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748

|
Цитата(ar__systems @ Oct 10 2012, 18:26)  Мне интересно как вы в итоге пришли к такому диагнозу, что именно зависал конвеер? Так же мне не очень понятно почему ресет в этом случает не помогал? Ну это не обязательно имеет отношение к моей проблеме, а в общем. Лишь мои домыслы, не более того. Ресет, если следовать армовской документации, это прерывание с наивысшим приоритетом. Если в процессе ресета процессор зависнет, скажем, на чтении инструкции из флеша, ресет не отработает. Именно это я и наблюдал.
|
|
|
|
|
Oct 10 2012, 17:17
|

Знающий
   
Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206

|
Вы где-нибудь на этапе до всякой инициализации в ПО на неиспользуемой внешней ноге установите уровень, по которому можно посмотреть скопом, проходит проц этот участок кода или нет. Если используете IAR, то лучше сделать в __low_level_init в самом начале, для других кросс-компиляторов должны быть подобные механизмы, или стартап поправить. Вы таким образом практически однозначно определите, стартует у вас контроллер из флэш и выполняет ваше ПО, а потом виснет, или сваливается в бутлоадер. Если вы используется C++, то проблема может заключаться в конструкторе глобальных объектов, которые вызываются при инициализации системы. Да мало ли там еще может быть причин. По вашим постам не совсем понятно, как и где вы инициализируете систему и что у вас там наворочено.
--------------------
Пасу котов...
|
|
|
|
|
Oct 11 2012, 05:27
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748

|
Цитата(aaarrr @ Oct 10 2012, 18:56)  Это пишут в разделе Programmer's model. Прерыванием он является только с этой стороны. Где пишут иначе? И почему тогда до полного обесточивания чипа я наблюдаю отказ обработки ресета?
|
|
|
|
|
Oct 11 2012, 14:26
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748

|
Цитата(aaarrr @ Oct 11 2012, 16:42)  Неужели Вы действительно полагаете, что сигналы IRQn и RESETn чем-то похожи? А как тогда быть с soft-reset (armv7)? Цитата(aaarrr @ Oct 11 2012, 16:42)  Конвеер, разумеется, по сбросу очищается. Если "разумеется", почему ресет не отрабатывает? Цитата(aaarrr @ Oct 11 2012, 16:42)  В других разделах. А грубить-то зачем?
|
|
|
|
|
Oct 11 2012, 19:28
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(MBR @ Oct 11 2012, 18:26)  А как тогда быть с soft-reset (armv7)? Сравните методы вызова "программного" сброса и честного исключения типа SVC. Разница заметна? Первое - не более чем взвод битика в периферийном модуле (пусть и являющимся неотъемлемой частью ядра), приводящий в результате к активации вполне себе "железных" цепей сброса, а не выполнению некой программной последовательности.
|
|
|
|
|
Oct 18 2012, 11:50
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(Andy Mozzhevilov @ Oct 17 2012, 22:58)  Не понятна фраза "Ресет так же не помогает и в течении секунд 20-30 программа нормально стартует." Может кратко в одном посте можете описать последовательность действий и состояний контроллера? Да немного приболел последние 3 дня так что не занимался проблемой. Ресет не работает, т.е. никакого видимого эффекта на плату не производит. Если же ее не трогать, она через какое-то время начинает работать как и должна, это я имел ввиду под словами "в течении секунд 20-30 программа нормально стартует". Все тоже самое я наблюдаю если запускать плату с притянутым к нулю RTCK.
|
|
|
|
|
Oct 18 2012, 16:42
|

Знающий
   
Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206

|
Цитата(ar__systems @ Oct 18 2012, 15:50)  Да немного приболел последние 3 дня так что не занимался проблемой.
Ресет не работает, т.е. никакого видимого эффекта на плату не производит. Если же ее не трогать, она через какое-то время начинает работать как и должна, это я имел ввиду под словами "в течении секунд 20-30 программа нормально стартует". Все тоже самое я наблюдаю если запускать плату с притянутым к нулю RTCK. Как вы определяете факт старта платы? У вас есть динамическая инициализация, т.е. вы используете С++ и глобальные объекты классов, или у вас чисто С код? Те 20-30 секунд, когда плата находится в непонятном для вас состоянии, осциллятор запускается? Все это происходит только по включению питания, или нормально заработавшая плата может в такое состояние переходить, если ей дернуть Reset?
--------------------
Пасу котов...
|
|
|
|
|
Oct 18 2012, 22:39
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(Andy Mozzhevilov @ Oct 18 2012, 12:42)  Как вы определяете факт старта платы? У вас есть динамическая инициализация, т.е. вы используете С++ и глобальные объекты классов, или у вас чисто С код? Те 20-30 секунд, когда плата находится в непонятном для вас состоянии, осциллятор запускается? Все это происходит только по включению питания, или нормально заработавшая плата может в такое состояние переходить, если ей дернуть Reset? Нету никой динамической инициализации и С++ тоже нету. После ресета плата ни разу ни была замечена в зависании. Я до сегодняшнего дня не имел возможности потыкать скопом в зависшую плату, поэтому про состояния кварца тоже не было ничего известно. ---------------------------------------------------------------------------------------------------- Короче я понял в чем дело.  *Всем большое спасибо за участие и советы!!!* Плата питается 5В от внешнего БП. Если увеличить время нарастания питания с 0 до 5В до примерно 50 ms плата виснет 100% попыток. После 5В стоит 3.3В регулятор LD1117. Вскоре после достижения VDD 3.0B чип включается и пытается запустить кварц. После примерно 10 колебаний кварца на VDD начинается что-то странное - толи у LD1117 ограничение по току включается, толи он при таком напряжении вообще себя неадекватно ведет, только VDD выше 3.0В так и не вырастает, начинается какая-то байда. далее на VDD наблюдаю что-то типа UUUUUUUU c верхними пиками на 3В и нижней кромкой около 2.1В. При этом потребление тока примерно на 500мА больше чем при нормально включившейся плате. Если подаю 3.3В с таким же медленным рампом от другого регулятора непосредственно на VDD, все стартует нормально. Кстати, все обыскал, но спецификаций на то, как быстро должен нарастать VDD у этого CPU не нашел. Т.е. сам по себе факт медленного нарастания VDD для чипа не проблема, главное чтобы регулятор не спотыкался при резком скачке тока в момент старта чипа. Вставил небольшую задержку перед стартом кварца. Вроде стало работать. При этом шняга какая-то на VDD все равно видна, но не бесконечная, как раньше, а всего на пару мс. Думаю в следуеще версии заменю нафиг этот регулятор. Цитата(AlexandrY @ Oct 18 2012, 15:12)  Неплохой показатель для 600 плат проблемы иметь всего с десятком. Вполне вписывается в процент брака. Я бы смело менял чипы и не копал бы дальше. Казалось бы да, но дефект проявляется крайне редко, и уже пару плат вернулось от заказчиков после тестирования, проверок итд. Т.е. не исключено, что они все такие. Цитата(Lotor @ Oct 18 2012, 08:25)  Вам ранее советовали уже с помощью осцилла определить в каком месте затык. Почему Вы не следуете этому здравому совету? =) Написал же, болел
|
|
|
|
|
Oct 19 2012, 09:17
|

Местный
  
Группа: Свой
Сообщений: 204
Регистрация: 14-10-05
Из: г. Москва
Пользователь №: 9 641

|
Цитата(ar__systems @ Oct 19 2012, 02:39)  Плата питается 5В от внешнего БП. Если увеличить время нарастания питания с 0 до 5В до примерно 50 ms плата виснет 100% попыток.
После 5В стоит 3.3В регулятор LD1117. Вскоре после достижения VDD 3.0B чип включается и пытается запустить кварц. После примерно 10 колебаний кварца на VDD начинается что-то странное - толи у LD1117 ограничение по току включается, толи он при таком напряжении вообще себя неадекватно ведет, только VDD выше 3.0В так и не вырастает, начинается какая-то байда. далее на VDD наблюдаю что-то типа UUUUUUUU c верхними пиками на 3В и нижней кромкой около 2.1В. При этом потребление тока примерно на 500мА больше чем при нормально включившейся плате. У вас LD1117 фиксированный на +3.3V или ADJ? Входное напряжение +5В как себя ведёт, когда VDD начинает дёргаться? А конденсатор на выходе LD1117 какой стоит? Если стоит 10 мкФ, то, возможно, вам надо его увеличить, хотя бы до 20 мкФ.
|
|
|
|
|
Oct 19 2012, 14:12
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(Zwerg_nase @ Oct 19 2012, 05:17)  У вас LD1117 фиксированный на +3.3V или ADJ? Входное напряжение +5В как себя ведёт, когда VDD начинает дёргаться? А конденсатор на выходе LD1117 какой стоит? Если стоит 10 мкФ, то, возможно, вам надо его увеличить, хотя бы до 20 мкФ. Конденсатор стоит 22мкф электролит, даже два, но один на другом конце платы. 5В напряжение ведет себя прекрасно, спокойненько продолжает себе расти по прямой до 5В. LD1117 фиксированый.
|
|
|
|
|
Oct 22 2012, 13:52
|

Местный
  
Группа: Свой
Сообщений: 204
Регистрация: 14-10-05
Из: г. Москва
Пользователь №: 9 641

|
Цитата(ar__systems @ Oct 19 2012, 18:12)  Конденсатор стоит 22мкф электролит, даже два, но один на другом конце платы. 5В напряжение ведет себя прекрасно, спокойненько продолжает себе расти по прямой до 5В.
LD1117 фиксированый. На мой взгляд, проблема в том, что при увеличении выходного тока, т.е. когда процессор включается при VDD = +3V, увеличивается Dropout Voltage регулятора (в даташите оно отличается на 0,1V при увеличении выходного тока со 100 мА до 800 мА), а так как на входе напряжение не успевает пропорционально вырасти, то регулятор перестаёт регулировать и на выходе получаются броски напряжения. Возможно, это получиться вылечить увеличением выходной ёмкости. В даташите у ST на выходе LD1117 нарисованы конденсаторы до 100 мкФ.
|
|
|
|
|
Oct 22 2012, 15:15
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(Zwerg_nase @ Oct 22 2012, 09:52)  На мой взгляд, проблема в том, что при увеличении выходного тока, т.е. когда процессор включается при VDD = +3V, увеличивается Dropout Voltage регулятора (в даташите оно отличается на 0,1V при увеличении выходного тока со 100 мА до 800 мА), а так как на входе напряжение не успевает пропорционально вырасти, то регулятор перестаёт регулировать и на выходе получаются броски напряжения. Возможно, это получиться вылечить увеличением выходной ёмкости. В даташите у ST на выходе LD1117 нарисованы конденсаторы до 100 мкФ. Кстати, интересная версия. Не совсем правда объясняет почему VDD вообще не поднимается после этого выше 3В? Даже когда Vin доходит до 5В. Да, про конденсатор я тоже подумал. Увеличим его тоже.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|