внешний кристалл xmega не стабилизируется

Я использую ATxmega64A3U, подключил внешний кварц 4 МГц и два конденсатора нагрузки 18 пФ . Я использую модуль ASF для настройки часов, однако при запуске я вижу, что код зависает в следующем месте:

static inline void osc_wait_ready(uint8_t id)
{
    while (!osc_is_ready(id)) {
        /* Do nothing */
    }
}

В то время как ждет, пока источник синхронизации стабилизируется, но этого никогда не происходит. У кого-нибудь есть предложения, почему это может быть?

Добавление

Код, который я разместил выше, взят из ASF, чтобы убедиться, что я знаю, что я выполняю, я написал следующий код и мог видеть, что код застревает в цикле while, который ожидает стабилизации осциллятора.

OSC_CTRL |= OSC_XOSCEN_bm;
while(!(OSC_STATUS & OSC_XOSCRDY_bm));
CCP = CCP_IOREG_gc;
CLK_CTRL = (CLK_CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_XOSC_gc;
OSC_CTRL &= ~OSC_RC2MEN_bm;

Я включаю внешний генератор, жду его стабилизации, отключаю блокировку регистра, переключаюсь на внешний генератор, отключаю внутренний 2МГц генератор.

Как вы вызываете функцию? "Идентификатор" действителен?
@KevinWhite Код представляет собой форму ASF, все должно быть в порядке. Я добавил свой собственный код в исходный вопрос. Застревает на одном и том же месте.
Не то, чтобы это действительно имело значение, но не было ли какого-то внутреннего резервного режима RC-генератора на случай, если внешний кварц не запустится должным образом? Мне просто интересно, что он "просто висит". Но это было с тех пор, как я использовал это.
@ Rev1.0 хорошо, есть запасной вариант безопасности, однако вам нужно включить его в регистре XOSCFAIL. Я не.

Ответы (3)

Обратите внимание, что указанная в техническом описании емкость нагрузки 18 пФ не означает установку на плате двух конденсаторов по 18 пФ.

Это общая емкость, которую кристалл должен «видеть». Предполагая, что паразитная емкость 5 пФ, вы бы имели

Cl = (18 пФ * 18 пФ)/(36 пФ) + 5 пФ = 14 пФ

Вы можете попробовать что-то вроде 24 пФ для нагрузочных конденсаторов.

Кроме того, ESR кристалла вы выбираете довольно высоким. Это может стать проблемой, если схема генератора не может адекватно управлять кристаллом.

Кварц с более высокой частотой, как правило, имеет более низкое ESR, поэтому попробуйте кварц с частотой 8 или 16 МГц из этой серии.

Я действительно знаю, что вы добавили емкость от дорожек, однако небольшое отклонение должно повлиять на рабочую частоту. осциллятора не стабильность AFAIK. Однако вы сказали то, что я пропустил, тот факт, что более высокая частота. кристаллы имеют более низкое ESR, что может объяснить, почему плате трудно управлять этим! Я думаю, что могу разблокировать xmega, чтобы обеспечить больший ток в цепи, и, возможно, это может помочь здесь. Спасибо!

Поместите датчик области, изолированный долларовой купюрой (толщина 3 мила или 1/11 мм), напротив выходного узла генератора (самое большое, но искаженное напряжение). Это реализует осциллограф делителя напряжения с небольшим дополнительным C на конденсаторах XTAL + PI, поэтому любая амплитуда должна быть неизменной. Емкость через бумагу банкноты

С "=" Е 0 * Е р * А р е а / Д я с т а н с е
С "=" 9 * 10 12 * 2 ( с о т т о н п а п е р ) * ( 1 м м * 1 м м с с о п е т я п а р е а ) / 0,075 м м
С   2 * 10 11 * 0,013 "=" 0,26 п Ф

Если ваш пробник осциллографа в режиме 10X имеет емкость 13 пФ, у вас есть делитель 50:1.

Поставьте осциллограф на 20 мВ/дел, и ваша реальная чувствительность составит 1 вольт/дел. Только с нагрузкой 0,26 пФ на генератор.

Осмотрите два контакта XTAL. Найти здоровые сигналы 1vpp, 2vpp, 3vpp? на частоте 4000 МГц?

Ради интереса проверьте другие осцилляторы MCU на предмет амплитуды, греховности и искажений?

Баркгаузен дает нам 2 требования для успешной генерации:

(1) коэффициент усиления по напряжению > 1

(2) ТОЧНО ------- точно ------- фазовый сдвиг N*360 градусов.

Некоторые кварцевые генераторы достигают ТОЧНО N * 360 градусов с некоторым сопротивлением от контакта Vout до конденсатора PI_network. Попробуйте 100 Ом или 1000 Ом.

Так что проблема оказалась в софте! Оказалось, что также необходимо установить количество циклов, которое AVR ожидает, пока генератор не станет стабильным. Я не устанавливал это, что, очевидно, вызвало какие-то проблемы. Вот обновленный код, который ожидает 16 тысяч циклов, потому что мне не нужно быстрое пробуждение, а это около 4 мс.

OSC_XOSCCTRL = ((OSC_XOSCCTRL & ~OSC_FRQRANGE_gm) | OSC_FRQRANGE_2TO9_gc) |
               ((OSC_XOSCCTRL & ~OSC_XOSCSEL_gm) | OSC_XOSCSEL3_bm | OSC_XOSCSEL1_bm | OSC_XOSCSEL0_bm);
OSC_CTRL |= OSC_XOSCEN_bm;
while(!(OSC_STATUS & OSC_XOSCRDY_bm));
CCP = CCP_IOREG_gc;
CLK_CTRL = (CLK_CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_XOSC_gc;
OSC_CTRL &= ~OSC_RC2MEN_bm;
Если возможно, вы все равно должны использовать осциллограф для проверки времени запуска и формы волны. Если он стабилизируется только после, скажем, 15 тысяч циклов, «следующий» кристалл может работать неправильно из-за немного других характеристик.
@Rev1.0 Это правда. Для следующей сборки я буду использовать более высокую частоту. Xtal и разделить его вниз.