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

|
Есть устройство на этом чипе, выпущено уже 600 плат. С десяток плат замечены в том, что чип ИНОГДА не запускается. Одно из первых вещей которые делается в майн это зажигание светодиода, чего не происходит. Проблема в том, что происходит это весьма редко,и пока я не понял от чего зависит. Я взял 4 платы у заказчика которые я видел, что они не запускаются несколько раз (но не подряд), но повторить у себя в лаборатории не могу. Пробовал их охлаждать, и блок питания тоже. Никакго эффекта.
Дергание ресета когда плата зависла в этот момент не помогает. Подозрений у меня два:
1. Не запускается PLL по каким-то причинам и чип безнадежно его ожидает. Но почему ресет не помогает? 2. Блок питания каким-то образом вводит чип в неправильное состояние. Медленно напряжение нарастает? Может это быть причиной?
Какие могут быть еще варианты, и как можно проверить обе версии? Как можно увеличить вероятность незапуска?
Спасибо!
|
|
|
|
|
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)  Мне интересно как вы в итоге пришли к такому диагнозу, что именно зависал конвеер? Так же мне не очень понятно почему ресет в этом случает не помогал? Ну это не обязательно имеет отношение к моей проблеме, а в общем. Лишь мои домыслы, не более того. Ресет, если следовать армовской документации, это прерывание с наивысшим приоритетом. Если в процессе ресета процессор зависнет, скажем, на чтении инструкции из флеша, ресет не отработает. Именно это я и наблюдал.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|