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

 
 
> 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
Ответов
yashok
сообщение Mar 22 2011, 06:08
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203



Для какого именна NXP это код??

Код
U0FDR = 0x000000E5;    /* DIVADDVAL = 5, MULVAL = 8 */

Предпологаю, что в строке ошибочный коомент. MULVAL = 14, поэтому подсчеты ошибочны.

Код
U1DLL = Fdiv % 256;

Попробуйте просто
Код
U1DLL = Fdiv


Еще бы не плохо было бы явно настраивать рабочую частоту для модулей UART. Что бы точно было 72 MHz.
Go to the top of the page
 
+Quote Post
addi
сообщение Mar 22 2011, 08:52
Сообщение #3


Знающий
****

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



Цитата(yashok @ Mar 22 2011, 09:08) *
Для какого именна NXP это код??

Код
U0FDR = 0x000000E5;    /* DIVADDVAL = 5, MULVAL = 8 */

Предпологаю, что в строке ошибочный коомент. MULVAL = 14, поэтому подсчеты ошибочны.

Код
U1DLL = Fdiv % 256;

Попробуйте просто
Код
U1DLL = Fdiv


Еще бы не плохо было бы явно настраивать рабочую частоту для модулей UART. Что бы точно было 72 MHz.

Спасибо за поддержку

Запутался в версиях кода, как следствие U0FDR был указан для 60 МГц
Изначально
Резонатор на 16 МГц
Необходимо сделать 72МГц частоту тактирования ядра и периферии

Получается

M = 72
N = 8
ClkDiv = 4
для
Fcco = 288 МГц
Необходимый бодрейт - 921600 б/с

Тогда DIVADDVAL = 5, MULVAL = 8

В итоге получается в районе 740000 б/с при передачи и соотвественно прием на 921600 б/с передатчика заершается с ошибками фрейма

Почитал эррату, там говорится что желательно 72 МГц добиватся при 12 МГц на входе и Fcco = 288 МГц

В итоге настроил какбы на 12 Мгц(при оставшемся кварце 16 Мгц) - M = 12, N = 1, получается теперь почти как нада, дительность бита как на картинке 1

Но прием попрежнему с ошибками, длительность бита передатчика на рис 2

Микроконтролер LPC2387

Сообщение отредактировал addi - Mar 22 2011, 12:17
Прикрепленные файлы
Прикрепленный файл  1.bmp ( 146.3 килобайт ) Кол-во скачиваний: 6
Прикрепленный файл  2.bmp ( 146.3 килобайт ) Кол-во скачиваний: 4
 
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Mar 22 2011, 09:36
Сообщение #4


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(addi @ Mar 22 2011, 12:52) *
Резонатор на 16 МГц
Необходимо сделать 72МГц частоту тактирования ядра и периферии

Микроконтролер LPC2387


Для достижения Fcclk=72MHz при Fosc=16MHz параметры PLL должны быть такие:
(при условии что используется USB)
Код
#define PLL_MValue      17 //(16MHz*18 = 288MHz)
#define PLL_NValue      0
#define CCLKDivValue    3 // 288/4=72MHz
#define USBCLKDivValue    5


Процедура инициализации PLL взята из примера и 1 в 1 как Ваша только без исправлений
CODE
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 */
return;
}


Процедура инициализации USART1, тоже взята из примера, работает в широком диапазоне baudrate

Код
//-------------------------------------------
//константа определена в target.h
#define Fcclk = 72000000
//-------------------------------------------

//-------------------------------------------
//параметры uart
#define CHL_5 (0ul<<0) //длина символа
#define CHL_6 (1ul<<0)
#define CHL_7 (2ul<<0)
#define CHL_8 (3ul<<0)

#define STOP_1 (0ul<<2) //кол-во стоповых бит
#define STOP_2 (1ul<<2)

#define PAR_OFF (0ul<<3) //контроль чётности
#define PAR_ON  (1ul<<3)

#define DLC_ENA (1ul<<7) //разрешение доступа к Divisor Latch
//-------------------------------------------

void UART1_init( unsigned int baudrate )
{
  //разрешаем переферийное питание uart3
  PCONP |= (1ul<<4);
    
  //определяем делитель тактовой частоты uart3
  PCLKSEL0 |= (2ul<<8);  //делитель на 2

  //выбираем альтернативные ф-ии выводов
  PINSEL4 |= (2ul<<0)|(2ul<<2);       /* RxD1 and TxD1 */
  
  unsigned int Fdiv;
  U1LCR = DLC_ENA|STOP_1|CHL_8;   /* 8 bits, no Parity, 1 Stop bit */
  
  Fdiv = ( (Fcclk/2) / 16) / baudrate;  /*baud rate */
  U1DLM = Fdiv / 256;
  U1DLL = Fdiv % 256;
  U1LCR = STOP_1|CHL_8;   /* 8 bits, no Parity, 1 Stop bit */
  U1FCR = FIFO_LEV_0|RES_TX_FIFO|RES_RX_FIFO|FIFO_ENA;   /* Enable and reset TX and RX FIFO. */

  //инсталлируем обработчик прерываний
  install_irq( UART1_INT, (void *)UART1_Handler, HIGHEST_PRIORITY );

  U1IER = IER_RBR | IER_RLS; /* Enable UART0 interrupt */
}


По-поводу Fcclk процессора - разве в lpc23xx она не ограничена 60MHz?
Сам работаю с lpc2368 - читал доки там вроде такое ограничение.
Вот lpc24xx точно могут работать на 72MHz.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:57
Рейтинг@Mail.ru


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