Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 09.02.2021, 09:42  
worldmasters
Гражданин KAZUS.RU
 
Регистрация: 21.02.2007
Сообщений: 551
Сказал спасибо: 37
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
worldmasters на пути к лучшему
По умолчанию STM32_HID Windows 10 Low Speed

Здравствуйте.
Есть устройство на STM32. Реализовал на нем CustomHID.
Требуется получать данные с датчиков не менее чем 200 раз в секунду.

Размер пакета 32 байта, В дескрипторе прописал максимальный размер отправляемого пакета тоже 32.
Интервал опроса в дескрипторе также указал 2 то есть каждые 2 мс.

каждый 4 мс выполняю опрос датчиков по спи и отправку пакета на комп:

Код:
while (1) {
		HAL_Delay(4);
// опрос датчиков
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, dataToSend, USBD_CUSTOMHID_OUTREPORT_BUF_SIZE);
}
Со стороны компа запускаю поток с чтением порта через стандартные функции WinApi

Код:
 while (!StopProces)
{
Thread.Sleep(2);
if (WinApi.ReadReport(device, data, DevCapatibylity, ref readed))
{
// разбор пакета и вывод в блоки
}
}
На Windows7 все работает как часы. Стабильно 200 пакетов в сек я получают.
Но на Windows 10 все по какой то причине начинает тормозить и комп регистрирует всего 60 пакетов в секунду. Уже отключали всякие спящие режимы, экономии энергии.. но это как пляски с бубном. В каких то случаях непонятные действия дают успешный исход и получаем нужные 200 пакетов, в других случаях ничего не выходит и стабильно всегда не более 60.

В чем может быть проблема?? Может где то в дескрипторе нужно прописать что устройство требует максимальной скорости или какая нибудь компонента винды тупит. Подскажите если кто знает куда копать?? Что может быть не так то??



Код:
/* USB CUSTOM_HID device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
  0x09, /* bLength: Configuration Descriptor size */
  USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
  USB_CUSTOM_HID_CONFIG_DESC_SIZ,
  /* wTotalLength: Bytes returned */
  0x00,
  0x01,         /*bNumInterfaces: 1 interface*/
  0x01,         /*bConfigurationValue: Configuration value*/
  0x00,         /*iConfiguration: Index of string descriptor describing
  the configuration*/
  0xC0,         /*bmAttributes: bus powered */
  0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/
  
  /************** Descriptor of CUSTOM HID interface ****************/
  /* 09 */
  0x09,         /*bLength: Interface Descriptor size*/
  USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/
  0x00,         /*bInterfaceNumber: Number of Interface*/
  0x00,         /*bAlternateSetting: Alternate setting*/
  0x02,         /*bNumEndpoints*/
  0x03,         /*bInterfaceClass: CUSTOM_HID*/
  0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
  0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
  0,            /*iInterface: Index of string descriptor*/
  /******************** Descriptor of CUSTOM_HID *************************/
  /* 18 */
  0x09,         /*bLength: CUSTOM_HID Descriptor size*/
  CUSTOM_HID_DESCRIPTOR_TYPE, /*bDescriptorType: CUSTOM_HID*/
  0x11,         /*bCUSTOM_HIDUSTOM_HID: CUSTOM_HID Class Spec release number*/
  0x01,
  0x00,         /*bCountryCode: Hardware target country*/
  0x01,         /*bNumDescriptors: Number of CUSTOM_HID class descriptors to follow*/
  0x22,         /*bDescriptorType*/
  USBD_CUSTOM_HID_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
  0x00,
  /******************** Descriptor of Custom HID endpoints ********************/
  /* 27 */
  0x07,          /*bLength: Endpoint Descriptor size*/
  USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/
  
  CUSTOM_HID_EPIN_ADDR,     /*bEndpointAddress: Endpoint Address (IN)*/
  0x03,          /*bmAttributes: Interrupt endpoint*/
  CUSTOM_HID_EPIN_SIZE, /*wMaxPacketSize: 32 Byte max */
  0x00,
  0x02,          /*bInterval: Polling Interval (2 ms)*/
  /* 34 */
  
  0x07,	         /* bLength: Endpoint Descriptor size */
  USB_DESC_TYPE_ENDPOINT,	/* bDescriptorType: */
  CUSTOM_HID_EPOUT_ADDR,  /*bEndpointAddress: Endpoint Address (OUT)*/
  0x03,	/* bmAttributes: Interrupt endpoint */
  CUSTOM_HID_EPOUT_SIZE,	/* wMaxPacketSize: 32 Bytes max  */
  0x00,
  0x02,	/* bInterval: Polling Interval (2 ms) */
  /* 41 */
} ;

Дескриптор отчетов взял с какого то официального примера возможно что и в нем что то не так, но собрать свой дескриптор под работу с простым буфером в 32 байта я не сумел. (((
К тому же с этим дескриптором на версиях младше 10 все успешно функционирует.
Код:
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
		/* USER CODE BEGIN 0 */
		    0x06, 0x00, 0xff,              // 	USAGE_PAGE (Generic Desktop)
		    0x09, 0x01,                    // 	USAGE (Vendor Usage 1)
		    // System Parameters
		    0xa1, 0x01,                    // 	COLLECTION (Application)
		    0x85, 0x01,                    //   REPORT_ID (1)
		    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
		    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
		    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
		    0x75, 0x08,                    //   REPORT_SIZE (8)
		    0x95, 0x1F,    				   //   REPORT_COUNT (63)
		    0xb1, 0x82,                    //   FEATURE (Data,Var,Abs,Vol)
		    0x85, 0x01,                    //   REPORT_ID (1)
		    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
		    0x91, 0x82,                    //   OUTPUT (Data,Var,Abs,Vol)

		    0x85, 0x02,                    //   REPORT_ID (4)
		    0x09, 0x02,                    //   USAGE (Vendor Usage 4)
		    0x75, 0x08,                    //   REPORT_SIZE (8)
		    0x95, 0x1F, 	               //   REPORT_COUNT (63)
		    0x81, 0x82,                    //   INPUT (Data,Var,Abs,Vol)
		  /* USER CODE END 0 */
		  0xC0    /*     END_COLLECTION	             */
};
Реклама:
worldmasters вне форума  
Непрочитано 09.02.2021, 10:21  
DanilinSA
Почётный гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,671
Сказал спасибо: 130
Сказали Спасибо 1,074 раз(а) в 517 сообщении(ях)
DanilinSA на пути к лучшему
По умолчанию Re: STM32_HID Windows 10 Low Speed

Вопросы:
1) Откуда брался код для исходника? Откуда взяты драйвера для CUSTOM_HID. Они точно без странностей?
2) Попробуй сменить VID PID. Возможно в W10 произошло наложение адресов на существующее в его базе.
3) Ради интереса попробуй сменить комп. Часто на "замусоренном" компе наблюдаются очень странные эффекты. Данный эффект наблюдается только на этом компе или проблема системная?
4) Ради интереса попробуйте проставить сканнер USB (программный) и попробовать отследить место возникновения проблемы.
DanilinSA вне форума  
Непрочитано 09.02.2021, 10:24  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,447
Сказал спасибо: 96
Сказали Спасибо 318 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: STM32_HID Windows 10 Low Speed

Ну если 200 раз в сек, то интервал опроса должен быть 5, а не 2.
У вас 2 конечные точки: IN и OUT. Возможно, что 1 из них тормозит вторую?
Не знаю, как реализован протокол USB в STM32, но задержек в отправке быть не должно.
Если пришёл запрос данных от хоста к конкретной конечной точке, МК должен их сразу же отдать, иначе на стороне компа будет ожидание.
У вас один FEATURE репорт - зачем вам использовать REPORT_ID.
Тем более, REPORT_ID для входных и выходных точек.
Да и поле INTERVAL не задаёт частоту опроса, а лишь информирует о максимальной задержке (для INTERRUPT ENDPOINT).

Последний раз редактировалось Godzilla82; 09.02.2021 в 10:38.
Godzilla82 вне форума  
Непрочитано 09.02.2021, 11:19  
worldmasters
Гражданин KAZUS.RU
 
Регистрация: 21.02.2007
Сообщений: 551
Сказал спасибо: 37
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
worldmasters на пути к лучшему
По умолчанию Re: STM32_HID Windows 10 Low Speed

Сообщение от DanilinSA Посмотреть сообщение
Вопросы:
1) Откуда брался код для исходника? Откуда взяты драйвера для CUSTOM_HID. Они точно без странностей?
Драйвера стандартные в винде. Код исходника сам писал.

Сообщение от DanilinSA Посмотреть сообщение
Вопросы:
2) Попробуй сменить VID PID. Возможно в W10 произошло наложение адресов на существующее в его базе.
Так компы то чистые.

Сообщение от DanilinSA Посмотреть сообщение
Вопросы:
3) Ради интереса попробуй сменить комп. Часто на "замусоренном" компе наблюдаются очень странные эффекты. Данный эффект наблюдается только на этом компе или проблема системная?
Меняли. 7 - стабильно, 10 - кривая.

Сообщение от DanilinSA Посмотреть сообщение
Вопросы:
4) Ради интереса попробуйте проставить сканнер USB (программный) и попробовать отследить место возникновения проблемы.
Попробуем.


Сообщение от Godzilla82 Посмотреть сообщение
Ну если 200 раз в сек, то интервал опроса должен быть 5, а не 2.
Хм.. верно ..

Сообщение от Godzilla82 Посмотреть сообщение
У вас 2 конечные точки: IN и OUT. Возможно, что 1 из них тормозит вторую?
Не знаю, как реализован протокол USB в STM32, но задержек в отправке быть не должно.
Если пришёл запрос данных от хоста к конкретной конечной точке, МК должен их сразу же отдать, иначе на стороне компа будет ожидание.
Да вроде у чипа свой генератор частоты. Почему проблема не возникает на семерке?? Там данных то очень мало опрос быстрый.
С задержками попробую поиграть..


Сообщение от Godzilla82 Посмотреть сообщение
У вас один FEATURE репорт - зачем вам использовать REPORT_ID.
Тем более, REPORT_ID для входных и выходных точек.
Да и поле INTERVAL не задаёт частоту опроса, а лишь информирует о максимальной задержке (для INTERRUPT ENDPOINT).
Без идентификаторов пакеты не принимаются и не отправляются. Возможно что надо пересобрать дескриптор но я написал что не удалось. КОвырял по всякому и в итоге выбрал то что точно работает. Если подкинете готовый рабочий дескриптор для приема передачи пакета в 32 байта буду благодарен.
worldmasters вне форума  
Непрочитано 09.02.2021, 11:29  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,447
Сказал спасибо: 96
Сказали Спасибо 318 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: STM32_HID Windows 10 Low Speed

А вам надо и на приём 32 байта и на передачу 32 байта?
Запрос-ответ не интересует? Чисто обмен FEATURE репортами.
Godzilla82 вне форума  
Непрочитано 09.02.2021, 11:32  
worldmasters
Гражданин KAZUS.RU
 
Регистрация: 21.02.2007
Сообщений: 551
Сказал спасибо: 37
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
worldmasters на пути к лучшему
По умолчанию Re: STM32_HID Windows 10 Low Speed

Сообщение от Godzilla82 Посмотреть сообщение
А вам надо и на приём 32 байта и на передачу 32 байта?
Запрос-ответ не интересует? Чисто обмен FEATURE репортами.
Основная работа это передача данных на комп. Периодически комп может передать управляющий запрос для включения некоторого оборудования. Или подстройки некоторых регистров.
worldmasters вне форума  
Непрочитано 09.02.2021, 11:35  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,447
Сказал спасибо: 96
Сказали Спасибо 318 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: STM32_HID Windows 10 Low Speed

когда есть IN и/или OUT - это означает, что каждый раз (каждую миллисекунду зависит от INTERVAL) передаётся пакет. И его на стороне контроллера надо передать и/или принять.
Вам нужно передавать от компа также 32 байта, или достаточно 8?
Godzilla82 вне форума  
Непрочитано 09.02.2021, 11:42  
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,330
Сказал спасибо: 85
Сказали Спасибо 596 раз(а) в 361 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: STM32_HID Windows 10 Low Speed

Возможная проблема в том, что "Thread.Sleep(2);" в винде будет давать задержку от 0 до 30 мс. Раз на раз не будет приходиться. Sleep имеет смысл использовать при задержках от 20 и выше мс. Там дикая погрешность, миллисекунд 20. В подзадаче делайте свою задержку. Или просто читайте данные без задержки. В этом случае, насколько помню может быть синхронное чтение (поток будет ожидать поступление данных) или асинхронное, с выдачей кода ошибки.
pambaru вне форума  
Непрочитано 09.02.2021, 12:32  
worldmasters
Гражданин KAZUS.RU
 
Регистрация: 21.02.2007
Сообщений: 551
Сказал спасибо: 37
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
worldmasters на пути к лучшему
По умолчанию Re: STM32_HID Windows 10 Low Speed

Сообщение от Godzilla82 Посмотреть сообщение
когда есть IN и/или OUT - это означает, что каждый раз (каждую миллисекунду зависит от INTERVAL) передаётся пакет. И его на стороне контроллера надо передать и/или принять.
Вам нужно передавать от компа также 32 байта, или достаточно 8?
Ну на будущее мало ли нужно будет 32.. чтобы в МК буферы особо не менять.

Сообщение от pambaru Посмотреть сообщение
Возможная проблема в том, что "Thread.Sleep(2);" в винде будет давать задержку от 0 до 30 мс. Раз на раз не будет приходиться. Sleep имеет смысл использовать при задержках от 20 и выше мс. Там дикая погрешность, миллисекунд 20. В подзадаче делайте свою задержку. Или просто читайте данные без задержки. В этом случае, насколько помню может быть синхронное чтение (поток будет ожидать поступление данных) или асинхронное, с выдачей кода ошибки.
У меня синхронное чтение. Но мне желательно чтобы данные шли с максимально стабильным интервалом. А то если там будут пляски от 100 фпс до 300 тоже не совсем хорошо.
worldmasters вне форума  
Непрочитано 09.02.2021, 13:31  
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,330
Сказал спасибо: 85
Сказали Спасибо 596 раз(а) в 361 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: STM32_HID Windows 10 Low Speed

Сообщение от worldmasters Посмотреть сообщение
У меня синхронное чтение. Но мне желательно чтобы данные шли с максимально стабильным интервалом. А то если там будут пляски от 100 фпс до 300 тоже не совсем хорошо.
Тогда Sleep вообще убрать, зачем он там нужен.
И стабильность будет определяться только железом - частотой отправки пакетов.
pambaru вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ускорить компьютер 7Fantomas7 Ремонт оргтехники 111 08.08.2018 05:27
Программирование программатором STERH 007 PIC микроконтроллеров ispitatel1 Песочница (вопросы новичков) 4 17.04.2017 17:18
Виндовс 8 Caxaroza Ремонт оргтехники 322 28.10.2013 00:12
Видеоуроки, видеообзоры, видеоинструкции... Kroom73 Делимся опытом 39 19.06.2011 15:41
Техногенная катастрофа и что с ней теперь делать VOVOKA Отвлекитесь, эмбеддеры! 122 05.01.2011 19:23


Часовой пояс GMT +4, время: 07:44.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot