Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 USB Device example
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ADA007
[indent][/indent]Приветствую всех!
Разбираюсь с аппаратным USB на stm32f103vct6. Не получается запустить пример проекта работы с usb wacko.gif.

Аппаратная платформа своя...собственно сам контроллер подключенный к usb и стабилизатор питания, больше ничего нет.
Софт брал отсуда ТЫЦ (USB-Mass_Storage-MCU Flash). Просматривая код, я понял что это просто обрезанная версия Mass_Storage из STM32_USB-FS-Device_Lib_V3.3.0. Я так понимаю я должен был на выходе получить стандартное устройсво mass storage с объмом памяти flash контроллера?

Переконфигурировал пины под себя - залил...и застрял на строке main.c => while (bDeviceState != CONFIGURED);
Далее просматривая код, я нашел всего 2-е функции, где этой переменной присваивается значение CONFIGURED. И по-моему я ни в одну из них не попадаю по ходу работы...

Подскажите, кто как боролся в стандартной библиотеке с данным примером? У всех работало сходу? sad.gif

ЗЫ: Управление usb_disconnect пином организовано так (в отличие от схемы, приведенной в архиве китайского автора для fure bull) из-за разных схем - пробовал управлять disconnect-ом в инверсии - результат тот же. Свой проект прилагаю.
kovigor
Цитата(ADA007 @ Sep 1 2013, 15:47) *
Свой проект прилагаю.

Схема дисконнекта у вас странная, очень. Q4 включен как эмиттерный повторитель, но база у него положительнее, чем коллектор, а с эмиттера вы пытаетесь снять сигнал, по уровню превышающий имеющиеся на коллекторе 3.3В. Зачем так делать ? Подключите коллектор Q4 не к 3.3В, а к пяти, идущим от USB - хоста, т.е., к линии USB_Power.
P.S. Пример от STM должен работать, по идее. Не вы первый его используете. Я запускал их пример на STM32F207, подправив ножки в соответствии с тем, что пример был рассчитан на корпус "X", а у меня был МК в корпусе "Y". В итоге все заработало. Минимальную работоспособность выложенного на сайте ST проекта, думаю, можно гарантировать ...
ADA007
Цитата(kovigor @ Sep 1 2013, 19:55) *
Схема дисконнекта у вас странная, очень...

Я её тоже не сам придумывал - содрал с оф. платы olimex .
И на easyelectronix.ru тоже ее в пример приводили.
С прогой буду дальше мучатся...жду ваших советов, куда копать?
kovigor
Цитата(ADA007 @ Sep 1 2013, 20:34) *
С прогой буду дальше мучатся...жду ваших советов, куда копать?

D+ и D- не перепутаны ?
Flexz
Цитата
Подключите коллектор Q4 не к 3.3В, а к пяти, идущим от USB - хоста, т.е., к линии USB_Power.

А так можно? Получится 5 вольт на DP же. А по спекам там ЕМНИП 3.6 максимум допустимо.
kovigor
Цитата(Flexz @ Sep 1 2013, 21:24) *
А так можно? Получится 5 вольт на DP же. А по спекам там ЕМНИП 3.6 максимум допустимо.

Посмотрел Гука. Да, надо к 3.3В, а не к 5В. Но вообще, там написано, что приемник обязан выдерживать не менее 3.8В. Вы правы, прошу прощения.
ADA007
Цитата(kovigor @ Sep 1 2013, 21:09) *
D+ и D- не перепутаны ?

Тоже по началу так думал....но нет...несколько раз проверил, DM - 70 pin, DP - 71 pin + подтяжка 1,5к через схему disconnect.
И все-таки не могу понять когда переменной bDeviceState должно быть присвоено значение CONFIGURED?
kovigor
Цитата(ADA007 @ Sep 1 2013, 21:46) *
И все-таки не могу понять когда переменной bDeviceState должно быть присвоено значение CONFIGURED?

Я в этих примерах разбирался давно, деталей не помню. К тому же, USB в STM сложный, как космический корабль.
Вы не с того конца к проблеме подошли. Configured, надо полагать, присваивается тогда, когда устройству назначена конфигурация (хостом). А для этого оно должно чуть ли не полностью пройти энумерацию. Поставьте BusHound и посмотрите, чем ваше устройство обменивается с хостом на этапе энумерации, и обменивается ли вообще. Запустите USBView и посмотрите, есть ли ваше устройство в системе и как именно оно там распознано ...
ADA007
Цитата(kovigor @ Sep 1 2013, 22:02) *
Поставьте BusHound и посмотрите...

Поставил, посмотрел - при подключении устройства windows пишет, что найдено неизвестное устройство, в bushound - ни одного события по данному устройству не было. Что-то меня дернуло коротнуть линию DP на gnd несколько раз - имитируя подключение устройства - и в системе определилось mass storage, в budhound - появились события.
Подумал, что дело в схеме disconnect. Переделал как у китайского автора на одном pnp транзисторе = результат тот же...устройство тупо висит на линии и никакой активности, определяется как неизвестное. Попробовал тупо 1,5к которое на DP висит на vcc посадить - эффект тот же.

На сколько я помню устройство должно подключиться к usb и подтяжкой 1,5к система определяет, что появилось новое устройство и посылает ему reset. После этого устройство должно снять подтяжку 1,5к с DP и потом снова подключить. Далее начинается инициализация...

Не пойму.Почему я делаю disconnect вручную - все работает, а программно disconnect не работает ? ЧЯДНТ?
controller_m30
Цитата(ADA007 @ Sep 2 2013, 17:38) *
На сколько я помню устройство должно подключиться к usb и подтяжкой 1,5к система определяет, что появилось новое устройство и посылает ему reset. После этого устройство должно снять подтяжку 1,5к с DP и потом снова подключить. Далее начинается инициализация...
Не пойму.Почему я делаю disconnect вручную - все работает, а программно disconnect не работает ? ЧЯДНТ?

Не должно устройство отсоединять резистор 1,5к. Отсоединение резистора равнозначно извлечению устройства из разъёма USB (кстати можете пользоваться программным отключением резистора для имитации физического переподключения).
Обмен с хостом происходит при подключенном резисторе.

А состояние RESET лишь сигнализирует устройству, что оно должно сбросить все свои программные переменные, и некоторые регистры USB-модуля в начальное положение. Но не отключать резистор.
Alex11
Проверьте, все-таки, работает ли у Вас подключение подтяжки. И еще один момент. Есть там в библиотеке такая строчка: gusbcfg.b.usbtrdtim = 5;
В файле usb_dcd_int.c. Так вот, пяти может не хватить в некоторых случаях. Там, по хорошему, должно быть число, зависящее от тактов шины и скорости USB. На попробовать можно увеличить до предела (15).
ADA007
Цитата(Alex11 @ Sep 2 2013, 22:25) *
Проверьте, все-таки, работает ли у Вас подключение подтяжки. И еще один момент. Есть там в библиотеке такая строчка: gusbcfg.b.usbtrdtim = 5;
В файле usb_dcd_int.c. Так вот, пяти может не хватить в некоторых случаях. Там, по хорошему, должно быть число, зависящее от тактов шины и скорости USB. На попробовать можно увеличить до предела (15).

Подключение подтяжки проверил...в отладчике дергаю портом контроллера - светодиод соответственно включается и выключается (вроде как транзистор работает). Схема disconnect у меня теперь такая (только светодиод подключил через 8к, а не через 470, как на картинке)


Попутно еще вопрос...сопротивление на DP 1,5к сигнализирует о том, что устройство готово принимать данные от хоста. Похоже, что у меня устройство не готово принимать данные? или как?
Может в отладчике бряки поставить где-то, чтоб выловить момент приема данных от хоста?

Пробовал увеличивать gusbcfg.b.usbtrdtim = 15; = результата не дало (
Помогите, кто чем может! crying.gif
kovigor
Цитата(ADA007 @ Sep 3 2013, 15:15) *
Помогите, кто чем может !

Ненавижу использовать чужие проекты без глубокого вникания в суть происходящих в них процессов.
С кварцем вы ничего не напутали ? И D+ вы не имеете права этим светодиодом к земле тянуть (тянуть линии данных к земле - дело хоста, но никак не устройства) ...
Повторюсь, там что-то элементарное, и косяк почти наверняка ваш. Не может тот проект с сайта не работать. Не видел я такого. Если бы это было так, их бы давно засыпали письмами с описанием проблемы, и они бы быстро исправили ошибку .
ADA007
Цитата(kovigor @ Sep 3 2013, 15:29) *
Повторюсь, там что-то элементарное, и косяк почти наверняка ваш.

Я с этим вполне согласен. Но ума не приложу где это я мог накосячить и как это найти... конечно пытаюсь найти..но пока что безрезультатно, вот и пишу суда...может кто подскажет куда посмотреть, что попробовать, как проверить...
ЗЫ: а по поводу схемы...это один в одни схема из архива в первом посте... поскольку исходники брал из этого архива, то и схему решил в итоге повторить, потому, что так которая на рисунке в первом посте - та более правильная, но не из этого стартеркита.
kovigor
Цитата(ADA007 @ Sep 3 2013, 15:57) *
может кто подскажет куда посмотреть, что попробовать, как проверить...

Подскажу. Я, когда свои USB - дивайсы делал, до тонкостей вникал в стандартные примеры, до дыр зачитал спецификацию на шину, разработал и изготовил прибор на FPGA, захватывающий транзакции на шине, написал для него ПО, показывающее транзакции на экране персоналки, и только тогда получил достойный вложенного труда, вменяемый и предсказуемый результат. А вы хотите с наскока. Вот и получаете. Чудес не бывает. И примеры от ST, поверьте, далеки от совершенства ...
controller_m30
Цитата(ADA007 @ Sep 1 2013, 15:47) *
Аппаратная платформа своя...собственно сам контроллер подключенный к usb и стабилизатор питания, больше ничего нет.
А кварц на 8 Мгц есть? С конденсаторами 27 pf и резистором 1М, как в схеме на Olimex-овскую борду. В примере-то наверняка настройки PLL приведены для кварца из отладочной платы. А если кварц другой - то дела не будет.
Цитата(ADA007 @ Sep 3 2013, 15:15) *
Попутно еще вопрос...сопротивление на DP 1,5к сигнализирует о том, что устройство готово принимать данные от хоста. Похоже, что у меня устройство не готово принимать данные? или как?
Не. Резистор только сигнализирует о наличии устройства на шине USB. А готовность/неготовность к приёму данных устройство сообщает по шине (пакетами ACK или NACK).
Обнаружив резистор на шине, Хост выдаёт состояние RESET, потом состояние SUSPEND, потом снова RESET, и только после этого присылает первый SETUP-дескриптор. Если Хост не получит подтверждения приёма дескриптора (пакет ACK) - то повторит RESET и SETUP-пакет ещё два раза и отключится от шины несмотря на резистор. Чтоб снова активизировать Хост - нужно резистор отключить и снова подключить (типа вынули флешку и снова вставили).

В некоторых USB-девайсах резистор 1,5к наглухо впаян между 3,3в и DP, но это требует от устройства быть готовым к запросам Хоста немедленно сразу-же после установки в разъём.
Отключаемый резистор позволяет контроллеру: не спеша настроить внутренние регистры, подождать пока стабилизируется PLL, и только по готовности включить резистор и ждать от Хоста команд.

Просто Хост обнаружив резистор, делает только три попытки связаться с девайсом, и если девайс не успел ответить - Хост отключается от шины.
ADA007
Цитата(controller_m30 @ Sep 3 2013, 17:31) *
А кварц на 8 Мгц есть? С конденсаторами 27 pf и резистором 1М, как в схеме на Olimex-овскую борду...

Да....кварц именно 8 MHz,а вот обвязки не было... (вот это я совсем уже 01.gif). Повесил 1М и 2х20пФ - все стало работать,как часы. До этого, когда девайсы на AVR-ках лепил на скорую руку и так катило 16МГц ставил просто на пины и работало... Спасибо за помощь, всем участникам!
Кстати, уже не первый раз встречаю схемное решение с 1М между ногами кварца, но ни как не могу понять тайного смысла этого резюка.Может кто объяснит? С кондерами-то все понятно, но 1М зачем? sad.gif
kovigor
Цитата(ADA007 @ Sep 3 2013, 18:07) *
С кондерами-то все понятно, но 1М зачем? sad.gif

http://www.nxp.com/documents/data_sheet/74LVC1GX04.pdf
controller_m30
Цитата(ADA007 @ Sep 3 2013, 18:07) *
Повесил 1М и 2х20пФ - все стало работать,как часы. До этого, когда девайсы на AVR-ках лепил на скорую руку и так катило 16МГц ставил просто на пины и работало...
Оно может и в данном случае работать без обвязки, но тогда настройки PLL пришлось бы подобрать индивидуально, под уникальные параметры такой схемы включения кварца.
А раз настройки PLL берутся в готовом виде - то и обвязку кварца (и сам кварц), лучше всего повторить один-к-одному с проектом-исходником.
А также и напряжение питания процессора - именно 3.3v, а не, допустим, 3.0v или 2.8v.
smk
Дисконнект нормальный. У меня работает, только 100к вместо 36к. Вы его принудительно включите или проверьте в программе какой точно пин используется.
misyachniy
Цитата(ADA007 @ Sep 3 2013, 15:15) *
Попутно еще вопрос...сопротивление на DP 1,5к сигнализирует о том, что устройство готово принимать данные от хоста.


В хосте DP и DМ притянуты к земле резисторами 15К.
Присоединение к DP/DМ резистора 1,5К говорит о том, что на шине появилось устройство FULL/LOW Speed готовое работать.

При отладке, нужно в начале отсоединить резистор, сделать паузу порядка секунды па потом присоединятся.
A.Lex
Чтобы не плодить тем: контроллер STM32F207, пытаюсь запустить USB FS (сигналы DM, DP, VBUS), VCP. USB инициализацию типа проходит, но USART1 не инициализирован, на DP и DM 4,5В. Попытка найти причину привела к открытию, что файл инициализации СОМ-порта usbd_cdc_vcp.c в проекте есть, но нигде нет ссылок на его функции. В доке CD00289278.pdf на библиотеку STM32_USB-Host-Device_Lib_V2.1.0, вообще описаны usbd_cdc_xxx_if (.c, .h): (i.e. usbd_cdc_vcp_if (.c, .h)) которых нет.


Если есть рабочий проект или опыт, пните меня в нужном направлении.
kovigor
Цитата(A.Lex @ Sep 19 2013, 10:43) *
Если есть рабочий проект или опыт, пните меня в нужном направлении.

Лично использовал проект Mass-Storage для этого МК, взятый с сайта ST. Все работает. Только прошлось подправить GPIO, ибо их проект был рассчитан на МК в корпусе "X", а у меня был МК в корпусе "Y".

Вообще, подозревать выкладываемые на сайтах разработчиков примеры в неработоспособности надо в самую последнюю очередь. Если с готовым проектом что-то не так, то почти наверняка дело не в проекте, а в том, что вы упустили из виду какую-то мелкую особенность ...
A.Lex
Спасибо, буду копать дальше.
A. Fig Lee
Цитата(A.Lex @ Sep 19 2013, 03:43) *
Чтобы не плодить тем: контроллер STM32F207, пытаюсь запустить USB FS (сигналы DM, DP, VBUS), VCP. USB инициализацию типа проходит, но USART1 не инициализирован, на DP и DM 4,5В. Попытка найти причину привела к открытию, что файл инициализации СОМ-порта usbd_cdc_vcp.c в проекте есть, но нигде нет ссылок на его функции. В доке CD00289278.pdf на библиотеку STM32_USB-Host-Device_Lib_V2.1.0, вообще описаны usbd_cdc_xxx_if (.c, .h): (i.e. usbd_cdc_vcp_if (.c, .h)) которых нет.


Если есть рабочий проект или опыт, пните меня в нужном направлении.

Есть там ссылки. Непрямые. Там несколько структур с каллбэками, заполняются в USB_Init() в app.c в примере.

Как раз сейчас его усиленно копаю.
A.Lex
Спасибо.

Примеры и документация кривые.... или это я тупой?


kovigor
Цитата(A.Lex @ Sep 19 2013, 16:53) *
Примеры и документация кривые.... или это я тупой?

Документация - барахло. А примеры просто заумно-сложные, как впрочем и сам USB - движок на STM. Ну и сам стиль программирования мне не понравился ...
A. Fig Lee
Цитата(kovigor @ Sep 19 2013, 11:10) *
Документация - барахло. А примеры просто заумно-сложные, как впрочем и сам USB - движок на STM. Ну и сам стиль программирования мне не понравился ...


А у кого простой движок?
kovigor
Цитата(A. Fig Lee @ Sep 19 2013, 18:50) *
А у кого простой движок?

Проще чем у AT89C5131 я еще нигде не видел.
Очень понравилось семейство LPC214x, а также АТМЕЛовские ARM7 и ARM9 с USB. Кроме того, и LPC и ATMEL предоставляют гораздо более и простые и понятные, чем у ST, примеры ...
agate
Я запускал USB na stm32f103 за основу взят Кеил HIDUSB примеp. Для дебага я использовал Линух хост и hidtool утилиту из V-USB проэкта. Я переделал утилиту под свои задачи. Все работает.
A.Lex
Спасибо всем за помощь!

Сегодня принял волевое решение, отрезал дорожки от разъема, подпаял USB-кабелек - заработало!!!


Кривая разводка не давала работать каналу.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.