#usb #protocols #pic #hid
#usb #протоколы #рис #hid
Вопрос:
Я смог создать рабочий стек HID USB на моей плате «StartUSB для PIC» для микроконтроллера 18F2550. Я основал его на одной из библиотек MLA, которая была создана для 18F45K50 (MLA 2018_11_26, hid_custom, picdem_fs_usb_k50.x), но я переделал его для работы с 18F2550 (возможно, были более простые способы, но я научился работать с PIC только около 1 месяца назад). На стороне хоста я использую LibUsbDotNet (также здесь могут быть более простые способы — документация по этой библиотеке действительно отстой) на компьютере с Windows 10.
Я использую класс HID, на полной скорости, и, похоже, все работает. Хотя я получаю некоторые случайные ошибки на главном компьютере (см. Ниже), но выполнение одного цикла закрытия / повторного открытия на стороне хоста при получении ошибки является своего рода решением. Грязно, но это работает. Так что я как бы игнорирую это сейчас.
Ошибка Win32Error: ошибка Win32Error: GetOverlappedResult Ep 0x01
995: операция ввода-вывода была прервана либо из-за выхода из потока, либо из-за запроса приложения.
Я не эксперт по USB (пока). Но все примеры, которые я вижу, основаны на том, что 1) сначала вы отправляете команду на устройство и 2) затем вы получаете ответ от устройства. Я провел несколько тестов производительности и вижу, что это действительно показывает, что я могу выполнять около 500 циклов в секунду. Я думаю, что это правильно, потому что каждый цикл отправки команды и получения ответа занимает 1 мс.
Но действительно ли мне нужно отправлять команду?Разве я не могу просто продолжать читать бесконечно, и когда устройству есть что сказать, оно отправляет данные в транзакции IN, а когда нет, оно игнорирует, что создает тайм-аут на стороне хоста. Это означало бы, что я могу опрашивать со скоростью 1000 циклов в секунду? К сожалению, я попробовал это, изменив свою реализацию на РИС., но я получаю очень странные результаты. Я думаю, что у меня проблемы с режимом приостановки. Это подводит меня к другому вопросу — как я могу заставить устройство выйти из режима ожидания (означает, что не хост, а устройство должно запускать это событие). Я искал в библиотеке MLA такие команды, как «пробуждение», «возобновление», … но ничего не смог найти.
Итак, подводя итог, 2 вопроса:
- Концептуальный: могу ли я отправлять данные с устройства на хост, не запрашивая их командой с хоста?
- Для экспертов PIC: Как я могу запустить устройство для выхода из режима ожидания?
Комментарии:
1. В USB каждая передача инициируется с хоста, поэтому ответ на первый вопрос — нет.
2. Да, передача инициируется с хоста, но нет необходимости сначала отправлять команду. Хост будет опрашивать все конечные точки один раз каждые 1 мс. Если конечная точка имеет доступные данные и является конечной точкой массового доступа, хост немедленно опросит конечную точку, если позволяет пропускная способность.
Ответ №1:
И действительно, ответ «Да» на первый вопрос.
Тем временем я нашел в Интернете другую ссылку, которая содержит реализацию библиотеки USB Visual Studio C #, включая все исходные файлы.
Если вам интересно, вот ссылка
Эта реализация хоста на C # работает как шарм. Без отправки команды на устройство я немедленно получаю уведомление при нажатии кнопки. Отлично!
Это также доказывает, что моя более ранняя реализация устройства, основанная на оригинальном MicroChip MLA, на 100% верна. Я протестировал реализацию, отправив «команду переключения светодиодов» так быстро, как только мог, и я достигаю 1000 команд в секунду. Снова отлично!
Я думаю, что LibUsbDotNet не так уж и совершенен. Как я писал выше, я получаю довольно нестабильную связь (ошибка Win32Error). Но при такой реализации я не получаю ни одной ошибки, даже после работы в течение получаса при 1000 командах в секунду.
Итак, для меня дело закрыто.