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

 
 
> LPC2366, при записи в CCLKCFG все ломается.
meister
сообщение Apr 15 2008, 10:49
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Никак не пойму, что я делаю не так: при записи 199 (и при записи 1 тоже) в CCLKCFG все ломается. Кварц у меня 3.686МГц.

На МК написано следующее:
Код
LPC2366FBD100
SH3959.1          01
ZSD0743BY


Код
    void init_system_controls_and_status_register(void)
    {
        PCONP = 0;

        // 6.14 PLL setup sequence
        PLLCON_bit.PLLC = 0;
        PLLFEED = hw::PLLFEED_DATA1;
        PLLFEED = hw::PLLFEED_DATA2;
        
        PLLCON_bit.PLLE = 0;
        PLLFEED = hw::PLLFEED_DATA1;
        PLLFEED = hw::PLLFEED_DATA2;

        SCS = BIT_(hw::SCS_GPIOM) | BIT_(hw::SCS_OSCEN);
        while (!SCS_bit.OSCSTAT) {}
        
        CLKSRCSEL = hw::CS_MAIN_OSCILLATOR;
        
        PLLCFG_bit.MSEL = PLL_REGISTER_M - 1;
        PLLCFG_bit.NSEL = PLL_REGISTER_N - 1;
        PLLCON_bit.PLLE = 1;
        PLLFEED = hw::PLLFEED_DATA1;
        PLLFEED = hw::PLLFEED_DATA2;
        
        while (!PLLSTAT_bit.PLOCK) {}
        
        CCLKCFG = 0;        
        CCLKCFG = 199; // до этой строчки стабильно доходит, а через нее - нет

        PLLCON_bit.PLLC = 1;
        PLLFEED = hw::PLLFEED_DATA1;
        PLLFEED = hw::PLLFEED_DATA2;
    }
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 14)
amw
сообщение Apr 15 2008, 10:57
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(meister @ Apr 15 2008, 13:49) *
Никак не пойму, что я делаю не так: при записи 199 (и при записи 1 тоже) в CCLKCFG все ломается. Кварц у меня 3.686МГц.

На МК написано следующее:
Код
LPC2366FBD100
SH3959.1          01
ZSD0743BY


Код
    void init_system_controls_and_status_register(void)
    {
..............
        PLLCFG_bit.MSEL = PLL_REGISTER_M - 1;
        PLLCFG_bit.NSEL = PLL_REGISTER_N - 1;
        PLLCON_bit.PLLE = 1;
        PLLFEED = hw::PLLFEED_DATA1;
        PLLFEED = hw::PLLFEED_DATA2;
..............
    }

Почемуто в в мануале написано (а кто его читает?) что это нужно делать одной командой а не тремя.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
meister
сообщение Apr 15 2008, 10:59
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(amw @ Apr 15 2008, 14:57) *
Почемуто в в мануале написано (а кто его читает?) что это нужно делать одной командой а не тремя.


Я читаю мануал.

It's very important not to merge any steps above. For example, don't update the PLLCFG and enable the PLL simultaneously with the same feed sequence.
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Apr 15 2008, 11:17
Сообщение #4


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(meister @ Apr 15 2008, 13:59) *
Я читаю мануал.


Читайте еще smile.gif
Вот так - работает:
Цитата
PLLCFG = PLL_MValue | (PLL_NValue << 16);
PLLFEED = 0xaa;
PLLFEED = 0x55;

PLLCON = 1; /* Enable PLL, disconnected */
PLLFEED = 0xaa;
PLLFEED = 0x55;
Go to the top of the page
 
+Quote Post
meister
сообщение Apr 15 2008, 11:23
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(HARMHARM @ Apr 15 2008, 15:17) *
Читайте еще smile.gif
Вот так - работает:


Запускается у меня PLL, раз он проходит цикл

Код
while (!PLLSTAT_bit.PLOCK) {}


у меня делитель частоты CCLK не ставится.

Код
    void init_system_controls_and_status_register(void)
    {
        PCONP = 0;

        PLLCON_bit.PLLC = 0;
        PLLFEED = hw::PLLFEED_DATA1;
        PLLFEED = hw::PLLFEED_DATA2;
        
        PLLCON_bit.PLLE = 0;
        PLLFEED = hw::PLLFEED_DATA1;
        PLLFEED = hw::PLLFEED_DATA2;

        SCS = BIT_(hw::SCS_GPIOM) | BIT_(hw::SCS_OSCEN);
        while (!SCS_bit.OSCSTAT) {} // æäàòü ïîêà çàïóñêàåòñÿ
        
        CLKSRCSEL = hw::CS_MAIN_OSCILLATOR; // âûáðàòü â êà÷åñòâå èñòî÷íèêà ÷àñòîòû êâàðö
        
        PLLCFG_bit.MSEL = PLL_REGISTER_M - 1;
        PLLCFG_bit.NSEL = PLL_REGISTER_N - 1;
        PLLFEED = hw::PLLFEED_DATA1;
        PLLFEED = hw::PLLFEED_DATA2;

        PLLCON_bit.PLLE = 1;
        PLLFEED = hw::PLLFEED_DATA1;
        PLLFEED = hw::PLLFEED_DATA2;
        
        while (!PLLSTAT_bit.PLOCK) {}

        // вот тут PLL работает (раз управление сюда доходит).
        // осталось подключить его через адекватный делитель к процессору.
        
        CCLKCFG = 0; // без делителя работает
        CCLKCFG = 199; // делитель 200 все ломает

        PLLCON_bit.PLLC = 1;
        PLLFEED = hw::PLLFEED_DATA1;
        PLLFEED = hw::PLLFEED_DATA2;
    }
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Apr 15 2008, 11:26
Сообщение #6


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Попробуйте установить его пораньше:
Код
    PLLCFG = PLL_MValue | (PLL_NValue << 16);
    PLLFEED = 0xaa;
    PLLFEED = 0x55;
      
    PLLCON = 1;                /* Enable PLL, disconnected */
    PLLFEED = 0xaa;
    PLLFEED = 0x55;

    CCLKCFG = CCLKDivValue;             /* Set clock divider */

    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;
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 15 2008, 11:46
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Вот так у меня работает. Правда кварц другой.
Код
void pll_init()
{
    PCONP |= USB_CLK_ON;
    /* 1. Disconnect the PLL with one feed sequence if PLL is already connected. */
    if ( PLLSTAT & (1 << 25) ) {
        PLLCON = 1;
        PLLFEED = 0xAA;
        PLLFEED = 0x55;
    }
    /* 2. Disable the PLL with one feed sequence. */
    PLLCON = 0;
    PLLFEED = 0xAA;
    PLLFEED = 0x55;
    /* 3. Change the CPU Clock Divider setting to speed up operation without the PLL, if desired. */
    CCLKCFG = 0;
    /* 4. Write to the Clock Source Selection Control register to change the clock source. */
    SCS |= 0x20;            /* Enable main OSC */
    while( !(SCS & 0x40) );        /* Wait until main OSC is usable */
    CLKSRCSEL = 1;
    /* 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 = (PLL_NVAL << 16) | PLL_MVAL;
    PLLFEED = 0xAA;
    PLLFEED = 0x55;
    /* 6. Enable the PLL with one feed sequence. */
    PLLCON = 1;
    PLLFEED = 0xAA;
    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 = CCLK_VAL;
    USBCLKCFG = USBCLK_VAL;
    /* 8. Wait for the PLL to achieve lock by monitoring the PLOCK bit in the PLLSTAT register,
    or using the PLOCK interrupt, or wait for a fixed time when the input clock to PLL is
    slow (i.e. 32 kHz). The value of PLOCK may not be stable when the PLL reference
    frequency (FREF, the frequency of REFCLK, which is equal to the PLL input
    frequency divided by the pre-divider value) is less than 100 kHz or greater than
    20 MHz. In these cases, the PLL may be assumed to be stable after a start-up time
    has passed. This time is 500 µs when FREF is greater than 400 kHz and 200 / FREF
    seconds when FREF is less than 400 kHz. */
    while (!(PLLSTAT & (1 << 26))){;}
    /* 9. Connect the PLL with one feed sequence. */
    PLLCON = 3;
    PLLFEED = 0xAA;
    PLLFEED = 0x55;
    while ( !((PLLSTAT & (1 << 25))) );    /* Check connect bit status */

    /* Set peripheral clock */
    PCLKSEL0 = PCLK0_WDT(PCLK_1) |
            PCLK0_TIMER0(PCLK_1) |
            PCLK0_TIMER1(PCLK_1) |
            PCLK0_UART0(PCLK_1) |
            PCLK0_UART1(PCLK_1) |
            PCLK0_PWM1(PCLK_1) |
            PCLK0_I2C0(PCLK_1) |
            PCLK0_SPI(PCLK_1) |
            PCLK0_RTC(PCLK_4) |
            PCLK0_SSP1(PCLK_1) |
            PCLK0_DAC(PCLK_1) |
            PCLK0_ADC(PCLK_1) |
            PCLK0_CAN1(PCLK_1) |
            PCLK0_CAN2(PCLK_1) |
            PCLK0_ACF(PCLK_1);

    PCLKSEL1 = PCLK1_BAT_RAM(PCLK_1) |
            PCLK1_GPIO(PCLK_1) |
            PCLK1_PCB(PCLK_1) |
            PCLK1_I2C1(PCLK_1) |
            PCLK1_SSP0(PCLK_1) |
            PCLK1_TIMER2(PCLK_1) |
            PCLK1_TIMER3(PCLK_1) |
            PCLK1_UART2(PCLK_1) |
            PCLK1_UART3(PCLK_1) |
            PCLK1_I2C2(PCLK_1) |
            PCLK1_I2S(PCLK_1) |
            PCLK1_MCI(PCLK_1) |
            PCLK1_SYSCON(PCLK_1);
}


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
Axel
сообщение Apr 15 2008, 14:15
Сообщение #8


Местный
***

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



Может этот вариант поможет (в свое время родился после некоторых мучений):

Код
void PLLInit(u32 state)
{
    u32 stat_value;

    rSCS |= 0x20;      
    rSCS &= ~0x10;      
    while(!(rSCS & 0x40));

    if (rPLLSTAT & (1 << 25))
    {
        rPLLCON = 1;    
        rPLLFEED = 0xaa;
        rPLLFEED = 0x55;
    }

    rPLLCON = 0;      
    rPLLFEED = 0xaa;
    rPLLFEED = 0x55;
    CLKSRCSEL = 0x1;  

    if(state)
    {
        rPLLCFG = 11;
        rPLLFEED = 0xaa;
        rPLLFEED = 0x55;
        rPLLCON = 1;      
        rPLLFEED = 0xaa;
        rPLLFEED = 0x55;
    
        do
        {
            stat_value = rPLLSTAT;
        }
        while (((stat_value & 0x00007FFF) != 11) || ((stat_value & 0x00FF0000) >> 16) || !(stat_value & (1 << 26)));

        CCLKCFG = 3;
        USBCLKCFG = 0x05;
        rPLLCON = 3;       // enable and connect
        rPLLFEED = 0xaa;
        rPLLFEED = 0x55;
        while (!(rPLLSTAT & (1 << 25))); // Check connect bit status
        g_SysFreq = 72000;
    }
    else
    {
        CCLKCFG = 0;
        g_SysFreq = 12000;
    }
}


И, на всякий случай, проверьте, что значение PLLCFG соответствует требованиям к выходной частоте PLL: 275MHz <= Fout <= 290 MHz.
Go to the top of the page
 
+Quote Post
meister
сообщение Apr 15 2008, 14:44
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(Axel @ Apr 15 2008, 18:15) *
И, на всякий случай, проверьте, что значение PLLCFG соответствует требованиям к выходной частоте PLL: 275MHz <= Fout <= 290 MHz.


Это для самых первых ревизий. Сейчас от 275 до 550.

У меня проблема была в том, что когда я ставил делитель частота падала слишком сильно и от этого все ломалось (а как тогда быть с 32768 кварцем?). Я перепаял кварц на бОльшую частоту и сдел вот так:

Код
        CCLKCFG = CCLK_DIVIZOR_MAGIC; // 7

        PLLCON_bit.PLLC = 1; // connect
        PLLFEED = hw::PLLFEED_DATA1;
        PLLFEED = hw::PLLFEED_DATA2;
        
        CCLKCFG = CCLK_DIVIZOR; // 19


Все работает. Частота похожа на правду. На днях еще больший кварц запаяю, может обойдусь за одну запись в CCLKCFG.

Как узнать ревизию моего МК? Кроме PLL там упоминаются еще MAM и WDT...

Вот такой у меня:
Код
LPC2366FBD100
SH3959.1        01
ZSD0743BY
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Apr 15 2008, 15:09
Сообщение #10


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(meister @ Apr 15 2008, 17:44) *
Как узнать ревизию моего МК? Кроме PLL там упоминаются еще MAM и WDT...
Вот такой у меня:
Код
LPC2366FBD100
SH3959.1        01
ZSD0743BY


Цитата
The last/second to last letter in the third line (field ‘R’) will identify the device revision.

Так что у вас ревизия B. На моих написано -Y, то есть ревизия "-".
Go to the top of the page
 
+Quote Post
lebiga
сообщение May 28 2008, 10:36
Сообщение #11


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

Группа: Свой
Сообщений: 163
Регистрация: 22-06-06
Из: Киев
Пользователь №: 18 292



Цитата(meister @ Apr 15 2008, 18:44) *
Это для самых первых ревизий. Сейчас от 275 до 550.

Вот такой у меня:
Код
LPC2366FBD100
SH3959.1        01
ZSD0743BY


Вопрос - так для ревизии В действительно работает от 275 до 550?
Мне нужно около 300 Мгц.
У кого нибудь работает? Отзовитесь!
Go to the top of the page
 
+Quote Post
meister
сообщение May 28 2008, 12:52
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(lebiga @ May 28 2008, 14:36) *
Вопрос - так для ревизии В действительно работает от 275 до 550?
Мне нужно около 300 Мгц.
У кого нибудь работает? Отзовитесь!


500 - работает.
Go to the top of the page
 
+Quote Post
lebiga
сообщение May 28 2008, 15:14
Сообщение #13


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

Группа: Свой
Сообщений: 163
Регистрация: 22-06-06
Из: Киев
Пользователь №: 18 292



Цитата(meister @ May 28 2008, 16:52) *
500 - работает.

Точно работает! Спаял платку и проверил у себя при FPLL=314 МГц - за пару часов работы сбоев не заметил.
А в errata 1.4 ограничение оставили... Наверное будут выпускать следующую - или это останется на риск разработчиков?
Go to the top of the page
 
+Quote Post
meister
сообщение May 28 2008, 16:16
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(lebiga @ May 28 2008, 19:14) *
А в errata 1.4 ограничение оставили...


Это у Вас какая-то специальная эррата, в той, что у меня - вот так:

Functional Problem: PLL.1
Short Description: PLL output is limited to 290 MHz
Errata occurs in device revision: -

Сообщение отредактировал meister - May 28 2008, 16:16
Go to the top of the page
 
+Quote Post
lebiga
сообщение May 28 2008, 17:11
Сообщение #15


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

Группа: Свой
Сообщений: 163
Регистрация: 22-06-06
Из: Киев
Пользователь №: 18 292



Цитата(meister @ May 28 2008, 20:16) *
Это у Вас какая-то специальная эррата, в той, что у меня - вот так:

Functional Problem: PLL.1
Short Description: PLL output is limited to 290 MHz
Errata occurs in device revision: -

Да, плохо читал, нужно было посмотреть краткое описание с начала ерраты. Сорри!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th June 2025 - 22:00
Рейтинг@Mail.ru


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