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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> LPC2478 не запускается ИНОГДА, как поймать от чего?
ar__systems
сообщение Oct 9 2012, 17:39
Сообщение #1


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Есть устройство на этом чипе, выпущено уже 600 плат. С десяток плат замечены в том, что чип ИНОГДА не запускается. Одно из первых вещей которые делается в майн это зажигание светодиода, чего не происходит. Проблема в том, что происходит это весьма редко,и пока я не понял от чего зависит. Я взял 4 платы у заказчика которые я видел, что они не запускаются несколько раз (но не подряд), но повторить у себя в лаборатории не могу. Пробовал их охлаждать, и блок питания тоже. Никакго эффекта.

Дергание ресета когда плата зависла в этот момент не помогает.
Подозрений у меня два:

1. Не запускается PLL по каким-то причинам и чип безнадежно его ожидает. Но почему ресет не помогает?
2. Блок питания каким-то образом вводит чип в неправильное состояние. Медленно напряжение нарастает? Может это быть причиной?

Какие могут быть еще варианты, и как можно проверить обе версии? Как можно увеличить вероятность незапуска?

Спасибо!
Go to the top of the page
 
+Quote Post
Nixon
сообщение Oct 9 2012, 19:17
Сообщение #2


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



Когда-то был такой вопрос уже на форуме по поводу подобных симптомов - посмотрите не выходите ли вы вы за диапазон допустимого для Fcco при конфигурировании PLL.


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Oct 9 2012, 20:03
Сообщение #3


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, но все-таки в пределах.
Go to the top of the page
 
+Quote Post
KRS
сообщение Oct 9 2012, 20:17
Сообщение #4


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

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



было подобное у LPC, обычно с питанием и ресетом связано. Внешний супервизор стоит?
(еще можно попробовать задержку перед включением PLL)
И обязательно проверить что бы код запуска PLL был корректный, например, для отладки вызвать функцию инициализации второй раз (при уже запущенном PLL) т.е. там нужно проверять запущен ли уже и т.п. отключать в нужной последовательности.
Go to the top of the page
 
+Quote Post
Nixon
сообщение Oct 9 2012, 20:34
Сообщение #5


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



Цитата(ar__systems @ Oct 9 2012, 23:03) *
Mvalue - 45 (в регистр 44)
NValue - 1
резонатор - 12МГц, что дает частоту PLL 540МГц. Близко к пределу 550, но все-таки в пределах.

При ваших значениях M = 45 и N = 1 мы получим Fcco = 2 * M * Fin / N = 90 * 12 = 1080 Mhz. Многовато будет. Стартовать может и будет, но неустойчиво очень. Пересчитывайте коэффициенты.

P.S. Я обычно, если есть какой-то ограничительный диапазон, стараюсь выбирать значения из его середины - спокойнее как-то sm.gif


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Oct 9 2012, 23:55
Сообщение #6


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. Я обычно, если есть какой-то ограничительный диапазон, стараюсь выбирать значения из его середины - спокойнее как-то sm.gif


я неправильно написал, 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 диагностической печати, чтобы если девайс не стартовал, можно было бы проверить, где он.
Go to the top of the page
 
+Quote Post
MBR
сообщение Oct 10 2012, 04:44
Сообщение #7


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

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



У меня было подобное на STM32, когда flash latency конфигурировалась слишком оптимистично. В итоге зависал конвеер и процессор не реагировал ни на одно из прерываний, включая ресет. Первый случай, при котором нужно увеличивать flash latency был, емнип, как раз 60 МГц. Так что, с 67 как раз может проскакивать в большинстве случаев.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Oct 10 2012, 05:37
Сообщение #8


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Вот так мы инициализируем PLL на LPC24xx. Кореллирует с User Manual.
CODE
    uint32_t readback;

    /* Check if PLL is connected, disconnect if yes */
    if( PLLSTAT & PLLSTAT_PLLC )
    {
        PLLCON        = PLLCON_PLLE; // PLL enabled and disconnected
        PLLFEED        = 0xaa;
        PLLFEED        = 0x55;
    }

    PLLCON        = 0;                // PLL disabled
    PLLFEED        = 0xaa;
    PLLFEED        = 0x55;

    SCS|=            SCS_OSCEN;        // Enable main OSC

    while(!(SCS & SCS_OSCSTAT));    // Wait until OSC is usable

    CLKSRCSEL = CLKSRC_MAIN_OSC;    // Select main OSC as the PLL clock source

    /* Select PLL multiplier and devider */
    PLLCFG        = ( mainPLL_MUL | mainPLL_DIV );
    PLLFEED        = 0xaa;
    PLLFEED        = 0x55;

    PLLCON        = PLLCON_PLLE;        // Enable PLL, disconnected
    PLLFEED        = 0xaa;
    PLLFEED        = 0x55;

    /* Set clock devider */
    CCLKCFG        = mainCPU_CLK_DIV;

    //USBCLKCFG    = USBCLK_DIV_VALUE;

    /* Waiting for the PLL achieve lock */
    while(!(PLLSTAT & PLLSTAT_PLOCK));

    readback     = PLLSTAT & 0x00FF7FFF;
    /* stall - invalid readback */
    while (readback != (mainPLL_MUL | mainPLL_DIV));

    /* Enable and connect */
    PLLCON         = (PLLCON_PLLE | PLLCON_PLLC);
    PLLFEED     = 0xaa;
    PLLFEED     = 0x55;
    /* Check connect bit status, wait for connect */
    while(!(PLLSTAT & PLLSTAT_PLLC));


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Lotor
сообщение Oct 10 2012, 05:40
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Может банально кварц не заводится из-за технологической емкости платы?


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
MBR
сообщение Oct 10 2012, 07:00
Сообщение #10


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

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



Если бы кварц запускался через раз, висло бы на цикле ожидания запуска кварца и ресет бы работал.

А если вызвать процедуру инициализации pll дважды, ошибка повторится?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 10 2012, 08:31
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Предполагаю, что процессор сваливается во встроенный загрузчик из-за неправильного уровня на ноге P2.10


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SanvaldYV
сообщение Oct 10 2012, 08:55
Сообщение #12


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

Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371



Цитата(Сергей Борщ @ Oct 10 2012, 11:31) *
Предполагаю, что процессор сваливается во встроенный загрузчик из-за неправильного уровня на ноге P2.10


У нас было так на плате с LPC2132, когда только начинали с ним работать. У LPC есть нога, нулевой уровень на которой в момент ресета запускает встроенный (заводской) загрузчик. У 2132 это была P0.14. У нас она использовалась еще для работы с внешним АЦП и при включении девайса иногда была ситуация что в момент запуска МК в момент поднятия ресета напряжение на этой ноге еще не установилось. Тоже долго не могли понять почему иногда некоторые платы не стартуют.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Oct 10 2012, 14:26
Сообщение #13


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) коде.
Go to the top of the page
 
+Quote Post
MBR
сообщение Oct 10 2012, 14:37
Сообщение #14


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

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



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

Лишь мои домыслы, не более того. Ресет, если следовать армовской документации, это прерывание с наивысшим приоритетом. Если в процессе ресета процессор зависнет, скажем, на чтении инструкции из флеша, ресет не отработает. Именно это я и наблюдал.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 10 2012, 14:56
Сообщение #15


Гуру
******

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



Цитата(MBR @ Oct 10 2012, 18:37) *
Ресет, если следовать армовской документации, это прерывание с наивысшим приоритетом.

Это пишут в разделе Programmer's model. Прерыванием он является только с этой стороны.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 05:12
Рейтинг@Mail.ru


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