
Решил разобраться с USB на этом камне, пока в STM32F4 на базе Discovery потихоньку въезжаю

Сделал аналог девайса, в принципе, нормально работающего на меге 8 и USB ObDev. Железка функционально достаточно примитивна - включает-выключает нагрузку ~220в по командам с компа. Плюс разные таймерные навороты типа включить/выключить через указанное время.
Управляющая прога на компе одна и та же, т.к. PID, VID, все команды/ответы и прочее я специально скопировал один-в-один из AVR-овского варианта.
Взял за основу IAR-овский пример usb-device-hid-transfer-project, выкинул из него требуху (моргание светодиодиками, спячку и проч.). Pullup на D+ у меня сейчас фиксированный (ног проца не хватает

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

Следующий этап - реализация функционала.
Написал в 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
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 снифферы пока не лазил, не успел

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