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

 
 
> STM32F4Discovery USB_HID, посылка данных в PC, непонятки
ilkz
сообщение Aug 26 2015, 09:16
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 135
Регистрация: 9-09-11
Пользователь №: 67 084



Добрый день!

Понадобилось организовать обмен данными стмки с пк на основе USB_HID.
За основу взял темплейт от TM с его либами.

В целом, туда-сюда пакетики бегают, но есть несколько крайне непонятных для меня моментов:
1. Коллбек USBD_HID_DataOut. Насколько я понял, прием данных происходит именно в нем. Но откуда достать сами данные? Во всех примерах используют переменную USB_Rx_Buffer, которая объявляется в том же файле. Но она нигде не заполняется, а при попадании в коллбек данные в ней чудесным образом оказываются. Как так?

2. Непонятно поведение: если буфер объявить внутри коллбека, то вместо значений из буфера отсылается мусор. Если же объявление сделать глобальным, то отсылаются верные значения. Почему так?

3. В коллбек вписана отправка ответного пакета. Но иногда (в основном после включения) ответный пакет отсылается лишь с 3-го раза. Почему такое может возникать?

Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ilkz
сообщение Aug 27 2015, 06:24
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 135
Регистрация: 9-09-11
Пользователь №: 67 084



Опа-ля, йа креведко розобралсо.

Дело было вот в чем:
1. Если мы хотим отправить N Байт, то реально надо отправить на 1 байт больше, т.е. N+1.
2. В дескрипторе репорта должно быть указано количество отправляемых элементов (REPORT_COUNT) равное N.
3. Первым байтом в отправляемых данных должен быть REPORT ID.
4. И усё.

Теперь понятны слова Golikov A. про 65 байт.

Осталось понять кто заполняет USB_Rx_Buffer.

Сообщение отредактировал ilkz - Aug 27 2015, 06:24
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 27 2015, 06:25
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(ilkz @ Aug 27 2015, 09:06) *
1. Если мы хотим отправить N Байт, то реально надо отправить на 1 байт больше, т.е. N+1.
....
Теперь понятны слова Golikov A. про 65 байт.
Вы поняли неправильно. Конечная точка имеет ограничение на длину пакета. В вашем случае оно равно 64 байта. Если вам нужно передать больше - вы передаете несколько пакетов. Но как вторая сторона определит, что вы уже закончили передачу? А очень просто: если пришел пакет с длиной, меньшей, чем максимальная длина для этой рабочей точки, то он последний. А что делать, если вам надо передать ровно столько данных, какова максимальная длина пакета? Получив такой пакет вторая сторона будет ждать продолжения. Поэтому передающая в этом и только в этом случае посылает следом пакет с нулевой длиной, т.е. без данных (zlp, zero-length payload). Но это все внутренние дела стека., вас они волновать не должны.

REPORT ID - это совсем другая опера. Если вы в дескрипторах сообщили, что будете отсылать несколько разных типов сообщений (reports), то вы должны в начале каждого передавать дополнительный байт с идентификатором. Если вы анонсировали только один вид сообщений, то второй стороне не нужно отделять его от других и этот байт с идентификатором не передается.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ilkz   STM32F4Discovery USB_HID, посылка данных в PC   Aug 26 2015, 09:16
- - Kabdim   1. Очевидно её заполняет обработчик прерывний USB ...   Aug 26 2015, 10:55
|- - ilkz   Цитата(Kabdim @ Aug 26 2015, 13:55) 1. Оч...   Aug 26 2015, 11:39
- - Golikov A.   64 байта - граница пакета, должна быть снабжена пу...   Aug 26 2015, 16:39
|- - ilkz   Цитата(Golikov A. @ Aug 26 2015, 19:39) 6...   Aug 27 2015, 04:50
|- - ilkz   Цитата(Сергей Борщ @ Aug 27 2015, 09:25) ...   Aug 27 2015, 06:39
|- - Сергей Борщ   Цитата(ilkz @ Aug 27 2015, 09:39) Со втор...   Aug 27 2015, 08:13
- - ilkz   Сергей Борщ, ясно. Последний пока что вопрос: кто...   Aug 27 2015, 09:05
|- - Сергей Борщ   Цитата(ilkz @ Aug 27 2015, 12:05) Последн...   Aug 27 2015, 09:39
- - ilkz   Искал - пусто. Сергей Борщ, хотите прикол? Было (...   Aug 27 2015, 09:54
|- - Сергей Борщ   Цитата(ilkz @ Aug 27 2015, 12:54) КАААК? ...   Aug 27 2015, 11:53
|- - ilkz   Цитата(Сергей Борщ @ Aug 27 2015, 14:53) ...   Aug 27 2015, 13:18
|- - Сергей Борщ   Цитата(ilkz @ Aug 27 2015, 16:18) Весь ци...   Aug 27 2015, 17:25
- - Golikov A.   Там данные из USB не по ДМА заполняются? Вы где т...   Aug 28 2015, 03:15
- - ilkz   Думаю, это единственное логичное объяснение. Но мн...   Aug 28 2015, 06:28


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 05:04
Рейтинг@Mail.ru


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