Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USB HID device на SAM7S256
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
hd44780
Привет всем 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 порт.
mempfis_
Посмотрите мой проект HID-MOUS для AT91SAM7S-EK. Может чемто поможет sm.gif
hd44780
Спасибо. Скачал.
Посмотрю sm.gif .
hd44780
С наступающим sm.gif

Доколупал я это дело ...
В прошивке проца оказалось всё нормально. Ошибка была в софте компа. Точнее даже не ошибка, а привязка того софта к "особенностям" AVR-USB Obdev. Если совсем точно - в размере конечной точки.... И в репортах.
Отчасти помогла статья - http://microsin.ru/content/view/955/44/ . Тамошние примеры я скачать с долбаного депозита не сумел (не могли чего получше найти, блин sm.gif ), пришлось самому изучать пример HidTest sm.gif . Но и тот оказался слегка "недобитым" - тупо вис на считывании данных из устройства.

Пока заработал только обычный обмен (WinAPI-шные ReadFile/WriteFile), репорты в процессе.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.