реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> USB Host STM32F4, Как правильно принимать пакеты длиннее размера endpoint
uriy
сообщение Feb 15 2017, 08:31
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 328
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Пишу USB хост для работы с чистымии булками.
Решил делать на HAL, без CubeMX у меня бы ушло на хост очень много времени.
Устройство USB клиент имеет по одному IN и OUT endpoint по 64 байта.
Обмен уже налажен но есть нюансы.
Многие пакеты верхнего протокола имеют длину больше 64 байт.
Функция передачи из хоста к клиенту USBH_DMR_Transmit дробит посылку как надо на пакеты размером не более 64 байт.

Функция приема USBH_DMR_Receive никогда не возращает массив более 64 байт.
Если я вызываю USBH_DMR_Receive несколько раз то корректно получаю весь длинный пакет сформированный из пачек по 64 байта.
В первом пакете в протоколе верхнего уровня есть длина посылки. Анализируя ее я могу посчитать сколько раз вызывать USBH_DMR_Receive. И раньше я не встречал упоминаний о том что по USB передается длина посылки.
На сколько знаю признаком конца посылки является пакет длиной менее размера endpoint.

Есть ли способ узнать сколько байт послал клиент? USB хост пишу впервые. Еще многое не понятно.
Go to the top of the page
 
+Quote Post
controller_m30
сообщение Feb 15 2017, 13:09
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 294
Регистрация: 24-02-09
Пользователь №: 45 309



Цитата(uriy @ Feb 15 2017, 11:31) *
В первом пакете в протоколе верхнего уровня есть длина посылки. Анализируя ее я могу посчитать сколько раз вызывать USBH_DMR_Receive. И раньше я не встречал упоминаний о том что по USB передается длина посылки.
На сколько знаю признаком конца посылки является пакет длиной менее размера endpoint.

Есть ли способ узнать сколько байт послал клиент? USB хост пишу впервые. Еще многое не понятно.

В смысле? Требуется информация по функции USBH_DMR_Receive, чтоб в случае приёма пакета длиной менее 64 байт, она возвращала число фактически принятых байт в последнем пакете?
Или нужно узнать общее количество байт во всех пакетах, принятых через этот endpoint? Типа длину файла, который ПО верхнего уровня в клиенте отправило в сторону Хоста по USB?
Go to the top of the page
 
+Quote Post
uriy
сообщение Feb 15 2017, 15:00
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 328
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Нет.
1. Клиент отправляет на хост посылку в 500 байт. Есть ли средства узнать длину посылки после принятия только первого пакета в 64 байта? Передается ли по USB длина посылки?
2. В каком регистре в STM32F4 можно считать информацию о длине этой посылки?
Go to the top of the page
 
+Quote Post
controller_m30
сообщение Feb 15 2017, 18:30
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 294
Регистрация: 24-02-09
Пользователь №: 45 309



1. По USB такая информация не передаётся. Контроллер знает только длину принимаемых пакетов в пределах длины endpoint.
2. Есть буфер endpoint-a (например 64 байт), и регистр, из которого при завершении приёма данных можно прочитать, сколько байт было только что принято (0-64 байта).

Для сопровождения пакетов более подробной информацией, используются протоколы верхнего уровня.
Например для Mass Storage Device (флешки, HDD, CD-ROM и проч.), через endpoint-ы 1-7 (IN и OUT) - "гоняется" протокол SCSI. С помощью этого протокола пересылаются блоки данных, каждый из которых "обрамлён" вначале и в конце специальными полями CBW и CSW, по которым можно заранее узнать длину каждого такого блока, и достоверно определить завершение его приёма-передачи.
Пример, "Mass Storage Class, Bulk-Only Transport" USB MSC Bulk
Но и в этом случае, из заголовков CBW можно узнать только длину отдельных блоков, но не общую длину файла, которая известна только операционной системе.

Например из флешки читается тело MP3 файла, размер которого 10 Мбайт, но делается это блоками по 4096 байт каждый. В заголовках CBW будет сообщаться что блоки по 4096 байт. Но сколько таких блоков, и какова общая длина файла - знает только операционная система, которая заранее прочитала заголовок файла в корневом каталоге флешки laughing.gif
Go to the top of the page
 
+Quote Post
uriy
сообщение Feb 16 2017, 04:28
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 328
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Мне нужна длина только отдельных блоков. Значит ее нужно анализировать в моем протоколе верхнего уровня. Ок.
Общая длина файла мне не нужна, лишь размер отдельного блока.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th December 2017 - 15:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01247 секунд с 7
ELECTRONIX ©2004-2016