Перейти к содержанию
    

Сонфигурация PLL в LPC23xx

Здравствуйте! Работаю с ARM7 LPC2368. Пытаюсь сконфигурировать его на работу с внешним осцилятором и использовать PLL. В качестве источников тактирования пробовал подключать и кварцевые резанаторы, и генераторы на разные частоты, но все тщетно. PLL ни в какую не хочет работать с источниками внешнего тактирования подключенными к выводам XTAL.

Смог разве что подключить PLL к часовому кварцу на 32кГц подключенному к RTCX выводам.

Пробовал уже и проц перепаивать, но все то же самое.

Пробовал конфигурировать PLL через Wizard но проц зависает не дойдя до main-а. Пробовал конфигурировать непосредственно в Си коде:

//1.Disconnect the PLL with one feed sequence if PLL is already connected.
    PLLCON    &= ~0x02;                                        
    
    PLLFEED    = 0xAA;        //Write the feed sequence
    PLLFEED    = 0x55;    

    //2.Disable the PLL with one feed sequence.
    PLLCON    &= ~0x01;
                                
    PLLFEED    = 0xAA;        //Write the feed sequence
    PLLFEED    = 0x55;
                                        
    //3.Change the CPU Clock Divider setting to speed up operation without the PLL, if 
    //desired.    

    /*...*/

    //4.Write to the Clock Source Selection Control register to change the clock source.
    CLKSRCSEL = 0x01;     //Selects the main oscillator as the PLL clock source.
    SCS    &= ~0x00000010;    //The frequency range of the main oscillator is 1MHz to 20MHz.
    
    SCS    |=    0x00000020;    //The main oscillator is enabled
       
    while (OSCSTAT)     //Wait for it to settle
    { }

    //5.Write to the PLLCFG and make it effective with one feed sequence. The PLLCFG can
    //only be updated when the PLL is disabled.
            
    PLLCFG  = 0x00000006; //Set the PLL M and N constants

    PLLFEED    = 0xAA;          //Write the feed sequence
    PLLFEED    = 0x55;

    //6.Enable the PLL with one feed sequence.
    PLLCON |= 0x01;

    PLLFEED    = 0xAA;          //Write the feed sequence
    PLLFEED    = 0x55;


    //7.Change the CPU Clock Divider setting for the operation with the PLL. It's critical to do 
    //this before connecting the PLL.
    CCLKCFG            = 0x00000003; 


    
    //8.Wait for the PLL to achieve lock by monitoring the PLOCK bit in the PLLSTAT register

    while (!(PLLSTAT & 0x04000000))         //Wait for it to settle
    { }

    //9.Connect the PLL with one feed sequence.
    PLLCON |= 0x02;                            
    PLLFEED    = 0xAA;          //Write the feed sequence
    PLLFEED    = 0x55;

Старался все делать по шагам User Manual-а но проц виснет где-то в этом коде. То ли при подключении в качестве источника тактирования Main Oscilator-а, то ли при подключении PLL... Дело в том что в отладке я не могу отднозначно этого определить так как отладчик отваливается в разных местах.

Пробовал запускать данный код без подключенного отладчика, но процессор снова зависал да так что оживлялся только пересбросом питания, даже на внешний RESET не реагировал.

Пользуюсь отладчиком J-Link (JTAG Speed - Adaptive Clocking).

Подскажите где мне искать ошибку?

Либо возможно у кого-то есть точно рабочий код инициализации PLL для LPC23xx?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот код из примеров IAR 5.50:

 

/*************************************************************************
* Function Name: InitClock
* Parameters: void
* Return: void
*
* Description: Initialize PLL and clocks' dividers. Hclk - 288MHz,
* Usbclk - 48MHz
*
*************************************************************************/
void InitClock(void)
{
 // 1. Init OSC
 SCS_bit.OSCRANGE = 0;
 SCS_bit.OSCEN = 1;
 // 2.  Wait for OSC ready
 while(!SCS_bit.OSCSTAT);
 // 3. Disconnect PLL
 PLLCON_bit.PLLC = 0;
 PLLFEED = 0xAA;
 PLLFEED = 0x55;
 // 4. Disable PLL
 PLLCON_bit.PLLE = 0;
 PLLFEED = 0xAA;
 PLLFEED = 0x55;
 // 5. Select source clock for PLL
 CLKSRCSEL_bit.CLKSRC = 1; // Selects the main oscillator as a PLL clock source.
 // 6. Set PLL settings 288 MHz
 PLLCFG_bit.MSEL = 24-1;
 PLLCFG_bit.NSEL = 2-1;
 PLLFEED = 0xAA;
 PLLFEED = 0x55;
 // 7. Enable PLL
 PLLCON_bit.PLLE = 1;
 PLLFEED = 0xAA;
 PLLFEED = 0x55;
 // 8. Wait for the PLL to achieve lock
 while(!PLLSTAT_bit.PLOCK);
 // 9. Set clk divider settings
 CCLKCFG   = 4-1;            // 1/6 Fpll - 72 MHz
 USBCLKCFG = 6-1;            // 1/6 Fpll - 48 MHz
 PCLKSEL0 = PCLKSEL1 = 0;    // other peripherals
 // 10. Connect the PLL
 PLLCON_bit.PLLC = 1;
 PLLFEED = 0xAA;
 PLLFEED = 0x55;
}

 

 

Но меня он то-же не всегда спасает. В основном все работает, но если выключить питание на короткое время, то может просто не запуститься и ресет не спасает, приходится ждать сек 30 - потом запускается нормально. Пробовал этот, но результат тот-же.

 


if ( PLLSTAT & (1 << 25) )	// PLLC
{
PLLCON = 1;     /* Enable PLL (PLLE=1), disconnected */
PLLFEED = 0xAA;
PLLFEED = 0x55;
}

PLLCON = 0;       /* Disable PLL (PLLE=0, PLLC=0), disconnected */
PLLFEED = 0xAA;
PLLFEED = 0x55;

SCS |= 0x20;      /* Enable main OSC (OSCEN) */
while( !(SCS & 0x40) ); /* Wait until main OSC is usable (OSCSTAT) */

CLKSRCSEL = 0x1;    /* select main OSC, 12MHz, as the PLL clock source */

PLLCFG_bit.MSEL = PLL_MValue;
PLLCFG_bit.NSEL = PLL_NValue;
PLLFEED = 0xAA;
PLLFEED = 0x55;

PLLCON = 1;       /* Enable PLL (PLLE=1), disconnected */
PLLFEED = 0xAA;
PLLFEED = 0x55;

CCLKCFG   = 4-1;            // 1/4 Fpll - 72 MHz
USBCLKCFG = 6-1;            // 1/6 Fpll - 48 MHz
PCLKSEL0 = PCLKSEL1 = 0;    // other peripherals

while ( ((PLLSTAT & (1 << 26)) == 0) ); /* Check lock bit status (PLOCK==0)*/
while ( (PLLSTAT_bit.MSEL != PLL_MValue) && ( PLLSTAT_bit.NSEL != PLL_NValue) );

PLLCON = 3;       /* enable and connect  (PLLE=1, PLLC=1)*/
PLLFEED = 0xAA;
PLLFEED = 0x55;
while ( ((PLLSTAT & (1 << 25)) == 0) ); /* Check connect bit status */


 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но меня он то-же не всегда спасает. В основном все работает, но если выключить питание на короткое время, то может просто не запуститься и ресет не спасает, приходится ждать сек 30 - потом запускается нормально. Пробовал этот, но результат тот-же.

За код спасибо, но чего-то я начинаю подозревать что не в коде у меня дело так как с теме же настройками но часовому кварцу я подключаюсь нормально. Вот только не пойму где искать. Да и в кварцах вроде ломаться нечему...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу поиграться с кондерами согласно этих табличек, но руки пока не доходят.

 

post-31376-1304357650_thumb.jpg

Ну не думаю что это эффект даст. У меня там сейчас кварц стоит на 12МГц и два кондера на 22 пика. Но до этого я пробовал ставить разные генераторы которым, как известно, кондеры и не нужны вовсе, но эффекта это тоже не дало.

Вы кстати тоже лучше попробуйте вместо кварца генератор поставить. В прошлых разработках у нас тоже были проблемы со стабильностью работы от кварца, генератор хоть и стоит дороже, но работает намного устойчивее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем сегодня после бокала темного пива понял я в чем причина такого поведения моего процессора.

В коде у меня все нормально, проблема была в кварце, а вернее в дорожках между кварцем и процессором. Дело в том что я использовал переходную плату для данного стоногово зверя. А так как кварц у меня запаян не на ноги процессора а на ноги платы то там получается расстояние около сантиметра, чего было достаточно для создания длинной линии при кварце 12МГц. А ввиду низкой частоты, уменьшающей эффект длинной линии, пусть не всегда стабильно но работал часовой кварц в качестве источника тактирования. Но опять же при больших значениях множителя умножалась и ошибка вызванная помехой, из-за чего собственно при увеличении множителя данный кварц "отваливался". В общем буду думать как передвинуть кварц ближе к ногам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...