Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USB интерфейс HID устройство со стороны микроконтроллера
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
smk
Осваиваю создание USB устройств. В качестве "железа" использую STM32F103RCT6. Среда Keil. Примеры от Keil работают. Хочу теперь изучить сам интерфейс и по этому завел тему для своих ламерских вопросов. Собственно первый вопрос. У Агурова в книге написано, что report может содержать до 65535 байт с данными. Это как? 256 ID по 256 байт? Не совсем понимаю. С конечными точками тоже туман какой-то. Как я понимаю нулевая конечная точка скорее служебная, но может содержать и полезные данные до 8 байт? Так же не понятен механизм передачи. Напимер, как я заметил обмен ведется периогдически. А если нужно передавать тогда, когда комплект данных готов? А если нужно иногда запрашивать данные у ПК? Помогите разобраться пожалуйста. Спасибо.
kovigor
Цитата(smk @ Mar 19 2012, 12:00) *
Осваиваю создание USB устройств. В качестве "железа" использую STM32F103RCT6. Среда Keil. Примеры от Keil работают. Хочу теперь изучить сам интерфейс и по этому завел тему для своих ламерских вопросов. Собственно первый вопрос. У Агурова в книге написано, что report может содержать до 65535 байт с данными. Это как? 256 ID по 256 байт? Не совсем понимаю. С конечными точками тоже туман какой-то. Как я понимаю нулевая конечная точка скорее служебная, но может содержать и полезные данные до 8 байт? Так же не понятен механизм передачи. Напимер, как я заметил обмен ведется периогдически. А если нужно передавать тогда, когда комплект данных готов? А если нужно иногда запрашивать данные у ПК? Помогите разобраться пожалуйста. Спасибо.


1. Агурова не читайте. Там очень халтурно описана работа как USB, так и собственно HID. Почитайте того же Гука, Jan Axelson, ну и спецификации (USB и HID).
2. Да, нулевая точка - управляющая, по умолчанию длина пакета - 8 байт, если при энумерации устройство не заявит о другой длине. Через эту точку можно передавать и данные. Так, например, в клавиатуру передаются команды на зажигание лампочек (посредством SetReport). Таким же путем (посредством SetReport) можно получать от нее и данные о нажатиях клавиш, но это неудобно, и поэтому для этой цели используется канал Interrupt In.
3. Так нельзя. Инициатор почти всех транзакций - хост. Для HID в большинстве случаев прерывания следуют каждые 10мС. Но вы можете запросить и другую частоту - до 1мС (для FS) или до 125 мС (насколько я помню) для HS. Быстрее и чаще не выйдет.
4. А чем обусловлен выбор именно HID ?
smk
Спасибо за ответ. И за исходники тоже. Слез я правда с АТ91. А выбор HID обусловлен в первую очередь наличием штатного драйвера в комплекте каждой ОС. Для приборов с небольшим или нечастым обменом вполне подходит. И еще мне кажется что он самый простой и с него проще будет начать.
kovigor
Цитата(smk @ Mar 19 2012, 14:00) *
Спасибо за ответ. И за исходники тоже. Слез я правда с АТ91. А выбор HID обусловлен в первую очередь наличием штатного драйвера в комплекте каждой ОС. Для приборов с небольшим или нечастым обменом вполне подходит. И еще мне кажется что он самый простой и с него проще будет начать.



Агуров прав в одном - он выбрал для старта самый простой МК с предельно простым USB - движком. Начинал я именно с него, и именно его вам рекомендую. Очень советую таки изучить внимательно исходники (там есть ошибки, но в целом их изучение весьма поучительно) из книги Агурова (теоретическую часть не читайте, вы по ней не разберетесь, она крайне небрежно написана).

P.S. А я вам разве какие-то исходники давал ? Хотя ...
smk
wMaxPacketSize - какое максимальное значение, (там два байта отведено)? Если размер пакета 64 байта, то как осуществляется передача 1 килобайта? Спасибо.
kovigor
Цитата(smk @ Mar 19 2012, 14:21) *
Если размер пакета 64 байта, то как осуществляется передача 1 килобайта? Спасибо.


Длинное сообщение передается не в одном пакете, а в нескольких
smk
Цитата(kovigor @ Mar 19 2012, 12:33) *
Длинное сообщение передается не в одном пакете, а в нескольких

Это понятно. Я имел ввиду как это организовано? Я пока еще плохо представляю себе это все. Как хост будет отсылать мне этот килобайт? Как он узнает, что порция принята правильно, а если неправильно то как он узнает что посылку нужно повторить?
kovigor
Цитата(smk @ Mar 19 2012, 14:39) *
Как хост будет отсылать мне этот килобайт? Как он узнает, что порция принята правильно, а если неправильно то как он узнает что посылку нужно повторить?


Разобьет на пакеты и отошлет. На шине используется нумерация пакетов (data0/data1) и квитирование (ACK/NAK). Объяснять долго. Почитайте Гука "Шины PCI, USB и FireWire", там это подробно расписано
smk
Я еще не понял пока как адресоваться к конкретной конечной точке. Я так понимаю конечная точка может быть IN и OUT одновременно?
kovigor
Цитата(smk @ Mar 19 2012, 14:46) *
Я еще не понял пока как адресоваться к конкретной конечной точке. Я так понимаю конечная точка может быть IN и OUT одновременно?

Нулевая - может. И есть. Со стороны МК адресоваться не надо - хост сам укажет, какая точка нужна ему в данный момент, дело МК - положить данные в буфер этой точки или считать их оттуда. А вот как адресоваться со стороны хоста, я не знаю, это вопрос к PC - программистам.
smk
Книгу нашел. Читаю. Как я понял мне нужны передачи типа interrupts.

Со стороны ПК пока не трогаем. Это потом буду разбираться.
kovigor
Цитата(smk @ Mar 19 2012, 15:04) *
Книгу нашел. Читаю. Как я понял мне нужны передачи типа interrupts.


Да. Control и Interrupt. Попробуйте разобрать исходник HID - клавиатуры, там есть все необходимое ...
smk
Спасибо за подсказанную книжку. Слегка проясняется. В конечном счете практика критерий истины, так что дочитаю и буду пробовать. А каким монитором порта USB Вы пользуетесь?
kovigor
Цитата(smk @ Mar 19 2012, 14:49) *
Спасибо за подсказанную книжку. Слегка проясняется. В конечном счете практика критерий истины, так что дочитаю и буду пробовать. А каким монитором порта USB Вы пользуетесь?


BusHound. В сложных случаях - аппаратным сниффером. Еще раз. Не пытайтесь писать проект с нуля - это гиблое дело. Возьмите готовый исходник (лучше всего для AT89C5131) и разберите его. Если хотите, могу вам дать свои проекты HID - клавиатур для этого МК, для LPC214x и для AT91SAM9 (это почти то же, что SAM7) ...
smk
С нуля... Вы мне льстите. Конечно я разбираю готовые проекты (Ваш и Custom_HID от ST). Собрал платку с контроллером. Какая-то жутко путаная штука этот USB. Впечатление такое, что разработчики попытались объять необъятное и теперь все вслед за ними делают тоже самое.
kovigor
Цитата(smk @ Mar 19 2012, 15:11) *
С нуля... Вы мне льстите. Конечно я разбираю готовые проекты (Ваш и Custom_HID от ST). Собрал платку с контроллером. Какая-то жутко путаная штука этот USB. Впечатление такое, что разработчики попытались объять необъятное и теперь все вслед за ними делают тоже самое.


С нуля очень трудно. Я, когда начинал, вообще не мог понять, как работает шина. Пришлось собирать аппаратный сниффер (Для FS/LS), захватывать реальные транзакции на шине и в деталях разбираться, какие биты, почему и зачем передаются ...

Дополнение:

Вот, со времен работы со сниффером остались файлы. Посмотрите, как выглядят временные диаграммы энумерации:

http://zalil.ru/32906383
smk
Хотелось бы себе яснее представить следующее. Со стороны ПК прием осуществляется по REPORT ID от заведомо известного устройства, передача со стороны МК ведется в конечную точку OUT. Помнится мы уже выяснили, что при длинном пакете данных он с одной стороны режется на куски, а с другой склеивается. Это делается программистом или в примерах от Keil эта ситуация уже учтена? Спасибо.
=AK=
Цитата(smk @ Mar 19 2012, 22:41) *
Какая-то жутко путаная штука этот USB. Впечатление такое, что разработчики попытались объять необъятное и теперь все вслед за ними делают тоже самое.

Начать с того, что разработал его индус. При всем моем уважении к индусам, голова у них как-то по-другому работает. Вот Зигби, например, тоже там индусы намудрили - черт ногу сломит.
Ну а потом USB продвигалось путем многолетнего коллективного творчества. Что порядка и стройности не прибавило.

Но на самом деле не так уж все плохо. В основе USB лежат довольно простые идеи. Которые, однако, никто доходчиво изложить не может, мне, по крайней мере, не встречалось. Помню меня тоже оторопь брала, когда начинал.
Slash
Цитата(=AK= @ Mar 20 2012, 12:26) *
Но на самом деле не так уж все плохо. В основе USB лежат довольно простые идеи. Которые, однако, никто доходчиво изложить не может, мне, по крайней мере, не встречалось. Помню меня тоже оторопь брала, когда начинал.

А как, на Ваш взгляд, вот это описание:
http://microsin.ru/content/view/1107/44/
kovigor
Цитата(smk @ Mar 20 2012, 11:14) *
Помнится мы уже выяснили, что при длинном пакете данных он с одной стороны режется на куски, а с другой склеивается. Это делается программистом или в примерах от Keil эта ситуация уже учтена? Спасибо.


Да, это чисто программный механизм. Если вы внимательно разберете примеры от Keil, то увидите, что там сообщение при передаче разбивается на блоки, а при приеме - собирается по частям ...
smk
Цитата(kovigor @ Mar 20 2012, 12:02) *
Да, это чисто программный механизм. Если вы внимательно разберете примеры от Keil, то увидите, что там сообщение при передаче разбивается на блоки, а при приеме - собирается по частям ...

Я пытался разбирать потому и возник вопрос как на самом деле все устроено. Хорошее бы описание к тем примерам а то что ни найду - все как-то поврхностно. Кстати спасибо за ссылку выше. Почитал с интересом.
=AK=
Цитата(Slash @ Mar 20 2012, 20:03) *
А как, на Ваш взгляд, вот это описание:
http://microsin.ru/content/view/1107/44/

Бегло посмотрел, тоже не понравилось. Беда всех описаний (и этого тоже) USB состоит в том, что все валят в одну кучу, из-за этого получается огромный ком инфы, не прожуешь. И никто не дает инфу внятными легкоусваевыми кусочкам.

Я бы начал с того, что сказал: в центре USB находится хост, все остальные устройства логически присоедены к нему, образуя звезду. Устройства между собой обмениваться не могут, по своей инициативе инфу посылать не могут. Хост - полный хозяин: хост спросил - устройство ответило. Только так, и никак иначе.

Все опросы инициирует хост. Опросы происходят циклами. Длительность цикла постоянная, 1мс для LS и FS, или 125мкс для HS. Цикл начинается с того, что хост посылает никому не адресованный токен Start Of Frame (SOF). После этого хост опрашивает периферийные устройства, причем делает это в определенном порядке: сначала опрашивает контрольные пайпы, потом "прерывания" и изохронные пайпы, и напоследок, по остаточному принципу, балк пайпы. Порядок опроса определяется планировщиком хоста, который динамически реагирует на запросы и ответы и выстраивает список опроса.

Вот это самая суть. Ее надо разжевать подробнее, с картинками, и т.п. А потом вокруг этого ядра слоями наворачивать менее значимые подробности.
sparcmaster
Цитата(=AK= @ Mar 20 2012, 16:52) *
И никто не дает инфу внятными легкоусваевыми кусочкам.

Вот тут боле менее кусочки. Еще помнится у nxp для какого-то lpc2xxx была отличная апликуха - пусть азы, но для въезда самое то. А вот по репортам hid я ничего внятного в сети, к сожалению, не находил.
Maverick
Цитата(smk @ Mar 19 2012, 10:00) *
Осваиваю создание USB устройств. В качестве "железа" использую STM32F103RCT6. Среда Keil. Примеры от Keil работают. Хочу теперь изучить сам интерфейс и по этому завел тему для своих ламерских вопросов. Собственно первый вопрос. У Агурова в книге написано, что report может содержать до 65535 байт с данными. Это как? 256 ID по 256 байт? Не совсем понимаю. С конечными точками тоже туман какой-то. Как я понимаю нулевая конечная точка скорее служебная, но может содержать и полезные данные до 8 байт? Так же не понятен механизм передачи. Напимер, как я заметил обмен ведется периогдически. А если нужно передавать тогда, когда комплект данных готов? А если нужно иногда запрашивать данные у ПК? Помогите разобраться пожалуйста. Спасибо.

может это поможет - во всяком случае енумерация проходит...
smk
Цитата(sparcmaster @ Mar 20 2012, 15:03) *
Вот тут боле менее кусочки. Еще помнится у nxp для какого-то lpc2xxx была отличная апликуха - пусть азы, но для въезда самое то. А вот по репортам hid я ничего внятного в сети, к сожалению, не находил.

Да, был для LPC2141...48.
kovigor
Цитата(smk @ Mar 20 2012, 17:10) *
Да, был для LPC2141...48.


Для старта указанный мной Гук - самое оно. Четко, кратко, правильно, да еще и с картинками. Если дружите с английским, то почитайте еще книги Jan Axelson ...

Кстати, а я вам какой исходник давал ? Для LPC ? Или для AT91 ?

P.S. А еще было описание с картинками у Cypress, его тоже многие хвалили, вот только ссылку я не припомню ...

P.P.S. Диаграммки-то гляньте, которые я выложил. Это полезнее всяких картинок
smk
Для АТ91.

Сейчас пытаюсь на ПК получить то, что передает демо-софт ST. Чет не очень-то получается. Устройство вижу, а то что посылает - нет. Borland C Builder 6 Sp4. Кто в чем пишет под USB HID (Win) если не секрет?
YAM
откатился на Borland C Builder 5.0, так как на 6.0 некорректно возвращается DevicePath USB HID устройства в запросе SetupDiGetDeviceInterfaceDetail при поиске своего...
А так все довольно просто, использую HID.DLL
smk
Цитата(YAM @ Mar 23 2012, 18:52) *
откатился на Borland C Builder 5.0, так как на 6.0 некорректно возвращается DevicePath USB HID устройства в запросе SetupDiGetDeviceInterfaceDetail при поиске своего...
А так все довольно просто, использую HID.DLL

Может стоило зарядить Sp4 ? А как Вы подключили эту библиотеку? Как осуществляете прием передачу в конечные точки? Глянуть бы примерчик.
YAM
Идем на http://www.obdev.at/products/vusb/download.html, качаем V-USB и в libs-host все есть что надо...
Просто и со вкусом.
YAM
Цитата(YAM @ Mar 23 2012, 19:52) *
откатился на Borland C Builder 5.0, так как на 6.0 некорректно возвращается DevicePath USB HID устройства в запросе SetupDiGetDeviceInterfaceDetail при поиске своего...
А так все довольно просто, использую HID.DLL

Мда.....
добавил байтовое выравнивание для _SP_DEVICE_INTERFACE_DETAIL_DATA_A и _SP_DEVICE_INTERFACE_DETAIL_DATA_W прямо в setupapi.h и в 6.0 все заработало...
alex33
Может кто подскажет какая последовательность байт и битов принята на шине USB. насколько я понял поле синхронизации выталкивается младшим битом вперед, затем идет поле PID, каким битом оно выталкивается вперед, для битов байтов данных тоже принято соглашение -- младший бит первый. а вот первый байт данных пакета будет самым старшим или самым младшим байтом в пакете, те же вопросы и про остальные поля пакета
SergKT
Доброго времени суток.
Понимаю, что тема давнишняя, но для меня актуальна.
Хотелось-бы собрать HID-клавиатуру на LPC214x.
Облазил инет вдоль и впоперек, для LPC исходников не нашел sad.gif
Понимаю, что главное в этом деле дескриптор.
Нашел исходники для AVR-ок, но вспоминая опыт аналогичного перевода прошлого проекта, становится грустно.
Помогите, может кто уже находил такие исходники для LPC, ткните носом пожалуйста.
kovigor
Цитата(SergKT @ Nov 21 2013, 20:54) *
Понимаю, что главное в этом деле дескриптор.

Я делал такую штуку. Исходники сейчас сходу не найду, но завтра утром надеюсь с этой задачей справиться. Справлюсь и поделюсь. Идет ?
SergKT
Было-бы замечательно.
Спасибо.
kovigor
Цитата(SergKT @ Nov 22 2013, 04:56) *
Было-бы замечательно. Спасибо.

Вот:
http://zalil.ru/34829049
http://zalil.ru/34829068
SergKT
kovigor, спасибище огромное.
Исходник выглядит не привычно, но буду разбираться.
kovigor
Цитата(SergKT @ Nov 23 2013, 23:16) *
Исходник выглядит не привычно, но буду разбираться.

Не за что.
Для меня - привычно. Вместо того, чтобы каждую козявку помещать в свой "хеадер" - файл, я все разместил в одном файле, а именно - в исходнике. Просто, компактно и со вкусом. И очень удобно, если размер получаемого файла не превышает тысячи строк ...
SergKT
kovigor, еще раз спасибо, за исходники.
Разобрался, переделал под свою задачу, заработало.

kovigor
Цитата(SergKT @ Nov 26 2013, 17:00) *
kovigor, еще раз спасибо, за исходники.
Разобрался, переделал под свою задачу, заработало.

Не за что. Приятно было помочь sm.gif
WitFed
Подыму немного тему... Хотя наверняка и не HID-устройство получится, но нужно именно slave запрограммировать, чтобы по USB было видно стандартную флэшку, и с минимальными разборками и треском башки. Отладка всего этого USB в нормальном отладчике -- вещь же невозможная ? Только шажками всё дальше и дальше ?.. И медитировать над стандартами, где же что же и почему может не работать, и никак иначе ?
Нашёл и читал сегодня этот форум и Гука, "USB in a NutShell", вижу: вроде с USB тут много народу на короткой ноге, и никак неохота самому что-то ваять с нуля. В 21 веке мы или где ? К словам "инкапсуляция полиморфизм" Гугль мне сразу добавляет "наследование", но не находит открытых примеров реализаций USB Mass Storage, может текущие санкции так хитры ? wink.gif
Недалеко и на паре других форумов я задавал подобные вопросы, конкретного обратно мало.
Плата имеет крутой 2-ядерный процессор Cortex-A9 (встроенный в ПЛИС) и Линукс, где поднят хост USB, но мы не хотим что-то внешнее на веру, пусть и с кучей неподъёмных исходников, копаем в сторону понятного Baremetal-приложения, с обозримыми кодами, что схоже с контроллерами, и хост USB нам не нужен, только device на внутренней флэши типа FAT32, чтобы периодически подключаться к ПК и выдавать туда логи падежей, принимать новые прошивки ПЛИС и ARM-ов для загрузки по включению... Альтера ничего для USB-работ самому не предоставила (как и с MAC), это же дело тяжёлое не только для нас... wink.gif
Со временем спаяется своя плата с возможно другой периферией, но сейчас нужно прототипировать с контроллером dwc_otg от Синопсисов, те документацию закрыли с год назад, но надеюсь выцепить низкий уровень из Линукс-исходников.. Но сам USB не охота глубоко осваивать, нужно нечто коробочное, чтоб к интерфейсам прикрутил в обе стороны -- и работает !
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.