|
как передать максимум данных по USB ?, с наибольшей скоростью!!! |
|
|
|
Dec 15 2012, 17:57
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944

|
В описании работы USB в режиме Bulk сказано, что макс. размер пакета 64 байта для этого режима. Мне надо передать 4 К данных. Так как данные передаются фреймами 1 мс, то получается, что на передачу 64 байтов уходит 2 мс (фрейм 1 мс - запрос от хоста, фрейм 1 мс - пакет данных), т.е. на 4096 байтов -128 мс. Другими словами, максимальная реальная скорость передачи данных - 32 К / сек. И это всё, что можно выжать из заявленных 12 Мбит/с для full speed? Явно что-то я не учёл, где ошибка, как на практике передавать данные с максимальной скоростью?
|
|
|
|
|
Dec 15 2012, 18:26
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(NikP @ Dec 15 2012, 21:57)  В описании работы USB в режиме Bulk сказано, что макс. размер пакета 64 байта для этого режима. Это видимо про контрольную точку было сказано, а у той, что данные сливает, должно быть больше. Даже старушка AT90USB647, и та имеет размер буфера под 1-ю end-point до 256 байт. И это, заметьте, в режиме двойного буферования! Т.е. на самом деле там по меньшей мере два таких буфера, что позволяет одному заполняться в то время, пока с другого идет передача. А у современных МК предельный размер буфера должен быть еще больше. Впрочем, про своё железо вы ничего не пишите, а стало быть и обуждать этот вопрос нечего.
|
|
|
|
|
Dec 15 2012, 22:29
|

Местный
  
Группа: Свой
Сообщений: 421
Регистрация: 27-05-05
Из: Энергодар
Пользователь №: 5 480

|
Цитата(NikP @ Dec 15 2012, 19:57)  Так как данные передаются фреймами 1 мс, то получается, что на передачу 64 байтов уходит 2 мс (фрейм 1 мс - запрос от хоста, фрейм 1 мс - пакет данных), т.е. на 4096 байтов -128 мс. А зачем запрос от хоста? Настраиваете канал передачи типа BULK и Хост будет сам ловить ваши данные и запихивать их в буфер потом только успевай их из буфера доставать и новый подсовывать. По крайней мере это так для реализации Хоста типа OHCI. Хост контроллер планирует транзакции в кадре (фрейме) и распределяет полосу. Полоса распределяется следующим образом. Вначале идут до определенного времени непереиодические передачи типа Controlи BULK. Затем передачи прерываний после них изохронные передачи и если еще осталось время в кадре то снова передаем BULK и Control. Другими словами если у вас на хосте висит одно устройство и оно передает только BULK то весь канал будет отдан ему и только ему. Поэтому вы получите Full Speed за минусом накладных расходов на заголовки пакетов и прочее.
|
|
|
|
|
Dec 15 2012, 23:36
|

pontificator
     
Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483

|
Цитата(NikP @ Dec 16 2012, 04:27)  В описании работы USB в режиме Bulk сказано, что макс. размер пакета 64 байта для этого режима. Мне надо передать 4 К данных. Так как данные передаются фреймами 1 мс, то получается, что на передачу 64 байтов уходит 2 мс В течении одного фрейма устройство может передать по балку до 19 пакетов данных, т.е. до 1.2к. Для этого должны выполняться два условия: - Другие устройства, если они есть, молчат и не пытаются передать что-то свое в то же время - Устройство обслуживает запросы быстро. Если устройство замешкается, то планировщик хоста отложит обмен и продолжит его в следующем фрейме. Второе условие является наиболее критическим. Чтобы его выполнить, желательно обрабатывать запросы по прерываниям и использовать двойной буфер ("пинг-понг"), мгновенно подставляя заранее подготовленый пакет.
|
|
|
|
|
Dec 16 2012, 17:08
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944

|
Я делаю устройство на SiLabs C8051F320 (для определённости). В принципе, там есть ЕР3 с буфером 512 байт (можно использовать двойную буферизацию - 2х256). Прошу подсказать , как организуется передача нескольких пакетов за фрейм? И что за это отвечает - драйвер или компьтерная программа , которая работает с устройством? Я считал до сих пор, что передачу инициирует хост своим запросом. В ответ устройство передаёт из In Еndpoint пакет данных объёмом , который задаётся при конфигурировании устройства, т.е. это задаёт программист . И объём этот не может быть больше величины фифо Еndpoint, из которой идёт передача. Или это не так? Задача возникла из того, что сделали систему сбора информации, где 4 К данных собираются за 10 мкс в микросхему памяти. Как то обидно , когда основное время устройство тратит на передачу, а не на сбор и первичную обработку данных. Фирмвару и программу писали по образцу примера, который был приведён фирмой Cygnal (непосредственным разработчиком C8051F320).
Сообщение отредактировал NikP - Dec 16 2012, 17:47
|
|
|
|
|
Dec 16 2012, 21:24
|

pontificator
     
Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483

|
Цитата(NikP @ Dec 17 2012, 03:38)  там есть ЕР3 с буфером 512 байт (можно использовать двойную буферизацию - 2х256). Вот и используйте двойную, режим "пинг-понг". Тогда ваш проц автоматически будет по очереди подставлять буфера по мере поступления запросов. Цитата(NikP @ Dec 17 2012, 03:38)  как организуется передача нескольких пакетов за фрейм? И что за это отвечает - драйвер или компьтерная программа , которая работает с устройством? Хост контроллер. Это организовано на программном и аппаратном уровне, максимально близко к железу. Еще до всяких драйверов, на более низком уровне. Пользователя к этому ни под каким видом не подпускают. Цитата(NikP @ Dec 17 2012, 03:38)  Я считал до сих пор, что передачу инициирует хост своим запросом. В ответ устройство передаёт из In Еndpoint пакет данных объёмом , который задаётся при конфигурировании устройства, т.е. это задаёт программист . И объём этот не может быть больше величины фифо Еndpoint, из которой идёт передача. Или это не так? Это так. Вот только запросов за один фрейм может быть много, на FS - до 19 штук, см. спецификацию USB 2.0 Table 5-9. Full-speed Bulk Transaction Limits. И если устройство в ответ на запрос мгновенно начинает выдавать пакет, то планировщик хоста не выкидывает его из очереди, а перекачивает пакет и дает новый запрос. А пока пакет перекачивается, устройство должно успеть заполнить второй буфер. Если не успеет, то в ответ на очередной запрос хоста оно (т.е. его SIU, тоже на низком уровне, аппаратно) ответит NACK-ом, и планировщик хоста в этом фрейме данных с него больше запрашивать не будет. При 12 Мбит/сек пакет в 64 байта передается за 42.6 мкс. Если ваш девайс жует сопли и не успевает заполнять второй буфер за это время, то вместо 1.2 Мбайт в секунду будете иметь скорость перекачки 64 кбайт в секунду, или даже меньше.
|
|
|
|
|
Dec 19 2012, 02:59
|
Группа: Участник
Сообщений: 5
Регистрация: 2-02-12
Из: г.Саяногорск
Пользователь №: 70 032

|
Цитата(=AK= @ Dec 19 2012, 07:06)  Наверняка это баг в драйвере. А почему сразу баг. Если вы передаёте пакеты по 64 байта, драйвер их собирает и ждёт окончания запросов (неполный пакет или нулевой пакет) если его небудет он заполнит свой буфер (по умолчанию 4к) и только после этого отдаст данные в windows. Данные нужно выставлять на отправку сразу после пакета sof и заканчивать нулевым пакетом в пределах кадра.
|
|
|
|
|
Dec 19 2012, 05:32
|

pontificator
     
Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483

|
Цитата(геннадий75 @ Dec 19 2012, 13:29)  А почему сразу баг. По статистике вообще большинство BSOD происходит из-за багов в драйверах,. А уж когда падает при отладке девайса с каким-то подозрительным драйвером - то уж точно из-за бага в драйвере. Иначе не получишь BSOD. Цитата(геннадий75 @ Dec 19 2012, 13:29)  Если вы передаёте пакеты по 64 байта, драйвер их собирает и ждёт окончания запросов (неполный пакет или нулевой пакет) если его небудет он заполнит свой буфер (по умолчанию 4к) и только после этого отдаст данные в windows. Это где-то описано СиЛабсом, или вы из головы придумываете? Цитата(геннадий75 @ Dec 19 2012, 13:29)  Данные нужно выставлять на отправку сразу после пакета sof и заканчивать нулевым пакетом в пределах кадра. С нормальными драйверами таких ограничений нет. Цитата(NikP @ Dec 19 2012, 14:28)  Мы пробовали передавать пакеты по 128 и 256 байт. Пакеты должны быть того размера, какой прописан в дескрипторе и задан при настройке. Если вы задали 64 байта, то и посылать должны кусками не более 64 байт. Трудно предсказать что произойдет, если вы будете стараться впихнуть пакеты 128 или 256 байт в трубу размером 64 байта. У вас, наверное, в процессоре SIU с ума сходит, после чего и драйвер в конце концов падает. Ведь вы же на FS работаете, а не на HS? На FS максимальный размер пакета 64 байта. При трубе 64 байта вы свой файл 4К должны кусочками по 64 байта закидывать в буфера. Последний кусок должен иметь длину 0 байт, это означает, что транзакция закончена.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|