Цитата(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