Передача данных на хост через USB на высокой скорости - PullRequest
1 голос
/ 20 апреля 2011

Я разговариваю с нестандартным лабораторным устройством (маленькая аппаратная штука) через USB-соединение. Как получить данные с лабораторного устройства на максимальной скорости?

Хост - это компьютер под управлением Windows XP, на котором выполняется c-код с использованием libsub-win32 в Visual Studio. Маленькая аппаратная штуковина собирает данные, много данных. Хост может запросить эти данные и затем прочитать их. Все работает просто отлично. Что меня беспокоит, так это скорость, грубая оценка составляет 1 Мбит / с, что далеко от поддержки 4802 Мбит / с USB2. Устройство должно иметь возможность отправлять мне данные как минимум с такой скоростью. У меня практически нет опыта работы с USB и libusb-win32, но я попытался прочитать о них. Хотя я не вижу, где и как изменить какие-либо настройки USB-связи. В спецификации, кажется, есть нечто, называемое микрокадрами на скоростных автобусах. Как я могу их использовать?

Мне не обязательно использовать библиотеку libusb-win32. Есть ли у вас другие рекомендации?

Подробная информация о текущей реализации: Как уже упоминалось выше, я использую libusb-win32 для общения. Вся инициализация скопирована с небольшого примера, включенного в загрузку.

usb_init(); 
...
usb_open();
usb_set_configuration(...);
usb_claim_interface(...);

Затем я говорю (используя usb_bulk_write (...) и usb_bulk_read (...)) с лабораторным устройством и убеждаю его поделиться своими данными со мной, что он и делает. Это дает мне данные кусками по 512 байт. Каждый такой блок читается с использованием usb_bulk_read (...).

Изменить 27 апреля 2011 г .: Похоже, я использую Full Speed, но не High Speed. Как я могу получить высокую скорость? Я неправильно указал какой-либо параметр в файле дескриптора usb? (Да, я использую USB2.0, и устройство должно поддерживать высокую скорость.)


Изменить 17 мая 2011 г .: Сейчас я реализовал связь с помощью winUSB (написал файл .inf и программу на c ++). Преимущество использования WinUSB заключается в том, что он может сказать мне, пытается ли он использовать высокую скорость или нет. И это так, но я все еще не получаю более 11 + -2 Мбит / с. Зачем?

В соответствии с протоколом USB2.0 компьютер должен посылать маркер начала кадра (отправляется каждые мс), что, как я думаю, он выполняет - таким образом, 11 Мбит / с. Но при использовании высокоскоростной передачи он говорит, что «высокоскоростной использует« Микрофрейм », длина которого составляет 125 мкс (8 микрофкадров в миллисекунду). Соответствие нумерации кадров 1 мс поддерживается в высокоскоростных пакетах SOF путем повторения каждого номера кадра в 8 последовательных Microframes «. Я не очень понимаю это, но проблема не в том, чтобы посылать микро-кадры достаточно часто? Может ли кто-то, кто понимает протокол, пожалуйста, просветите меня! Я хочу понять, как это работает, независимо от того, смогу ли я заставить его работать на моем компьютере или нет.


Редактировать 15 июня

Проблема решена: никакие изменения на стороне компьютера не могут сделать обмен данными быстрее, чем он хочет (если вы не изменили количество конечных точек и у вас действительно есть соединение USB2.0). Проблема здесь заключалась в коде процессора, который использовал области памяти очень трудоемким образом. Это делает этот вопрос без вопросов. Спасибо за все указатели и информацию. Я многое узнал о USB!

Ответы [ 3 ]

1 голос
/ 24 апреля 2011

Попробуйте использовать WinUSB официальный драйвер Microsoft, думаю, это поможет. Также вы можете найти примеры того, как его использовать Сайт Яна Аксельсона , в частности эта страница имеет дело с WinUSB В качестве дополнительного аргумента даже LibUSB полагается на WinUSB.

Я хотел бы спросить вас, к какому типу устройств относится ваша лаборатория: HID, CDC и т. Д.? потому что это зависит также от вашего внутреннего устройства. Если это HID (мышь, клавиатура), вы не можете ожидать сверхскорости.

1 голос
/ 02 мая 2011

Вам действительно необходимо проверить, в каком режиме работает ваше USB-устройство. Для этого откройте Диспетчер устройств, а затем перейдите: Вид-> Устройства по соединению.

Теперь вам нужносверните дерево устройств на ваше USB-устройство.Он будет за одним из «Стандартного хост-контроллера USB XYZ».

С XYZ вы можете определить, является ли он высокоскоростным или полным / низким: если XYZ имеет значение « Enhanced PCI to USB», то устройство действительно работает на высокой скорости 480 Мбит / с.Но если хост-контроллером верхнего уровня является «OpenHCD USB» или что-то еще (вероятно, что-то с UHCI, у меня нет платы Intel здесь), устройство работает на полной скорости - максимум 12 Мбит / с.Многие микроконтроллеры «USB 2.0» поддерживают только полноскоростные, а не высокоскоростные.

Обновление

Устройство работает на полной скорости в следующих случаях:

  • Существуетпромежуточный концентратор USB 1.1, который не может говорить на высокой скорости
  • Устройство может говорить только на полной скорости.
0 голосов
/ 21 апреля 2011

Как рассчитать скорость передачи данных?

  1. Либо расчет скорости передачи данных МОЖЕТ не верен, либо
  2. Количество обрабатываемых потоковпередача данных меньше;и, следовательно, скорость меньше.

Я не использовал библиотеку libusb-win32 и не работал углубленно в USB, но эти пункты могут помочь вам найти истинную причину или проблему, если естьодин.

...