|
|
  |
LPC2366, при записи в CCLKCFG все ломается. |
|
|
|
Apr 15 2008, 10:49
|

Местный
  
Группа: Участник
Сообщений: 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; }
|
|
|
|
|
Apr 15 2008, 10:57
|
Знающий
   
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Apr 15 2008, 10:59
|

Местный
  
Группа: Участник
Сообщений: 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.
|
|
|
|
|
Apr 15 2008, 11:17
|

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

|
Цитата(meister @ Apr 15 2008, 13:59)  Я читаю мануал. Читайте еще  Вот так - работает: Цитата PLLCFG = PLL_MValue | (PLL_NValue << 16); PLLFEED = 0xaa; PLLFEED = 0x55; PLLCON = 1; /* Enable PLL, disconnected */ PLLFEED = 0xaa; PLLFEED = 0x55;
|
|
|
|
|
Apr 15 2008, 11:23
|

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

|
Цитата(HARMHARM @ Apr 15 2008, 15:17)  Читайте еще Вот так - работает: Запускается у меня 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; }
|
|
|
|
|
Apr 15 2008, 11:46
|
Знающий
   
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Apr 15 2008, 14:15
|
Местный
  
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Apr 15 2008, 14:44
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 15 2008, 15:09
|

читатель даташитов
   
Группа: Свой
Сообщений: 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, то есть ревизия "-".
|
|
|
|
|
May 28 2008, 10:36
|

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

|
Цитата(meister @ Apr 15 2008, 18:44)  Это для самых первых ревизий. Сейчас от 275 до 550. Вот такой у меня: Код LPC2366FBD100 SH3959.1 01 ZSD0743BY Вопрос - так для ревизии В действительно работает от 275 до 550? Мне нужно около 300 Мгц. У кого нибудь работает? Отзовитесь!
|
|
|
|
|
May 28 2008, 15:14
|

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

|
Цитата(meister @ May 28 2008, 16:52)  500 - работает. Точно работает! Спаял платку и проверил у себя при FPLL=314 МГц - за пару часов работы сбоев не заметил. А в errata 1.4 ограничение оставили... Наверное будут выпускать следующую - или это останется на риск разработчиков?
|
|
|
|
|
May 28 2008, 16:16
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 28 2008, 17:11
|

Частый гость
 
Группа: Свой
Сообщений: 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: - Да, плохо читал, нужно было посмотреть краткое описание с начала ерраты. Сорри!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|