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

 
 
> USB в Atxmega128a3u
stalko
сообщение Sep 22 2012, 08:44
Сообщение #1


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

Группа: Свой
Сообщений: 139
Регистрация: 5-05-05
Из: Зеленоград
Пользователь №: 4 762



Доброго времени суток!
Есть ли у кого положительный (или хоть какой-то) опыт запуска USB в Atxmega128a3u? Все модули запустил, а USB никак не сдается. Винда говорит, мол, устройство-то есть, но не опознается. Грешил сначала на свой код, попробовал влить атмеловский пример (правда, нашелся только под Atxmega256a3bu, но он без вопросов собрался под мой кристалл), он также не работает. Кристалл ревизии G, если что.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
kovigor
сообщение Sep 22 2012, 11:42
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(stalko @ Sep 22 2012, 11:44) *
Доброго времени суток!Есть ли у кого положительный (или хоть какой-то) опыт запуска USB в Atxmega128a3u? Все модули запустил, а USB никак не сдается. Винда говорит, мол, устройство-то есть, но не опознается. Грешил сначала на свой код, попробовал влить атмеловский пример (правда, нашелся только под Atxmega256a3bu, но он без вопросов собрался под мой кристалл), он также не работает. Кристалл ревизии G, если что.

А в обоих чипах линии USB "D+" и "D-" приходят на одни и те же порты GPIO, например, на PA.1 и PA.2 ? И кварцы проверьте, они должны быть одинаковыми. Вообще, Атмеловский пример наверняка написан для Атмеловского DevKit'а. Так вот, сравните его схему со схемой вашего устройства ...
Go to the top of the page
 
+Quote Post
stalko
сообщение Sep 22 2012, 13:27
Сообщение #3


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

Группа: Свой
Сообщений: 139
Регистрация: 5-05-05
Из: Зеленоград
Пользователь №: 4 762



Цитата(kovigor @ Sep 22 2012, 14:42) *
А в обоих чипах линии USB "D+" и "D-" приходят на одни и те же порты GPIO, например, на PA.1 и PA.2 ?

Да, конечно... Да будет благославлен тот, кто придумал (наконец) стандартизовать GPIO (и не только) в XMega-х.
Цитата(kovigor @ Sep 22 2012, 14:42) *
И кварцы проверьте, они должны быть одинаковыми.

USB в XMega-х ходят от внутреннего RC-генератора 32МГц... раскачанного до 48МГц...
Цитата(kovigor @ Sep 22 2012, 14:42) *
Вообще, Атмеловский пример наверняка написан для Атмеловского DevKit'а. Так вот, сравните его схему со схемой вашего устройства ...

Была такая мысль, но:
  1. Единственный документ, найденный на скорую руку (AVR1923) схемы не содержит, только краткое описание, куда и что. Про USB ни слова, хотя он там есть, и примеры под USB есть.
  2. А что в USB можно сделать по-другому, собственно? laughing.gif

Go to the top of the page
 
+Quote Post
kovigor
сообщение Sep 22 2012, 16:49
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(stalko @ Sep 22 2012, 16:27) *
-USB в XMega-х ходят от внутреннего RC-генератора 32МГц... раскачанного до 48МГц...
-А что в USB можно сделать по-другому, собственно?

1. Так может, в этом и дело ? USB - периферия в МК очень чувствительна к тактовой частоте. Частота RC - генератора плывет с изменением температуры (см. даташит). Мало того, не знаю, как в этом МК, а в AVR генератор нужно калибровать.
2. Не смейтесь. USB - крайне сложная система, и сделать там что-нибудь не так ничего не стоит. Поверьте, это правда ...
Go to the top of the page
 
+Quote Post
stalko
сообщение Sep 22 2012, 18:34
Сообщение #5


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

Группа: Свой
Сообщений: 139
Регистрация: 5-05-05
Из: Зеленоград
Пользователь №: 4 762



Цитата(kovigor @ Sep 22 2012, 19:49) *
1. Так может, в этом и дело ? USB - периферия в МК очень чувствительна к тактовой частоте. Частота RC - генератора плывет с изменением температуры (см. даташит). Мало того, не знаю, как в этом МК, а в AVR генератор нужно калибровать.

Да, тут все очень сложно... Генератор RC-шник, но термостабилизированный. Хотя есть и огромная ложка дегтя: для иксмег сделали такую вещь, как DFLL, которая производит НЕПРЕРЫВНУЮ калибровку 32МГц-ового генератора. Собственно, с помощью этого калибратора генератор на 32МГц и превращается в генератор на 48МГц. Ах да... ложка дегтя... По сообщениям в буржуйских форумах... до ревижна H эти калибраторы просто не работают (по некоторым данным может работать только один из двух одновременно). Типа это написано в еррате. Я просмотрел все, но такой ерраты не нашел.
Потому я пошел другим путем: DFLL отключил (проверил, не работают), вручную подобрал цифирь, при которой генератор генерит 48МГц. Для знатоков икс-меги отвечаю сразу: да, есть в NVM предустановленное значение для записи, при котором якобы и будет 48МГц и которое якобы зашито на заводе в процессе специальной процедуры калибровки. На практике так: вычитал, записал, получил... 50МГц... Чем мне мой метод грозит: да, нет температурной стабильности, но прибор у меня для комнатных температур, и хоть бы ненадолго заработал, уже хорошо.
Цитата(kovigor @ Sep 22 2012, 19:49) *
2. Не смейтесь. USB - крайне сложная система, и сделать там что-нибудь не так ничего не стоит. Поверьте, это правда ...

Поверьте, мне не смешно. Просто там и перепутать нечего: с разъема напрямую на проц. Цепи короче некуда, тополог даже не заморачивался на волновом сопротивлении.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 22 2012, 20:25
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(stalko @ Sep 22 2012, 21:34) *
Хотя есть и огромная ложка дегтя: для иксмег сделали такую вещь, как DFLL, которая производит НЕПРЕРЫВНУЮ калибровку 32МГц-ового генератора. Собственно, с помощью этого калибратора генератор на 32МГц и превращается в генератор на 48МГц. Ах да... ложка дегтя... По сообщениям в буржуйских форумах... до ревижна H эти калибраторы просто не работают (по некоторым данным может работать только один из двух одновременно). Типа это написано в еррате. Я просмотрел все, но такой ерраты не нашел.

В ерате для A3U такого пункта не видно.
Подобный пункт был в A3, но не совсем такой - чтобы работала коррекция хотя бы одного RC от DFLL, должны быть включены DFLL для обеих RC генераторов.

P.S. Почему хотя бы на время не попробовать сделать источником тактирования кварц, а не RC.

P.S. 2. Может у вас часовой кварц не работает?

Go to the top of the page
 
+Quote Post
stalko
сообщение Sep 22 2012, 20:56
Сообщение #7


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

Группа: Свой
Сообщений: 139
Регистрация: 5-05-05
Из: Зеленоград
Пользователь №: 4 762



Цитата(_Артём_ @ Sep 22 2012, 23:25) *
В ерате для A3U такого пункта не видно.
Подобный пункт был в A3, но не совсем такой - чтобы работала коррекция хотя бы одного RC от DFLL, должны быть включены DFLL для обеих RC генераторов.

Ну, возможно, я не так прочитал по аглицки (А в ерратах я и сам не нашел). Но там речь была точно про A3U. Мож буржуин на форуме попутал тогда?
Но я начал именно с того, что включал для обоих. Признаков жизни они не показали. Даже им в оправдание мелькала мысль, что они просто МЕДЛЕННО подстраиваются, но это, простите, бред. Какой в них тогда смысл?
Цитата(_Артём_ @ Sep 22 2012, 23:25) *
P.S. Почему хотя бы на время не попробовать сделать источником тактирования кварц, а не RC.

Делал. Переводил на 12МГц кристалл и уменьшал делитель для USB (кстати, я правильно понимаю, что делитель нужно выставлять чтоб получить 3МГц? Хотя, я перебирал все, от греха.) Один раз загнал PLL системный клок до 48МГц, порадовался, что работает, хотя описано, что частота XMega до 32МГц. Но все это ничего не дало. Экспериментировал, правда, на своем коде, этот ASF для меня чужд до глубины своей.
Цитата(_Артём_ @ Sep 22 2012, 23:25) *
P.S. 2. Может у вас часовой кварц не работает?

А вот внешний часовик не использую, надеюсь на внутренний генератор (уже было подозрение, что зря). Хотя, даже если он врет, DFLL ставил бы неверную частоту, но работал бы!!
Кстати, выводил его на ногу, смотрел... Хороший генератор, вроде.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 22 2012, 21:54
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(stalko @ Sep 22 2012, 23:56) *
Но там речь была точно про A3U. Мож буржуин на форуме попутал тогда?

Возможно попутал, я в ерате на a3u такого пункта не нашёл.

Цитата(stalko @ Sep 22 2012, 23:56) *
Но я начал именно с того, что включал для обоих. Признаков жизни они не показали. Даже им в оправдание мелькала мысль, что они просто МЕДЛЕННО подстраиваются,

Нормально подстраивались.

Цитата(stalko @ Sep 22 2012, 23:56) *
кристалл и уменьшал делитель для USB (кстати, я правильно понимаю, что делитель нужно выставлять чтоб получить 3МГц? Хотя, я перебирал все, от греха.)

Возможно неправильная процедура настройки. Приведите код.


Go to the top of the page
 
+Quote Post
kovigor
сообщение Sep 23 2012, 03:50
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(stalko @ Sep 22 2012, 23:56) *
Один раз загнал PLL системный клок до 48МГц, порадовался, что работает, хотя описано, что частота XMega до 32МГц. Но все это ничего не дало.

Я в этой Меге не разбираюсь, но абсолютно во всех виденных мною МК с USB тактовая частота USB-движка (не обязательно самого МК !) должна была равняться 48 MHz (для FS) ...
Go to the top of the page
 
+Quote Post
stalko
сообщение Sep 23 2012, 09:20
Сообщение #10


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

Группа: Свой
Сообщений: 139
Регистрация: 5-05-05
Из: Зеленоград
Пользователь №: 4 762



Цитата(_Артём_ @ 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. Вот ведь уверен, что я опять не заметил какую-то мелочь. Это у меня судьба такая, чтоли... Серьезные проблемы решаю, муторно, но решаю. А вот как бьюсь неделями, потом выясняется, что была полная мелочь... crying.gif

Сообщение отредактировал IgorKossak - Sep 23 2012, 11:46
Причина редактирования: [codebox] для длинного кода!!!
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 23 2012, 13:12
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



С USB ни на мегах ни на хмегах не работал, но скоро собираюсь пробывать ATxmega384C3 (жду чипы).
А c компортом на 2Mb/c работаю постоянно, 16 метров туда сюда гоняю, глюков не наблюдаю.
Хмега128A работает от RC32M c включёнными обоими DFLL но только от внешнего 32.768Hz от внутр. пробывал НЕ РАБОТАЕТ.
Go to the top of the page
 
+Quote Post
stalko
сообщение Sep 23 2012, 13:59
Сообщение #12


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

Группа: Свой
Сообщений: 139
Регистрация: 5-05-05
Из: Зеленоград
Пользователь №: 4 762



Цитата(zombi @ Sep 23 2012, 16:12) *
Хмега128A работает от RC32M c включёнными обоими DFLL но только от внешнего 32.768Hz от внутр. пробывал НЕ РАБОТАЕТ.

Вот, блин!! wacko.gif
Придется дорабатывать платы...
Главное, что я даже сейчас не уверен, что USB не работает из-за DFLL.
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 23 2012, 14:36
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



А с питанием всё нормально?
См. 37.10.2 32.768kHz Internal Oscillator DS на XMEGA A3U
Go to the top of the page
 
+Quote Post
stalko
сообщение Sep 23 2012, 15:06
Сообщение #14


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

Группа: Свой
Сообщений: 139
Регистрация: 5-05-05
Из: Зеленоград
Пользователь №: 4 762



Цитата(zombi @ Sep 23 2012, 17:36) *
А с питанием всё нормально?
См. 37.10.2 32.768kHz Internal Oscillator DS на XMEGA A3U

Не, питание там шикарное... Первым делом смотрю при первом включении после "проверки на дымность" rolleyes.gif
P.S. Я так понимаю, что все же вы (и Вы лично тоже) склонны считать, что проблемы с USB зарыты в генераторах?
P.P.S. Очередная шальная мысль: а я DFLLRC32M.COMP1 с DFLLRC32M.COMP2 местами не попутал случаем? Надо проверить по даташиту
Go to the top of the page
 
+Quote Post
kovigor
сообщение Sep 23 2012, 15:17
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(zombi @ Sep 23 2012, 16:12) *
А c компортом на 2Mb/c работаю постоянно, 16 метров туда сюда гоняю, глюков не наблюдаю.

Это ни о чем не говорит, для USB допуск на точность установки тактового сигнала гораздо строже ...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 21:25
Рейтинг@Mail.ru


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