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

 
 
> USB HID device на SAM7S256, Не получает команды компа
hd44780
сообщение Dec 25 2012, 09:29
Сообщение #1


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

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



Привет всем laughing.gif и с наступающим Новым годом.

Решил разобраться с USB на этом камне, пока в STM32F4 на базе Discovery потихоньку въезжаю rolleyes.gif .
Сделал аналог девайса, в принципе, нормально работающего на меге 8 и USB ObDev. Железка функционально достаточно примитивна - включает-выключает нагрузку ~220в по командам с компа. Плюс разные таймерные навороты типа включить/выключить через указанное время.
Управляющая прога на компе одна и та же, т.к. PID, VID, все команды/ответы и прочее я специально скопировал один-в-один из AVR-овского варианта.

Взял за основу IAR-овский пример usb-device-hid-transfer-project, выкинул из него требуху (моргание светодиодиками, спячку и проч.). Pullup на D+ у меня сейчас фиксированный (ног проца не хватает rolleyes.gif ), поэтому соответствующий ногодрыг тоже нашёл и выкинул.
Прошил, включил - повисло наглухо. Даже часики на дисплее не тикают. Комп, естественно, его не опознал.

Но это уже проходили - виной всему макросы TRACE_XXX, коих там как у собаки блох. Они вызывают printf, которая и виснет. Хотя DBGU включён, сконфигурирован и нормально работает на моих самописных функциях. Короче, все эти TRACE-ы я прикрыл, железяка ожила, комп её увидел и без проблем опознал.
Так что завелось почти с пол-оборота rolleyes.gif .

Следующий этап - реализация функционала.
Написал в main:

Код
    if ( USBD_GetState ( ) < USBD_STATE_CONFIGURED )
      continue;
    
    len = HIDDTransferDriver_Read ( iBuffer, 64 );
    if ( len != 0 )
    { // комп прислал данные
      // выполнение команды
      DoCommand ( );
      
      // отослать ответ
      HIDDTransferDriver_Write ( oBuffer, 64, 0, 0 );
      
      LCD_DrawString ( "Read", 1, 80, 0xFFE0, 0x0000, 1 );  
    } // if

    len = HIDDTransferDriver_ReadReport ( iBuffer, 64 );
    if ( len != 0 )
    { // комп прислал данные
      // выполнение команды
      DoCommand ( );
      
      // отослать ответ
      HIDDTransferDriver_Write ( oBuffer, 64, 0, 0 );
      
      LCD_DrawString ( "Report", 1, 80, 0xFFE0, 0x0000, 1 );  
    } // if


То есть приём того, что прислал комп, выполнение команд и отсылка ответа. DoCommand просто отрабатывает содержимое iBuffer, результат кладёт в oBuffer.
На дисплее строки "Read" и "Report" не появляются, значит в эти if-ы он не попадает.
Вопрос - почему?

Прога на компе шлёт данные через HidD_SetFeature - http://msdn.microsoft.com/ru-ru/library/wi...4(v=vs.85).aspx .
Как я понимааю, должно было в HIDDTransferDriver_ReadReport попасть ....

Все программы, и для МК, и для компа писал сам.
В USB снифферы пока не лазил, не успел sad.gif .

Если надо, могу другие аспекты уточнить.

Спасибо.

PS. Само по себе USB в проце живое. Samba по USB прекрасно работает. Правда я ею не пользуюсь из-за того дурацкого глюка про 100 раз. Шью JTAG через LPT порт.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mempfis_
сообщение Dec 25 2012, 10:15
Сообщение #2


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Посмотрите мой проект HID-MOUS для AT91SAM7S-EK. Может чемто поможет sm.gif
Go to the top of the page
 
+Quote Post



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

 


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


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