STM32 и USB (практика)

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: STM32 и USB (практика)

Сообщение COKPOWEHEU »

NVIC_ClearPendingIRQ(_IRQNumber);
А это зачем? У меня такого нет.
if(_Ep0::Reg::Get() & USB_EP_CTR_RX)
{
_Ep0::ClearCtrRx();
Я сбрасываю этот флаг по выходу из прерывания. Логика такая: пока флаг не сброшен, модуль USB думает что мы с ним работаем и будет слать хоста NAK, то есть не попротит значения, которые мы пытаемся считать. Но тут хз, может он это как-то по-другому отслеживает и моя логика неверна.
Обработчик EP0 (мне кажется, проблема в нем
сомневаюсь. Он же у вас работает. Не работает запрос IN на EP1.
Стоп!
А вы его вообще посылаете?
В том смысле, что если вы хотите послать IN пакет хосту, надо это делать руками. Прерывание IN сработает только когда предыдущий пакет хостом успешно принят.
if(_Ep0::Reg::Get() & USB_EP_SETUP)
Вот на этот участок рекомендую обратить особое внимание. У меня запросы на чтение дублировались. На клавомышке их нет, а вот не custom hid уже бывают.
Реклама
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: STM32 и USB (практика)

Сообщение Eddy_Em »

Ни в HID, ни в CDC INTERRUPT точка вообще не нужна! Ее можно оставлять виртуальной (я так делал, когда на одном STM32F103 завел 7 устройств CDC).
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Реклама
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: STM32 и USB (практика)

Сообщение azhel12 »

А вы его вообще посылаете?
У меня на текущий момент EP1 только на OUT (то есть управление в одну сторону, без обратной связи).
Фактически пакет точно посылается, потому что в HID Demonstrator отправляю, в EP1R правильно взводятся флаги, в памяти правильное значение.
Попробую перенести сброс CTR_RX в конец, вдруг поможет.
Ни в HID, ни в CDC INTERRUPT точка вообще не нужна!
А куда тогда принимать пакеты? Все в нулевую - слишком уж много у нее ответственности, мне кажется. И в HID, как я понял, есть два способа связи -
через Feature и Report. Первый способ действительно подразумевает обмен данными с 0 точкой, а Report - с той, что указана в дескрипторе.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 и USB (практика)

Сообщение VladislavS »

Дескрипторов больше 64 байт нет? Если есть, код предусматривает их обработку?

На F072 есть подстраеваемый от USB генератор. Он без кварца стабильно с USB работает.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: STM32 и USB (практика)

Сообщение azhel12 »

Дескрипторов больше 64 байт нет?
Вот это надо проверить, мб дескриптор конфигурации вылез (потому что туда входит он сам + дескриптор интерфейса + дескриптор HID + дескриптор конечной точки), а я этого не обрабатываю. Хотя опять же, разве в таком случае устройство может быть опознаным, пусть и один раз из пяти?
На F072 есть подстраеваемый от USB генератор. Он без кварца стабильно с USB работает.
Про него читал, но не использовал, тактировал от внутреннего HSI48.
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 и USB (практика)

Сообщение VladislavS »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4004021#p4004021"]Но хотя бы на макросы для дескрипторов посмотрите: рано или поздно считать длинны надоест.[/uquote]Макросы зло. Правильнее типизировать дескрипторы. Тогда размер через sizeof берётся.

Добавлено after 2 minutes 9 seconds:
[uquote="azhel12",url="/forum/viewtopic.php?p=4004095#p4004095"]тактировал от внутреннего HSI48.[/uquote]Ну так это он и есть.
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: STM32 и USB (практика)

Сообщение COKPOWEHEU »

Ни в HID, ни в CDC INTERRUPT точка вообще не нужна!
В cdc не обязательна, а вот для HID нужна. Хост ведь не опрашивает EP0 клавиатуры, он ждет прерывания.
У меня на текущий момент EP1 только на OUT
А разве interrupt endpoint'ы бывают на OUT? Они же нужны чтобы устройство могло что-то срочно передать хосту. Хост если захочет через любую точку свяжется.
Вот это надо проверить, мб дескриптор конфигурации вылез
У меня аналогичный занимает 32 байта, так что вряд ли.
Макросы зло. Правильнее типизировать дескрипторы. Тогда размер через sizeof берётся.
Угу, особенно составные. Хотел бы я посмотреть как вы будете писать типизированный дескриптор для аудио устройства, а потом десять раз менять потому что хочется проверить несколько комбинаций терминалов и юнитов.
Нет, серьезно. Типизированные дескрипторы надо объявлять в двух местах, а потом следить за соответствием. На макросах же оно получается бесплатно. Возможно, на плюсовых шаблонах можно еще красивее сделать, не знаю.
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: STM32 и USB (практика)

Сообщение azhel12 »

А разве interrupt endpoint'ы бывают на OUT
Да, просто там время опроса ни на что не влияет, я так понял: как хост пришлет данные, так и прилетят. ТУТ автор сделал Interrupt OUT точку и все вроде норм.
Возможно, на плюсовых шаблонах можно еще красивее сделать, не знаю.
Можно (хотя о красоте сложно спорить), у меня так получилось это примерно:
Метод заполнения дескриптора интерфейса:

Код: Выделить всё

uint16_t FillDescriptor(InterfaceDescriptor* descriptor)
{
	uint16_t totalLength = sizeof(InterfaceDescriptor);

	*descriptor = InterfaceDescriptor {
		.Number = _Number,
		.AlternateSetting = _AlternateSetting,
		.EndpointsCount = EndpointsCount,
		.Class = _Class,
		.SubClass = _SubClass,
		.Protocol = _Protocol
	};
	
	EndpointDescriptor* endpointsDescriptors = reinterpret_cast<EndpointDescriptor*>(++descriptor);
	totalLength += (_Endpoints::FillDescriptor(endpointsDescriptors++) + ...);

	return totalLength;
}
А сам класс шаблонный, у него последний параметр переменной длины:

Код: Выделить всё

template <uint8_t _Number, uint8_t _AlternateSetting = 0, uint8_t _Class = 0, uint8_t _SubClass = 0, uint8_t _Protocol = 0, typename... _Endpoints>
Соответственно, инстанцировании нужно указать интерфейсу все его конечные точки, а в методе FillDescriptor будут по очереди вызваны методы FillDescriptor всех его конечных точек.
Единственное, что пришлось прикостылить - это инкрементирование размера, потому что дескриптор интерфейса должен знать свой полный размер (можно было здесь, конечно, количество умножить на 7, но сделал единообразно, потому что метод заполнения дескриптора конфигурации выглядит почти так же.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: STM32 и USB (практика)

Сообщение COKPOWEHEU »

ТУТ автор сделал Interrupt OUT
Да вроде IN, все нормально.

Код: Выделить всё

/******************** дескриптор конечных точек (endpoints) ********************/
					0x07,          // bLength: длина дескриптора
					USB_ENDPOINT_DESCRIPTOR_TYPE, // тип дескриптора - endpoints

					0x81,          // bEndpointAddress: адрес конечной точки и направление 1(IN)
					0x03,          // bmAttributes: тип конечной точки - Interrupt endpoint
					wMaxPacketSize, 0x00,    // wMaxPacketSize:  Bytes max
					0x20,          // bInterval: Polling Interval (32 ms)
А если вы про 0x01, то, что-то мне подсказывает, замени автор ее на Control, ничего бы не изменилось. Авторы vusb-cdc вообще bulk endpoint заменили на interrupt, потому что низкоскоростным устройствам быть Bulk'ами нельзя.
В любом случае спасибо за ссылку, я сегодня дописал пример запоминающего устройства, дальше по плану как раз HID, а потом Audio. Работать они работают, но разбираться еще много.
можно было здесь, конечно, количество умножить на 7
Я не просто так говорил про аудио устройства. Там дескриптор гораздо более развесистый:
Спойлер

Код: Выделить всё

static const uint8_t USB_ConfigDescriptor[] = {
  ARRLEN34(
  ARRLEN1(
    bLENGTH, // bLength: Configuration Descriptor size
    USB_DESCR_CONFIG,    //bDescriptorType: Configuration
    wTOTALLENGTH, //wTotalLength
    2, // bNumInterfaces
    1, // bConfigurationValue: Configuration value
    0, // iConfiguration: Index of string descriptor describing the configuration
    0x80, // bmAttributes: bus powered
    0x32, // MaxPower 100 mA
  )
  ARRLEN1(//0: Audio control Interface
    bLENGTH, // bLength
    USB_DESCR_INTERFACE, // bDescriptorType
    0, // bInterfaceNumber
    0, // bAlternateSetting
    0, // bNumEndpoints (если испольуется Interrupt endpoint, может быть 1)
    USB_CLASS_AUDIO, // bInterfaceClass: 
    USB_SUBCLASS_AUDIOCONTROL, // bInterfaceSubClass: 
    0x00, // bInterfaceProtocol: 
    0x00, // iInterface
  )
    ARRLEN67(//AC interface
      ARRLEN1(//AC interface header
        bLENGTH, //bLength
        USB_DESCR_CS_INTERFACE, //bDescriptorType
        1, //bDescriptorSubType
        USB_U16(1), //bcdADC //AudioDeviceClass серийный номер
        wTOTALLENGTH, //wTotalLength
        1, //bInCollection //количество интерфейсов в коллекции
        1, //bInterfaceNr(1), //массив (список) номеров интерфейсов в коллекции
        //bInterfaceNr(2), ...
      )
      ARRLEN1(//1. AC Input terminal
        bLENGTH, //bLength
        USB_DESCR_CS_INTERFACE, //bDescriptorType
        USBAUDIO_IF_TERM_IN, //bDescriptorSubType
        1, //bTerminalID
        USB_U16( USBAUDIO_TERMINAL_MIC ), //wTerminalTypeЧто это вообще такое (а вариантов немало!)
        0, //bAssocTerminal привязка выходного терминала для создания пары. Не используем
        1, //bNrChannels
        USB_U16( 0 ), //wChannelConfig //к чему именно подключены каналы
        0, //iChannelNames
        0, //iTerminal
      )
      ARRLEN1(//2. AC Feature Unit
        bLENGTH, //bLength
        USB_DESCR_CS_INTERFACE, //bDescriptorType
        USBAUDIO_IF_FEATURE, //bDescriptorSubType
        2, //UnitID
        1, //bSourceID  <---------------------------------------------
        1, //bControlSize //размер одного элемента в массиве
        //bmaControls чем именно можно управлять
          USBAUDIO_FEATURE_MUTE, //Channel(0)
          USBAUDIO_FEATURE_NONE, //Channel(1) канал 1 - Mute
          //нужно описать оба канала?
        0, //iFeature
      )
      ARRLEN1(//3. AC Output Terminal
        bLENGTH, //bLength
        USB_DESCR_CS_INTERFACE, //bDescriptorType
        USBAUDIO_IF_TERM_OUT, //bDescriptorSubType
        3, //bTerminalID
        USB_U16( USBAUDIO_TERMINAL_USB ), //wTerminalType:speaker
        0, //bAssocTerminal
        2, //bSourceID  <-------------------------------------------
        0, //iTerminal
      )
    )
  ARRLEN1(//1 Audio Streaming Interface
    bLENGTH, //bLength
    USB_DESCR_INTERFACE, //bDescriptorType
    1, //bInterfaceNumber
    0, //bAlternateSetting
    0, //bNumEndpoints
    USB_CLASS_AUDIO, //bInterfaceClass
    USB_SUBCLASS_AUDIOSTREAMING, //bInterfaceSubClass
    0, //bInterfaceProtocol
    0, //iInterface
  )
  ARRLEN1(//1alt Audio Streaming Interface (alternative)
    bLENGTH, //bLength
    USB_DESCR_INTERFACE, //bDescriptorType
    1, //bInterfaceNumber
    1, //bAlternateSetting
    1, //bNumEndpoints
    USB_CLASS_AUDIO, //bInterfaceClass
    USB_SUBCLASS_AUDIOSTREAMING, //bInterfaceSubClass
    0, //bInterfaceProtocol
    0, //iInterface
  )
  
  ARRLEN1(//AS Interface
    bLENGTH, //bLength
    USB_DESCR_CS_INTERFACE, //bDescriptorType
    USBAUDIO_AS_GENERAL, //bDescriptorSubType
    3, //bTerminalLink  <----------------------------------------
    1, //bDelay //задержка, вносимая устройством (в единицах числа фреймов)
    USB_U16( USBAUDIO_FORMAT_PCM ), //wFormatTag=PCM, тип кодирования данных //TODO описать возможные типы
  )
  ARRLEN1(//AS Format Type 1
    bLENGTH, //bLength
    USB_DESCR_CS_INTERFACE, //bDescriptorType
    USBAUDIO_AS_FORMAT, //bDescriptorSubType
    1, //bFormatType
    1, //bNrChannels
    2, //bSubFrameSize //количество БАЙТОВ на отсчет (1-4)
    16, //bBitResolution //количество БИТОВ на отсчет (<= bSubFrameSize*8) //наверное, то-занимаемое в потоке место, а это - реальная разрешающая способность
    1, //bSamFreqType //количество поддерживаемых частот
    USB_AC24(48000), //tSamFreq //(6 байт!) массив диапазонов частот
  )
  
  ARRLEN1(//Endpoint descriptor
    bLENGTH, //bLength
    USB_DESCR_ENDPOINT, //bDescriptorType
    ENDP_DATA_NUM | 0x80, 
    USB_ENDP_ISO, //Isochronous / Synch=none / usage=data //TODO
    USB_U16(ENDP_DATA_SIZE),
    1, //bInterval - частота опроса, для изохронных всегда 1
    0, //bRefresh - хз что это, сказано выставить в 0
    0, //bSynchAddress - адрес endpoint'а для синхронизации
  )
  ARRLEN1(//Isochronous endpoint descriptor
    bLENGTH, //bLength
    USB_DESCR_ENDP_ISO, //bDescriptorType
    1, //bDescriptorSubType
    0, //bmAttributes
    0, //bLockDelayUnits (undefned)
    USB_U16(0), //wLockDelay
  )
  )
};
Это дескриптор простейшего микрофона. В некоторых местах размер задается в 6 и 7 байтах. Плюс количество дескрипторов терминалов и юнитов может быть произвольным. Соответственно и ендпоинтов тоже.
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: STM32 и USB (практика)

Сообщение azhel12 »

Да вроде IN, все нормально.
А дальше идет дескриптор второй точки:

Код: Выделить всё

0x07,	/* bLength: Endpoint Descriptor size */
USB_ENDPOINT_DESCRIPTOR_TYPE,	/* bDescriptorType: */
/*	Endpoint descriptor type */
0x01,	/* bEndpointAddress: */
/*	Endpoint Address (OUT) */
0x03,	/* bmAttributes: Interrupt endpoint */
wMaxPacketSize,	/* wMaxPacketSize:  Bytes max  */
0x00,
0x20,	/* bInterval: Polling Interval (32 ms) */
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: STM32 и USB (практика)

Сообщение COKPOWEHEU »

Процитирую себя:
А если вы про 0x01, то, что-то мне подсказывает, замени автор ее на Control, ничего бы не изменилось. Авторы vusb-cdc вообще bulk endpoint заменили на interrupt, потому что низкоскоростным устройствам быть Bulk'ами нельзя.
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: STM32 и USB (практика)

Сообщение azhel12 »

Процитирую себя
Теперь понял, что вы имели ввиду. Я по совету товарища менял на Bulk - то же самое.

Наконец-то добрался до дома, снял отправленный дескриптор конфигураци

Код: Выделить всё

09 02 22 00 01 00 00 00 FA // дескриптор конфигурации
09 04 00 00 01 03 00 00 00 // дескриптор интерфейса 
09 21 00 02 00 01 // дескриптор HID
22 1C 00 // дескриптор репорта
07 05 01 03 40 00 20 // дескриптор конечной точки
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: STM32 и USB (практика)

Сообщение COKPOWEHEU »

Как-то оно у вас неудобно выглядит по сравнению с обычным lsusb -v, ну да ладно
MaxPower у вас 500 мА - не многовато?
bInterfaceProtocol у вас "просто HID". Так вы не стандартное устройство делаете?
bcdHID у вас 2.0, я такого в примерах не помню. Обычно выставляют 1.1 или 1.0
Больше всего меня смущает ваша конечная точка. Попробуйте перед ней добавить interrupt IN, пусть даже без обработчика. Вдруг хост считает первую точку прерыванием не глядя на ее направление. Вряд ли, конечно, но мало ли.
И освойте наконец wireshark!

Добавлено after 5 minutes 7 seconds:
Для сравнения выхлоп стандартной lsusb для моего HID'а:

Код: Выделить всё

> lsusb -vv -d 16c0:05df

Bus 001 Device 059: ID 16c0:05df Van Ooijen Technische Informatica HID device except mice, keyboards, and joysticks
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x16c0 Van Ooijen Technische Informatica
  idProduct          0x05df HID device except mice, keyboards, and joysticks
  bcdDevice            0.01
  iManufacturer           1 COKPOWEHEU
  iProduct                2 USB Keyboard + Mouse
  iSerial                 3 1
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0022
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      1 Keyboard
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength     115
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval             100
Device Status:     0x0000
  (Bus Powered)
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: STM32 и USB (практика)

Сообщение azhel12 »

Загуглил фильтры в WireShark, поймал пакеты:

Это report-пакет с хоста на устройство
Изображение

Это ответ:
Изображение

Вроде как все нормально (ну и как говорил, устройство точно один раз принимает). На дальнейшие пакеты устройство отвечает "CANCELED" (потому что STAT_RX в NAK стоит).
бычно выставляют 1.1 или 1.0
Хорошо, попробую.
Попробуйте перед ней добавить interrupt IN
Типа "фейковую" точку добавить? Тоже попытаюсь, спасибо.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: STM32 и USB (практика)

Сообщение COKPOWEHEU »

То есть хост передал вам в точку 0x01, 0x00. У вас в HID дескрипторе какой объем данных ожидается, не 2 байта часом?
Теперь надо проверять срабатывает ли у вас логика приема точки.
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: STM32 и USB (практика)

Сообщение azhel12 »

У вас в HID дескрипторе какой объем данных ожидается, не 2 байта часом?
Вроде 2, брал как образец из статьи хабровской, вот сам репорт:

Код: Выделить всё

using Report = HidReport<
	0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)
	0x09, 0x01,                    // USAGE (Vendor Usage 1)
	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, 0x01,                    //   REPORT_COUNT (1)
	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)
	0xc0                            // END_COLLECTION
>;
Добавлено after 2 hours 25 minutes 21 second:
Всем спасибо, все оказалось весьма банально (и больно): неправильно сбрасывались CTR_RX, как верно предположил @VladislavS.

Код, который у меня был, взял из libopencm3, либо там косяк, либо я даже украсть нормально не могу)) Устройство нормально определялось, потому что несброшенный бит CTR_RX приводил просто к тому, что бесконечно крутилось прерывание, однако в процессе нумерации данные от хоста все равно прилетали (STAT_RX ставится правильно), и запросы обрабатывались нормально. Но на EP1 данные хоть и приходили, но бесконечный цикл прерывания по EP0, которая более приоритетная, чем EP1, мешал программе перейти в обработчик. Пока подсунул код из проекта @COKPOWEHEU. Мб так и оставлю.

Еще раз всех благодарю, очень рад отзывчивости и готовности помочь. :))

З.Ы. Уверен, это не последняя проблема, так что не прощаюсь.

З.З.Ы. Из двух вариантов нашел правильный - у меня был косяк. 100% проблема извечная - скопипастил свой же код, но не во всех местах поменял. Постоянно своих студентов ругаю за такое, а сам в очередной раз попался. :(
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: STM32 и USB (практика)

Сообщение Eddy_Em »

[uquote="azhel12",url="/forum/viewtopic.php?p=4004079#p4004079"]
Ни в HID, ни в CDC INTERRUPT точка вообще не нужна!
А куда тогда принимать пакеты?[/uquote]
INTERRUPT? Никуда не принимать, они же IN!
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4004109#p4004109"]В cdc не обязательна, а вот для HID нужна. Хост ведь не опрашивает EP0 клавиатуры, он ждет прерывания.[/uquote]
Ничего подобного! У меня HID без этого работает.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: STM32 и USB (практика)

Сообщение azhel12 »

Никуда не принимать, они же IN!
А что мешает сделать Interrupt OUT? Да, Bulk был бы логичнее, но, например, на тот же HID, чтобы было более очевидно, проще создать пару Interrupt.
У меня HID без этого работает.
Я, конечно, на начальном этапе изучения в принципе МК, но, как понимаю, какую EP указать в дескрипторе интерфейса - к той и будет обращение, но зачем лепить все в одну?
Не зря же стандартом предусмотрено целых 16, а STM поддерживает 8 (хотя оба числа следует умножить на 2, потому что двунаправленные). Это почти как в main все лепить: некрасиво, не очень удобно поддерживать.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 и USB (практика)

Сообщение VladislavS »

azhel12, делай как велит спецификация. На Eddy_Em не обращай внимания, он её не читал и чем отличается SET_FEAUTRE от SET_REPORT наверняка даже не подозревает.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: STM32 и USB (практика)

Сообщение COKPOWEHEU »

Ничего подобного! У меня HID без этого работает.
Надо будет попробовать
Ответить

Вернуться в «ARM»