Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USB не определяется компьютером
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
_4afc_
Пытаюсь запустить пример mass storage на собственной плате с ATSAMS70N20 BGA100.
Микроконтроллер поддерживает USB HS/FS.
Внешний резонатор 12МГц, частота от USBpll. Ядро 300МГц. Питание 3.3В.

При подключении к компьютеру приходит suspend, resume, suspend и отлуп от Windows.
Видно, что приходит сброс управляющего канала и SOFы.
Со стороны контроллера это выглядит так:

CODE

udd_attach
- Full speed
- udd_ctrl_interrupt - нет прерывания
suspend

- Full speed
- udd_ctrl_interrupt - нет прерывания
resume

- High speed
- udd_ctrl_interrupt - нет прерывания
- reset ctrl ep0
пропуск нескольких SOF

- High speed
- udd_ctrl_interrupt - нет прерывания
- reset ctrl ep0
пропуск нескольких SOF

- High speed
- udd_ctrl_interrupt - нет прерывания
- reset ctrl ep0
пропуск нескольких SOF

- High speed
- udd_ctrl_interrupt - нет прерывания
- reset ctrl ep0
пропуск нескольких SOF

- Full speed
- udd_ctrl_interrupt - нет прерывания
suspend

Насколько я понимаю, поскольку ниразу небыло прерывания ep0, то контроллер не сообщил компьютеру ни VID, ни PID, ни BULK.

Т.е. надо искать ошибку не в описаниях mass storage и BULK, а в обработчике прерываний USB?
В режиме Full speed - всё также, только вместо High speed - Full speed

Причём на SAMS4 - всё работало, но у SAMS70 - другой драйвер из-за HS.

Подскажите в каком направлении копать.
_4afc_
Посмотрел Wiresharkом - M4 сразу отвечает дескриптором.
M7 вообще не видно вроде, только опросы хабов.

Интересно, что в даташите у M7 кроме USBHS есть ещё USB transmitter в котором задаётся частота кварца и подтягивающие резисторы. Но в примерах на M7 этот USB transmitter вообще не используется.

Насколько я понимаю, раз M7 принимает SOFы, suspend, resume, то связь с компьютером всётаки есть, а не сам с собою M7 разговаривает.

Но почему М7 не получает прерывания на ep0? Что должно произойти до общения с ep0?
Посылает ли М7 SEO и как?

Кому-нибудь удавалось запустить USB на ATSAMS70 или ATSAMV71?
_4afc_
USBCDC ведёт себя также как и MSD - не отсылает дескриптор, т.к. не приходят запрос в ep0

Интересное наблюдение

1 USB от PLLA не работает если не включить PLLU PMC->CKGR_UCKR = CKGR_UCKR_UPLLCOUNT(0xf) | CKGR_UCKR_UPLLEN;)
2 Хоть включай USBCLK PMC->PMC_SCER = PMC_SCER_USBCLK, хоть нет, хоть с любым делителем - эффект одинаковый т.е. почему-то можно работать без него или он не работает
DmitryM
Цитата(_4afc_ @ Dec 6 2016, 19:27) *
USBCDC ведёт себя также как и MSD - не отсылает дескриптор, т.к. не приходят запрос в ep0

Интересное наблюдение

1 USB от PLLA не работает если не включить PLLU PMC->CKGR_UCKR = CKGR_UCKR_UPLLCOUNT(0xf) | CKGR_UCKR_UPLLEN;)
2 Хоть включай USBCLK PMC->PMC_SCER = PMC_SCER_USBCLK, хоть нет, хоть с любым делителем - эффект одинаковый т.е. почему-то можно работать без него или он не работает

Вы внимательно изучили картинку 29-1? Там не один регистр надо проинициализировать.
controller_m30
Мне кажется, нужно посмотреть в описании примеров MSD и CDC на какой кварц они рассчитаны. Если примеры не для 12мГц, то заменить кварц на тот что в примерах. Или просто заменить кварц, на всякий случай.

Если с кварцем всё в порядке, то нужно как-то проверить частоту UPLLCK, действительно-ли она 480мГц. В даташите есть диаграмма "General Clock Block Diagram" где видно, что UPLLCK можно вывести как источник для MasterClock, ProcessorClock, PeripheralClock и т.д.
Вывести эту частоту (через имеющиеся там делители) на какую-то периферию, типа таймера, и пусть он выдаёт на внешнюю ножку меандр. С помощью осциллографа, частотомера, или другого контроллера - посмотреть частоту этого меандра.

Или используя эту частоту для тактирования процессора, сделать мигалку светодиодом, с частотой 1Гц, и сравнить скорость мигания при тактировании: от кварца 12мГц напрямую (минуя UPLLCK), от внутреннего RC осциллятора 4,8,12мГц, от кварца 32768 и т.п.
Этот способ не сильно точный, но хотя бы грубо прикинуть соотношение частот позволяет.
DmitryM
Цитата(controller_m30 @ Dec 7 2016, 11:59) *
Или используя эту частоту для тактирования процессора, сделать мигалку светодиодом, с частотой 1Гц, и сравнить скорость мигания при тактировании: от кварца 12мГц напрямую (минуя UPLLCK), от внутреннего RC осциллятора 4,8,12мГц, от кварца 32768 и т.п.
Этот способ не сильно точный, но хотя бы грубо прикинуть соотношение частот позволяет.


Или вывести её на любую из выводов PCK с соответствующим делителем, чтобы уложиться по частоте, и померить непосредственно.
_4afc_
Кварцевый резонатор 12МГц 1000ppm, что вероятно для HS много, но и FS - не работает

Вывел наружу и проверил осциллографом
UPLLCK = 477.858MHz
PLLACK = 477.861MHz
Смотрел на выводе PCK, т.е. UPLLCK=UPLLCKDIV

Если входной кварц задать 16МГц, при подключенном 12МГц, UPLLCK = 360MHz (х30) и SOF не ловятся.

Если смотреть General Clock Block Diagram, то в PMC_SCER надо записывать 10-1, чтобы получить USB_48M,
однако в примерах туда пишут 1-1. И кстати UTMI_CKTRIM на этой диаграме я не вижу.

Установка USB48M в 30, 48 или 480МГц ни на что не влияет, тем более что этот сигнал используется только в LS режиме который не поддерживается.

Для проверки используются примеры CDC или MSC от ATSAMV71 скомпилированные под ATSAMS70

Боюсь, как бы не вышла еррата, что в 100 ножечных корпусах - тоже не работает USB...
_4afc_
Замена резонатора с измеренной частотой 11.9465 производящего UPLLCK = 477.858MHz на
генератор GXO-7531/BI с измеренной частотой 11.9999 производящего UPLLCK = 479.998MHz...

ничего не изменила sad.gif

controller_m30
Я нашёл такое.
Пин VBG через резистор 5к62 1% подключенный на GNDUTMI, и параллельно резистору кондёр 10pF. В общем как на схеме в конце даташита. Надо бы посмотреть. Может и остальную обвязку порта USB, из резисторов 15к и 22к попробовать?

Ещё такое. Регистр USBHS_CTRL (самый первый в списке регистров USB) - для ATSAM V71 там есть дополнительный бит UID, которого нет у ATSAM S70. Может это отличие что-нить значит?
_4afc_
Цитата(controller_m30 @ Dec 8 2016, 17:27) *
Пин VBG через резистор 5к62 1% подключенный на GNDUTMI, и параллельно резистору кондёр 10pF. В общем как на схеме в конце даташита. Надо бы посмотреть.

На пине VBG 5к62 1%+10pF есть, номинал проверил. Напряжение VBG становиться равным 1В на период обмена по USB.

Цитата(controller_m30 @ Dec 8 2016, 17:27) *
Может и остальную обвязку порта USB, из резисторов 15к и 22к попробовать?

Есть опыт запуска USBHS ATSAM9RL64 - там похожая обвязка у HS, но без хоста вроде. Работало без подключения ID и VBUS, но я подумаю как это подключить.

Цитата(controller_m30 @ Dec 8 2016, 17:27) *
Ещё такое. Регистр USBHS_CTRL (самый первый в списке регистров USB) - для ATSAM V71 там есть дополнительный бит UID, которого нет у ATSAM S70. Может это отличие что-нить значит?

Вообще песня. По коду, при инициализации делают USBHS_CTRL=UIMOD затирая всё остальное.
После старта в USBHS_CTRL лежит 0x03004000, т.е. UIMOD+UID+FRZCLK.

Приколы:

1. если UID не затереть в 0 перед установкой USBE - прерываний не будет, даже suspend, resume,SOF.
2. установить VBUSHWC в 1, как требует дока - практически невозможно. Не устанавливается ни до USBE ни после.
3. если в самом вначале записать в USBHS_CTRL 0xFFFFFFFF, то в нём будет лежать 0x0300F000 и вот тогда можно будет установить VBUSHWC в 1 доведя после инициализации USBHS_CTRL до 0x0200B100, но лучше от этого не становиться.
4. если после USBE записать в USBHS_CTRL 0xFFFFFFFF , то в нём будет лежать 0x0373FFFF, и будет повисать на attach
5. если после USBE записать в USBHS_CTRL 0x02FFFFFF , то в нём будет лежать 0x0273FFFF, будет работать как раньше, только вначале добавятся ещё пара suspend, resume.

Посмотрел осциллографом D+D- увидел меняющиеся SOF, увидел изменение уровней. Ответов, если они должны были быть - не увидел.
controller_m30
Может мелочь, но всё таки.
На фигуре 30-1 (для S70) нарисована схема Clock Generator крупным планом. А на фигуре 31-1 этот же Clock Generator немного отличается по внутренним связям. Какой из рисунков правильный не понятно. Если правильная фигура 30-1, тогда всё нормально. А если правильно то что на 31-1 изображено, то этот Clock Generator отличается от того что у V70.

Проверьте ещё прерывания по сбросам шины USB. Сбросы-то ведь происходят. Значит хотя бы эти прерывания должны приходить. Точку останова в обработчик прерывания поставьте, с зажиганием светодиода в этот момент. А сам обработчик зациклить на себя.

Может что-то не так с разрешением прерываний (вообще, и для модуля USB в частности), или их тактированием? (если такое есть)

В статьях в инете написано, что стартует обмен сначала в FullSpeed, потом происходит какая-то условная перекличка состояниями JKJK с хостом, что означает устройство HighSpeed, и дальше обмен идёт на HighSpeed скорости.
Из того что происходит запуск обмена в FullSpeed, потом происходят сбросы в HighSpeed режиме - можно предположить что контакты D+/D- не перепутаны, т.к. для определения FullSpeed нужно было найти резистор на определённой ножке. И JKJK перекличка происходит успешно, раз начинаются сбросы для HighSpeed состояния.

Если прерывания работают, тактовая 480 и 48мГц есть, внешняя обвязка в норме, всё проинициализировано внутри, а событий нет - может пример от V70 всё-таки не подходит? Хотя даташиты вроде как похожи...

Я бы теперь пробовал запускать только в FullSpeed режиме, и использовал бы для снятия аппаратного лога анализатор SaleaeLogic - он могёт декодировать состояния шины для FullSpeed. И стоит копейки (китайского производства конечно).
Аппаратно подключиться к обмену на шине, можно с помощью развязки буфером типа 74hc06 и т.п. Нужно два разъёма USB: папа и мама (чтоб включать в разрыв шины USB), и одна микросхема логики, чтоб не нарушать ёмкость шины (у 74hc серии ёмкость входа несколько pF). Один буфер подключается входом на D+, другой входом на D-, а выхода буферов подключаются к анализатору.
Может там что-нить обнаружилось бы...
maxx2
Я бы посоветовал посмотреть готовый пример из конфигуратора Atmel Start да и потыкаться с ним вообще.









VDDUTMII Decoupling capacitor (100 nF). Powers the USB transceiver interface. Must be connected to
VDDIO. For USB operations, VDDUTMII and VDDIO voltage ranges must be from 3.0V to 3.6V.
Must always be connected even if the USB is not used.
Decoupling/filtering capacitors must be added to improve start-up stability and reduce source voltage drop.
Supply ripple must not exceed 20 mVrms for 10 kHz to 10 MHz range.
_4afc_
Цитата(maxx2 @ Dec 13 2016, 11:55) *
Я бы посоветовал посмотреть готовый пример из конфигуратора Atmel Start да и потыкаться с ним вообще.

!!! С П А С И Б О !!!

Не знал о существовании Atmel Start.
Залил пример MSC от E70 в S70, без каких либо исправлений - определился наконец и даже отформатировался.

Примеры из ASF - CDC, MSC, USBcore - почему-то не работали.
Переносил куски из SoftPack1.5 - не помогало.

Работает как с точным кварцем, так и с резонатором.

Значит камушек живой - будем копать потихоньку, что нетак было.

Спасибо всем откликнувшимся!

PS: у меня реально завал был - думал придётся другой камень ставить в серию.

PPS: Скорость записи в примере FS:1025кбайт/с HS:8800кбайт/с
_4afc_
Два месяца, несколько подходов с разных сторон в коде, замена BGA контроллера, замена кварца, покупка кита на v71.

И.. я таки нашел проблему:

не работают примеры USB из ASF332, а ещё в ASF331 они рабочие

Всё дело в файле compiler.h там какой-то чудак улучшил clz(u) и в итоге в USB всё неправильно настраивалось...

Код
//#define clz(u)              ((u) ? __builtin_ctz(u) : 32)    //BAD from 332
  #define clz(u)              __builtin_clz(u)                     //Good from 331


После замены этой строки, примеры USB из ASF332 тоже заработали!
skripach
_4afc_, подскажите в чём основное отличие между E70 и S70?
maxx2
Цитата(skripach @ Jan 19 2017, 22:10) *
_4afc_, подскажите в чём основное отличие между E70 и S70?


Нажмите для просмотра прикрепленного файла
skripach
Цитата(maxx2 @ Jan 20 2017, 10:18) *

Спасибо!
_4afc_
Цитата(_4afc_ @ Jan 18 2017, 18:37) *
не работают примеры USB из ASF332, а ещё в ASF331 они рабочие
Всё дело в файле compiler.h там какой-то чудак улучшил clz(u) и в итоге в USB всё неправильно настраивалось...
Код
//#define clz(u)              ((u) ? __builtin_ctz(u) : 32)    //BAD from 332
  #define clz(u)              __builtin_clz(u)                     //Good from 331

После замены этой строки, примеры USB из ASF332 тоже заработали!


Рано я радовался. Мой код написанный под ASF не работает на HiSpeed.

Ситуация не очень понятная:

Есть две платы

1 с резонатором с измеренной частотой 11.9465 производящим UPLLCK = 477.858MHz
2 с генератором с измеренной частотой 11.9999 производящего UPLLCK = 479.998MHz

на плате с генератором работает мой код ASF и AtmelStart в режиме HS
на плате с резонатором работает только AtmelStart в режиме HS.

в режиме FS работает любой код на любой плате.
Причем плата с резонатором в режиме ASF HS определяется системой, но при чтении секторов правильо успевает считать только около 200 байт.
Код на AtmelStart ведёт себя похожим образом, если при конфигурации PLLA не установить ONE (MCK=24MHz).

Сложность в том, что весь проект написан под ASF и встроить туда кусок из AtmelStart тяжело... и на плате нет ни места под генератор, ни тока питания.
Скопировал инициализацию (MCK=150MHz) из AtmelStart в ASF - непомогло.

Не могу понять: допустим проблема аппаратная, но код из AtmelStart её обходит как-то. crying.gif

Шаманъ
Цитата(_4afc_ @ Mar 28 2017, 18:06) *
Не могу понять: допустим проблема аппаратная, но код из AtmelStart её обходит как-то. crying.gif

Я в соседней ветке с подобным страдал несколько дней назад. И там описан вариант когда аппаратная проблема с КГ могла быть частично решена программно. Так что это вполне нормально. Отклонение частоты у Вашего резонатора, как по мне сильно большое. И это еще так сказать "на столе", а что будет когда температура поплывет?
_4afc_
Цитата(Шаманъ @ Mar 28 2017, 20:01) *
Я в соседней ветке с подобным страдал несколько дней назад. И там описан вариант когда аппаратная проблема с КГ могла быть частично решена программно.


Не увидел решения даже частичного, где?

Нашел интересную ссылку, но воспользоваться не получилось - не соединяется.

USB / ASF - critical bug in udp_device.c
Цитата
I have found a critical bug in the USB stack.
1) In some code paths the system does not disable the USB interrupts before calling udd_ep_finish_job(). This seems like an obvious bug, as there is no need to have interrupts enabled if there is no transaction queued. This alone does not cause problem however.

2) If someone then calls udd_ep_run(), then a race condition arises. After updating the "busy" bit, there is a period where the interrupt is not disabled. In this period, if an interrupt (on e.g. an ISO endpoint) arrives, a transaction using the old parameters in "ptr_job" will start. This is a serious bug that then leads to incorrect transfers.

At high speeds (lots of ISO packets) this bug is very easy to reproduce.

I have attached a patched version that fixes both problems.
I have marked all the changes with "DT_FIX".


Интересно, что в AtmelStart вроде вообще не выключают прерывания на ходу.
Шаманъ
Цитата(_4afc_ @ Mar 29 2017, 14:34) *
Не увидел решения даже частичного, где?

Читали невнимательно. Если все время посылать на хост ZLP (когда реальных данных нет), то даже с кривым клоком хосту удается поддерживать синхронизацию. Если делать как в стандарте, то кривой клок сразу губит соединение. Что в принципе объяснимо, правда это когда уже знаешь sm.gif

P.S. Это не про то, как надо делать, а про то, как бывает.
_4afc_
Цитата(Шаманъ @ Mar 29 2017, 17:00) *
Читали невнимательно. Если все время посылать на хост ZLP (когда реальных данных нет), то даже с кривым клоком хосту удается поддерживать синхронизацию.


Не подскажите куда в этом коде вставить посылки ZLP?

У меня есть подозрение, что в EP0 они эти посылки вставили перед каждой отправкой или при инициализации.
А в EP1 EP2 этого нет - поэтому данные и теряются.
Шаманъ
Цитата(_4afc_ @ Mar 29 2017, 18:05) *
Не подскажите куда в этом коде вставить посылки ZLP?

Сразу выскажу замечание, делать так это неправильно, не по стандарту, и сейчас я у себя все это дело убрал, сменил тактирование и все работает как положено и без ZLP.

Теперь про ZLP. Когда посылать нечего по правилам точка выставляет NAK, я вместо этого посылал ZLP пакеты. Куда именно вставлять в код Вам должно быть виднее - я "воевал" с STM32, и код был написан мной с нуля, поэтому таких вопросов не возникало. Могу предположить, что начиная со строки 1923 стоит посмотреть - там судя по коду и комментариям как раз "деактивируют" точку после окончания передачи.

Цитата
У меня есть подозрение, что в EP0 они эти посылки вставили перед каждой отправкой или при инициализации.
А в EP1 EP2 этого нет - поэтому данные и теряются.

Если все ок с железом, то пустые пакеты нужны только там, где нужны по протоколу. В EP0 ZLP пакеты отправляются как подтверждения приема данных, там они нужны по-любому. С другими точками они обычно нужны только как признак окончания передачи, если длина посылки кратна размеру пакета.
Alexey_N
Цитата(_4afc_ @ Mar 29 2017, 18:05) *
А в EP1 EP2 этого нет - поэтому данные и теряются.

Так чем дело кончилось, - удалось победить этот камень?
_4afc_
Цитата(Alexey_N @ Dec 23 2017, 23:23) *
Так чем дело кончилось, - удалось победить этот камень?


Кончилось заменой кварцевого резонатора на другой тип.

Камень изначально тактировался от резонатора типа CSTCE.
Было опробовано 5 партий этих резонаторов с маркировками на корпусе h,t,x,v,g в режиме HS:

CSTCE_h 11.9451MHz (-4575ppm) - нестабильное соединение, чтение невозможно;
CSTCE_t 11.9487MHz (-4279ppm) - стабильное соединение, чтение с ошибками;
CSTCE_x 11.9515MHz (-4042ppm) - стабильное соединение, чтение с ошибками;
CSTCE_v 11.9566MHz (-3621ppm) - стабильное соединение, чтение с ошибками;
CSTCE_g 11.9590MHz (-3417ppm) - стабильное соединение, чтение без ошибок.

Поскольку резонатор CSTCE с маркировкой на корпусе g закупался много лет назад, остатков бы не хватило на серию, a в продаже его не найти.
Была выбрана замена AMB10 с маркировкой на корпусе AH6G частотой 11.9998MHz (-21ppm) - стабильное соединение, чтение без ошибок.

PS: Что интересно CY7C68013 прекрасно работал в режиме HS от кварца с частотой 24.0032 (+133ppm)...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.