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

 
 
> LPC2387, PLLSTAT
addi
сообщение Feb 24 2011, 04:46
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422



Здравствуйте

Вопрос по поводу установки клоков, значения PLLCFG не отражаются в PLLSTAT, исполнение виснет на проверки соответствующего бита

Может кто скалкиваоя, прошу помочь
Код
void ConfigurePLL ( void )
{
  DWORD 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, 16MHz, 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 */
  while (!(PLLSTAT & 0x02000000));    /* Check lock bit status */  - здесь стоим.....
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Axel
сообщение Feb 26 2011, 08:26
Сообщение #2


Местный
***

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



Вообще-то
while ( ((PLLSTAT & (1 << 26)) == 0) );
и
while (!(PLLSTAT & 0x02000000));
не синонимы. Надо-бы:
while (!(PLLSTAT & 0x04000000));

У меня работает так:

CODE
m_val = 0x0B;
n_val = 0;
do
{
stat_value = PLLSTAT;
}
while (((stat_value & 0x00007FFF) != m_val) || (((stat_value & 0x00FF0000) >> 16) != n_val) || !(stat_value & (1 << 26)));

Go to the top of the page
 
+Quote Post
addi
сообщение Mar 20 2011, 11:33
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422



Цитата(Axel @ Feb 26 2011, 11:26) *
Вообще-то
while ( ((PLLSTAT & (1 << 26)) == 0) );
и
while (!(PLLSTAT & 0x02000000));
не синонимы. Надо-бы:
while (!(PLLSTAT & 0x04000000));

У меня работает так:

CODE
m_val = 0x0B;
n_val = 0;
do
{
stat_value = PLLSTAT;
}
while (((stat_value & 0x00007FFF) != m_val) || (((stat_value & 0x00FF0000) >> 16) != n_val) || !(stat_value & (1 << 26)));


никак не могу добится нужного бодрейта на ЮАРТе, делаю все как написано, получается погрешность почти в 20%

16Мгц резонатор, хочу чтобы было 72Мгц и 921600, реальна получается гдето 740000

Настройка колоков:

/* Fcck = 72Mhz */
#define PLL_MValue 8
#define PLL_NValue 0
#define CCLKDivValue 4

/* System configuration: Fosc, Fcclk, Fcco, Fpclk must be defined */
/* PLL input Crystal frequence range 4KHz~20MHz. */
#define Fosc 16000000
/* System frequence,should be less than 72MHz. */
#define Fcclk 72000000
#define Fcco 288000000

#define Fpclk (Fcclk / 1)

Код
void ConfigurePLL ( void )
{
  DWORD 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, 16MHz, 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 */
  while (!(PLLSTAT & 0x04000000));    /* 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 (!(PLLSTAT & 0x07000000));    /* Check lock bit status */
  return;
}

настройка ЮАРТа
Код
DWORD UARTInit( DWORD PortNum, DWORD baudrate )
{
  DWORD Fdiv;
//          PortNum = 0 ;
// if ( PortNum == 0 )
// {
    PINSEL0 = 0x00000050;       /* RxD0 and TxD0 */

    U0LCR = 0x83;        /* 8 bits, no Parity, 1 Stop bit */
    Fdiv = ( Fpclk / 16 ) / baudrate;    /*baud rate */
    //U0DLM = Fdiv / 256;                            
    //U0DLL = Fdiv % 256;
    // more accurate settings
    U0DLM = 0;
    U0DLL = 3;
    U0FDR = 0x000000E5;    /* DIVADDVAL = 5, MULVAL = 8 */
    U0LCR = 0x03;        /* DLAB = 0 */
    U0FCR = 0x07;        /* Enable and reset TX and RX FIFO. */
    /*
    if ( install_irq( UART0_INT, (void *)UART0Handler, HIGHEST_PRIORITY ) == FALSE )
    {
      return (FALSE);
    }
         */
    U0IER = IER_RBR | IER_THRE | IER_RLS;    /* Enable UART0 interrupt */
    return (TRUE);
/* }
  else if ( PortNum == 1 )
  {
#if EA_BOARD_LPC24XX
    PINSEL7 |= 0x0000000F;    // P3.16 TXD1, P3.17 RXD1
#else                        // Default is Keil MCB2300 board                             
    PINSEL0 |= 0x40000000;    // Enable TxD1 P0.15
    PINSEL1 |= 0x00000001;    // Enable RxD1 P0.16
#endif
    U1LCR = 0x83;        // 8 bits, no Parity, 1 Stop bit
    Fdiv = ( Fpclk / 16 ) / baudrate;    //baud rate
    U1DLM = Fdiv / 256;                            
    U1DLL = Fdiv % 256;
    U1LCR = 0x03;        // DLAB = 0
    U1FCR = 0x07;        // Enable and reset TX and RX FIFO.

    if ( install_irq( UART1_INT, (void *)UART1Handler, HIGHEST_PRIORITY ) == FALSE )
    {
      return (FALSE);
    }
  
    U1IER = IER_RBR | IER_THRE | IER_RLS;    // Enable UART0 interrupt
    return (TRUE);
  }     */
  //return( FALSE );
}

прощу помочь разобратся что не так, с NXP первый раз....

Сообщение отредактировал addi - Mar 20 2011, 11:36
Go to the top of the page
 
+Quote Post



Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 07:19
Рейтинг@Mail.ru


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