Цитата(_Артём_ @ Sep 23 2012, 00:54)

Возможно неправильная процедура настройки. Приведите код.
Да, хорошо бы Вы посмотрели, раз есть опыт. Я с икс-мегами столкнулся впервые, но, надеюсь, не последний (в принципе, архитектура интересная). Я убрал кучу лишних комментов и "экспериментальных" кусков кода.
Код
#define PLL_MULT (0x04)
CODE
void __attribute__ ((optimize("O3"))) SysClk_Init(void)
{
OSC.DFLLCTRL = 0x00;
DFLLRC32M.COMP1 = 0x1B; // 48МГц - 0xB71B = 48МГц/1.024кГц
DFLLRC32M.COMP2 = 0xB7; // 48МГц
#if (DFLL32EN==true)
DFLLRC32M.CTRL = DFLL_ENABLE_bm; // включить калибровку 32МГц
#else
DFLLRC32M.CTRL = 0x00; // вЫключить калибровку 32МГц
#endif
DFLLRC2M.COMP1 = 0xA1; // 2МГц - 0x07A1 = 2МГц/1.024кГц
DFLLRC2M.COMP2 = 0x07; // 2МГц
#if (DFLL2EN==true)
DFLLRC2M.CTRL = DFLL_ENABLE_bm; // включить калибровку 2МГц (по ерате только один можно)
#else
DFLLRC2M.CTRL = 0x00; // вЫключить калибровку 2МГц (по ерате только один можно)
#endif
// DFLLRC32M.CALA = 0x24; // Подобрал вручную, типа
// DFLLRC32M.CALB = 0x20;
DFLLRC32M.CALA = NVM_Read_Production_Signature(offsetof(NVM_PROD_SIGNATURES_t, USBRCOSCA));
DFLLRC32M.CALB = NVM_Read_Production_Signature(offsetof(NVM_PROD_SIGNATURES_t, USBRCOSC));
OSC.XOSCCTRL = OSC_FRQRANGE_2TO9_gc|
/*OSC_X32KLPM_bm|*/
OSC_XOSCPWR_bm|
OSC_XOSCSEL_XTAL_16KCLK_gc;
OSC.CTRL |= OSC_RC32KEN_bm;
while (!(OSC.STATUS & OSC_RC32KRDY_bm));
OSC.CTRL |= OSC_RC2MEN_bm;
while (!(OSC.STATUS & OSC_RC2MRDY_bm));
OSC.CTRL = OSC_XOSCEN_bm;
while (!(OSC.STATUS & OSC_XOSCRDY_bm));
OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc|
/*OSC_PLLDIV_bm|*/
PLL_MULT;
OSC.CTRL |= OSC_PLLEN_bm;
while (!(OSC.STATUS & OSC_PLLRDY_bm));
OSC.CTRL |= OSC_RC32MEN_bm;
while (!(OSC.STATUS & OSC_RC32MRDY_bm));
CCP = CCP_IOREG_gc;
CLK.CTRL = CLK_SCLKSEL_PLL_gc/; // Тактовая с PLL
// Configuration Change Protection
CCP = CCP_IOREG_gc;
CLK.PSCTRL = CLK_PSADIV_1_gc|
CLK_PSBCDIV_1_1_gc; // Без делителей
PR.PRGEN &= ~PR_RTC_bm;
CLK.RTCCTRL = CLK_RTCSRC_RCOSC32_gc| // 32к с внутреннего генератора
CLK_RTCEN_bm; // включаем
CLK.USBCTRL = CLK_USBSRC_RC32M_gc| // USB с внутреннего 32МГц генератора в режиме 48МГц
CLK_USBPSDIV_16_gc| // делитель на 16 (48МГц/16)
CLK_USBSEN_bm; // включаем
// Проверяем срыв частоты
// Configuration Change Protection
CCP = CCP_IOREG_gc;
OSC.XOSCFAIL = OSC_PLLFDEN_bm|OSC_XOSCFDEN_bm;
// Регистр LOCK защищен
// Configuration Change Protection
CCP = CCP_IOREG_gc;
// Защищаем тактовую
CLK.LOCK = CLK_LOCK_bm;
return;
}
P.S. Тут, пока выкусывал лишнее, мелькнула дурная мысль. Я ж, получается, DFLL на 2МГц включаю при работающем генераторе 2МГц. Мож надо запустить системный клок от кварца, предварительно включив DFLL32, отключить 2МГц, выставить DFLL2 и потом снова включить DFLL2?
P.P.S. Кстати, все забываю уточнить: мне и нужно-то USB Low-Speed всего-о навсего.
Цитата(kovigor @ Sep 23 2012, 06:50)

Я в этой Меге не разбираюсь, но абсолютно во всех виденных мною МК с USB тактовая частота USB-движка (не обязательно самого МК !) должна была равняться 48 MHz (для FS) ...
Логично. Я, вроде, и не спорил.
В XMege просто можно давать либо 48МГц, либо 12МГц.
Давать на USB можно либо с PLL с делителем, либо с RC32M с делителем.
Отказываясь от RC32M мне можно системную частоту выставить 12МГц и делить на 1, но жаба душит так жертвовать производительностью, но я попробовал.
Можно загнать системную до недокументированных 48МГц, что я и сделал, и, собственно, порадовался, что кристалл работает. Приятно же, хотя и не факт, что будет работать потом на каждом первом.
Реально, конечно, есть компромис: системную от кварца в 24МГц, а на USB делить на 2. Но это я оставил на крайний случай. Тем более, сдается мне, что дело не только в стабильности тактовой тут.
Иначе, почему не заработал пример от Xmega256A3U? Он изначально сделан под RC32M и должен легко переноситься. Если предположить, что там они с генератором все сделали правильно... То должно было заработать с полпинка!!
P.S. Вот ведь уверен, что я опять не заметил какую-то мелочь. Это у меня судьба такая, чтоли... Серьезные проблемы решаю, муторно, но решаю. А вот как бьюсь неделями, потом выясняется, что была полная мелочь...