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

 
 
> Generic Usb Hid Device На Stm32F4Discovery, Не передаются данные
hd44780
сообщение Jan 15 2013, 12:35
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Привет всем .

Озаботился тут созданием USB HID устройства на данном проце.
Находил с интернете массу примеров HID устройств, эмулирующих джойстики, мыши, клавиатуры, пульты ДУ и прочую дребедень... Но мне не нужны все эти клавиатуры, джойстики и пульты ....

Нужно Generic устройство - принять от компа 64 байта, отправить в комп 64 байта. И всё.

Такой пример я нашёл только один - http://we.easyelectr...4-discovey.html , как пишет автор, на основе примера от более младших STM32. Этот пример включает/выключает светодиодики платы по команде с компа и шлёт в комп данные, когда нажимают кнопку. Это работает.
Но у него размер и входящего и исходящего блока данных - 2 байта вместо доступных 64 (видимо автор память экономит, ему почти 200 кил RAM этого камня мало wacko.gif ) - форменное издевательство короче .

Решил я его пример переделать. Поменял VID, PID, чтобы моя прога его увидела, нашёл дескриптор конфигурации, исправил 2 макроса, описывающих размеры конечных точек, прошил. Работоспособность лампочек и кнопки не нарушилась, моя прога ими исправно управляет, на кнопку реагирует, но чтение свойств устройства показывает InputReportByteLength=OutputReportByteLength=2, т.е. размер репортов не изменился.

Нашёл я HID дескриптор, изменил его. Убрал описания кнопок, лампочек, оставил только описания входного и выходного репортов.
Получилось следующее:

CODE

#define CUSTOMHID_SIZ_REPORT_DESC 32

........................

__ALIGN_BEGIN static uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] __ALIGN_END =
{
// Global Usage Page - Vendor-defined
0x06, 0xFF, 0x00, // USAGE_PAGE (0xFF00)

// Collection: Application
0x09, 0xFF, // USAGE (vendor defined)
0xA1, 0x01, // COLLECTION (Application)

// Input report: Vendor-defined
0x09, 0xFF, // USAGE (vendor defined)
0x95, HID_IN_PACKET, // REPORT_COUNT = 64 - Размер конечной точки
0x75, 8, // REPORT_SIZE = 8
0x15, (unsigned char) -128, // 0x15,
0x25, (unsigned char) 127, // 0x25,
0x81, 0,
// Output report: vendor-defined
0x09, 0xFF, // USAGE (vendor defined)
0x95, HID_OUT_PACKET, // REPORT_COUNT = 64 - Размер конечной точки
0x75, 8, // REPORT_SIZE = 8
0x15, (unsigned char) -128, // 0x15
0x25, (unsigned char) 127, // 0x25
0x91, 0, //

0xC0 // End collection
}; // CustomHID_ReportDescriptor


Устройство опознаётся, винда не ругается, но чтение свойств даёт InputReportByteLength=OutputReportByteLength=65 (!) и все попытки что-либо послать в железяку даёт ошибку 87 - Invalid Parameter. Хоть и шлю я ему 2 байта ...
На чтении тупо виснет без каких-либо ошибок. Прогу приходится диспетчером задач вырубать.

Сильно подозреваю, что западло заключено в этих 65 байтах и сидит оно в HID дескрипторе, но не пойму что именно там не так.
Сам по себе HID дескриптор вроде правильный, на древнейшем AT91SAM7S256 2006 года выпуска работает с песнями .

Помогите пожалуйста, кто может.
Спасибо.

ЗЫ.
Утилиту HID Descriptor Tool 13-летней давности видел, знаю, но вот никак за эти 13 лет не врублюсь, что там к чему. То ли я идиот, то ли писали её идиоты . К тому же вылетает она с какими-то сбоями типа "Can't read memory at address 0x00000000" ....

Можно, конечно, сделать CDC, проэмулировать COM-порт (кстати делал, работает sm.gif ), это может и лучше с т.з. быстродействия, но не хочется, чтобы железка торчала в списке портов.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post



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

 


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


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