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

 
 
> 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, 09:54
Сообщение #2


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

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



Искал - пусто.

Сергей Борщ, хотите прикол?
Было (это единственное объявление данной переменной на весь проект, сидит в том же файле что и код ниже):
Код
__ALIGN_BEGIN uint8_t USB_Rx_Buffer   [MAX_DATA_LENGTH] __ALIGN_END;


Меняю на:
Код
__ALIGN_BEGIN uint8_t SuperMegaBuffer   [MAX_DATA_LENGTH] __ALIGN_END;


, соответственно, в коллбеке приема:
Код
static uint8_t  USBD_HID_DataOut (void  *pdev, uint8_t epnum) {
  uint16_t USB_Rx_Cnt;
  uint8_t i = 0;
  
  USB_Rx_Cnt = ((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count; // pointer to usb packet

  USB_Rx_Buffer[0] = 0x01;
  TM_USB_HIDDEVICE_SendCustom(USB_Rx_Buffer, 65);

  DCD_EP_PrepareRx(pdev, HID_OUT_EP, USB_Rx_Buffer, MAX_DATA_LENGTH);
  return USBD_OK;
}


меняю на:
Код
static uint8_t  USBD_HID_DataOut (void  *pdev, uint8_t epnum) {
  uint16_t USB_Rx_Cnt;
  uint8_t i = 0;
  
  USB_Rx_Cnt = ((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count; // pointer to usb packet
  
  SuperMegaBuffer[0] = 0x01;
  TM_USB_HIDDEVICE_SendCustom(SuperMegaBuffer, 65);
  
  DCD_EP_PrepareRx(pdev, HID_OUT_EP, SuperMegaBuffer, MAX_DATA_LENGTH);
  return USBD_OK;
}


и все, больше ничего и нигде не трогаю. И что же я вижу? А то, что чудесным, мать его, образом - в SuperMegaBuffer оказываются принятые данные. КАААК?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 27 2015, 11:53
Сообщение #3


Гуру
******

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



Цитата(ilkz @ Aug 27 2015, 12:54) *
КАААК?

Видимо как-то отсюда:
Цитата(ilkz @ Aug 27 2015, 12:54) *
Код
  TM_USB_HIDDEVICE_SendCustom(USB_Rx_Buffer, 65);
Тут же вы передаете адрес этого буфера стеку. Копайте эту функцию.


--------------------
На любой вопрос даю любой ответ
"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
сообщение Aug 27 2015, 13:18
Сообщение #4


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

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



Цитата(Сергей Борщ @ Aug 27 2015, 14:53) *
Видимо как-то отсюда:
Тут же вы передаете адрес этого буфера стеку. Копайте эту функцию.


Весь цимес в том, что если убрать строки
Код
  TM_USB_HIDDEVICE_SendCustom(USB_Rx_Buffer, 65);
  DCD_EP_PrepareRx(pdev, HID_OUT_EP, USB_Rx_Buffer, MAX_DATA_LENGTH);


,то волшебный буфер все равно оказывается заполнен принятыми данными )))
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, 06:24
|- - Сергей Борщ   Цитата(ilkz @ Aug 27 2015, 09:06) 1. Если...   Aug 27 2015, 06:25
|- - 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, 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 Текстовая версия Сейчас: 23rd July 2025 - 04:08
Рейтинг@Mail.ru


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