Перейти к содержанию

STM32F103C8 Простой проект USB HID Keyboard. Не работает


carlogulliani

Рекомендуемые сообщения

Добрый день, собрал в кубе проект для USB HID, ничего лишнего, только инициализация USB, выбор HID и настройка внешнего кварца. Частота 72 для всего устройства и 48 для USB, скорость передачи 12Мбит/с

Затем изменил несколько дефайнов и сам дескриптор устройства

#define HID_EPIN_SIZE                 0x08
#define HID_MOUSE_REPORT_DESC_SIZE    187
...
0x01,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/

дескриптор устройства забрал из видео от STMElectronics

Spoiler

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
        0x05    ,//bSize: 0x01, bType: Global, bTag: Usage Page
        0x01    ,//Usage Page(Generic Desktop Controls )
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x06    ,//Usage(Keyboard)
        0xA1    ,//bSize: 0x01, bType: Main, bTag: Collection
        0x01    ,//Collection(Application )
        0x85    ,//bSize: 0x01, bType: Global, bTag: Report ID
        0x01    ,//Report ID(0x1 )
        0x05    ,//bSize: 0x01, bType: Global, bTag: Usage Page
        0x07    ,//Usage Page(Keyboard/Keypad )
        0x19    ,//bSize: 0x01, bType: Local, bTag: Usage Minimum
        0xE0    ,//Usage Minimum(0xE0 )
        0x29    ,//bSize: 0x01, bType: Local, bTag: Usage Maximum
        0xE7    ,//Usage Maximum(0xE7 )
        0x15    ,//bSize: 0x01, bType: Global, bTag: Logical Minimum
        0x00    ,//Logical Minimum(0x0 )
        0x25    ,//bSize: 0x01, bType: Global, bTag: Logical Maximum
        0x01    ,//Logical Maximum(0x1 )
        0x75    ,//bSize: 0x01, bType: Global, bTag: Report Size
        0x01    ,//Report Size(0x1 )
        0x95    ,//bSize: 0x01, bType: Global, bTag: Report Count
        0x08    ,//Report Count(0x8 )
        0x81    ,//bSize: 0x01, bType: Main, bTag: Input
        0x02    ,//Input(Data, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Bit Field)
        0x75    ,//bSize: 0x01, bType: Global, bTag: Report Size
        0x08    ,//Report Size(0x8 )
        0x95    ,//bSize: 0x01, bType: Global, bTag: Report Count
        0x01    ,//Report Count(0x1 )
        0x81    ,//bSize: 0x01, bType: Main, bTag: Input
        0x01    ,//Input(Constant, Array, Absolute, No Wrap, Linear, Preferred State, No Null Position, Bit Field)
        0x05    ,//bSize: 0x01, bType: Global, bTag: Usage Page
        0x07    ,//Usage Page(Keyboard/Keypad )
        0x19    ,//bSize: 0x01, bType: Local, bTag: Usage Minimum
        0x00    ,//Usage Minimum(0x0 )
        0x29    ,//bSize: 0x01, bType: Local, bTag: Usage Maximum
        0x65    ,//Usage Maximum(0x65 )
        0x15    ,//bSize: 0x01, bType: Global, bTag: Logical Minimum
        0x00    ,//Logical Minimum(0x0 )
        0x25    ,//bSize: 0x01, bType: Global, bTag: Logical Maximum
        0x65    ,//Logical Maximum(0x65 )
        0x75    ,//bSize: 0x01, bType: Global, bTag: Report Size
        0x08    ,//Report Size(0x8 )
        0x95    ,//bSize: 0x01, bType: Global, bTag: Report Count
        0x05    ,//Report Count(0x5 )
        0x81    ,//bSize: 0x01, bType: Main, bTag: Input
        0x00    ,//Input(Data, Array, Absolute, No Wrap, Linear, Preferred State, No Null Position, Bit Field)
        0xC0    ,//bSize: 0x00, bType: Main, bTag: End Collection
        0x05    ,//bSize: 0x01, bType: Global, bTag: Usage Page
        0x0C    ,//Usage Page(Consumer )
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x01    ,//Usage(Consumer Control)
        0xA1    ,//bSize: 0x01, bType: Main, bTag: Collection
        0x01    ,//Collection(Application )
        0x85    ,//bSize: 0x01, bType: Global, bTag: Report ID
        0x02    ,//Report ID(0x2 )
        0x19    ,//bSize: 0x01, bType: Local, bTag: Usage Minimum
        0x00    ,//Usage Minimum(0x0 )
        0x2A    ,//bSize: 0x02, bType: Local, bTag: Usage Maximum
        0x3C,
        0x02 ,//Usage Maximum(0x23C )
        0x15    ,//bSize: 0x01, bType: Global, bTag: Logical Minimum
        0x00    ,//Logical Minimum(0x0 )
        0x26    ,//bSize: 0x02, bType: Global, bTag: Logical Maximum
        0x3C,
        0x02 ,//Logical Maximum(0x23C )
        0x95    ,//bSize: 0x01, bType: Global, bTag: Report Count
        0x01    ,//Report Count(0x1 )
        0x75    ,//bSize: 0x01, bType: Global, bTag: Report Size
        0x10    ,//Report Size(0x10 )
        0x81    ,//bSize: 0x01, bType: Main, bTag: Input
        0x00    ,//Input(Data, Array, Absolute, No Wrap, Linear, Preferred State, No Null Position, Bit Field)
        0xC0    ,//bSize: 0x00, bType: Main, bTag: End Collection
        0x05    ,//bSize: 0x01, bType: Global, bTag: Usage Page
        0x01    ,//Usage Page(Generic Desktop Controls )
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x80    ,//Usage(System Control)
        0xA1    ,//bSize: 0x01, bType: Main, bTag: Collection
        0x01    ,//Collection(Application )
        0x85    ,//bSize: 0x01, bType: Global, bTag: Report ID
        0x03    ,//Report ID(0x3 )
        0x19    ,//bSize: 0x01, bType: Local, bTag: Usage Minimum
        0x81    ,//Usage Minimum(0x81 )
        0x29    ,//bSize: 0x01, bType: Local, bTag: Usage Maximum
        0x83    ,//Usage Maximum(0x83 )
        0x15    ,//bSize: 0x01, bType: Global, bTag: Logical Minimum
        0x00    ,//Logical Minimum(0x0 )
        0x25    ,//bSize: 0x01, bType: Global, bTag: Logical Maximum
        0x01    ,//Logical Maximum(0x1 )
        0x75    ,//bSize: 0x01, bType: Global, bTag: Report Size
        0x01    ,//Report Size(0x1 )
        0x95    ,//bSize: 0x01, bType: Global, bTag: Report Count
        0x03    ,//Report Count(0x3 )
        0x81    ,//bSize: 0x01, bType: Main, bTag: Input
        0x02    ,//Input(Data, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Bit Field)
        0x95    ,//bSize: 0x01, bType: Global, bTag: Report Count
        0x05    ,//Report Count(0x5 )
        0x81    ,//bSize: 0x01, bType: Main, bTag: Input
        0x01    ,//Input(Constant, Array, Absolute, No Wrap, Linear, Preferred State, No Null Position, Bit Field)
        0xC0    ,//bSize: 0x00, bType: Main, bTag: End Collection
        0x06    ,//bSize: 0x02, bType: Global, bTag: Usage Page
        0x01,
        0xFF ,//Usage Page(Undefined )
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x01    ,//Usage(1)
        0xA1    ,//bSize: 0x01, bType: Main, bTag: Collection
        0x01    ,//Collection(Application )
        0x85    ,//bSize: 0x01, bType: Global, bTag: Report ID
        0x04    ,//Report ID(0x4 )
        0x95    ,//bSize: 0x01, bType: Global, bTag: Report Count
        0x01    ,//Report Count(0x1 )
        0x75    ,//bSize: 0x01, bType: Global, bTag: Report Size
        0x08    ,//Report Size(0x8 )
        0x15    ,//bSize: 0x01, bType: Global, bTag: Logical Minimum
        0x01    ,//Logical Minimum(0x1 )
        0x25    ,//bSize: 0x01, bType: Global, bTag: Logical Maximum
        0x0A    ,//Logical Maximum(0xA )
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x20    ,//Usage(32)
        0xB1    ,//bSize: 0x01, bType: Main, bTag: Feature
        0x03    ,//Feature(Constant, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Non VolatileBit Field)
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x23    ,//Usage(35)
        0xB1    ,//bSize: 0x01, bType: Main, bTag: Feature
        0x03    ,//Feature(Constant, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Non VolatileBit Field)
        0x25    ,//bSize: 0x01, bType: Global, bTag: Logical Maximum
        0x4F    ,//Logical Maximum(0x4F )
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x21    ,//Usage(33)
        0xB1    ,//bSize: 0x01, bType: Main, bTag: Feature
        0x03    ,//Feature(Constant, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Non VolatileBit Field)
        0x25    ,//bSize: 0x01, bType: Global, bTag: Logical Maximum
        0x30    ,//Logical Maximum(0x30 )
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x22    ,//Usage(34)
        0xB1    ,//bSize: 0x01, bType: Main, bTag: Feature
        0x03    ,//Feature(Constant, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Non VolatileBit Field)
        0x95    ,//bSize: 0x01, bType: Global, bTag: Report Count
        0x03    ,//Report Count(0x3 )
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x24    ,//Usage(36)
        0xB1    ,//bSize: 0x01, bType: Main, bTag: Feature
        0x03    ,//Feature(Constant, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Non VolatileBit Field)
        0xC0    ,//bSize: 0x00, bType: Main, bTag: End Collection
        0x06    ,//bSize: 0x02, bType: Global, bTag: Usage Page
        0x01,
        0xFF ,//Usage Page(Undefined )
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x01    ,//Usage(1)
        0xA1    ,//bSize: 0x01, bType: Main, bTag: Collection
        0x01    ,//Collection(Application )
        0x85    ,//bSize: 0x01, bType: Global, bTag: Report ID
        0x05    ,//Report ID(0x5 )
        0x95    ,//bSize: 0x01, bType: Global, bTag: Report Count
        0x01    ,//Report Count(0x1 )
        0x75    ,//bSize: 0x01, bType: Global, bTag: Report Size
        0x08    ,//Report Size(0x8 )
        0x15    ,//bSize: 0x01, bType: Global, bTag: Logical Minimum
        0x01    ,//Logical Minimum(0x1 )
        0x25    ,//bSize: 0x01, bType: Global, bTag: Logical Maximum
        0x0A    ,//Logical Maximum(0xA )
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x20    ,//Usage(32)
        0xB1    ,//bSize: 0x01, bType: Main, bTag: Feature
        0x03    ,//Feature(Constant, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Non VolatileBit Field)
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x23    ,//Usage(35)
        0xB1    ,//bSize: 0x01, bType: Main, bTag: Feature
        0x03    ,//Feature(Constant, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Non VolatileBit Field)
        0x25    ,//bSize: 0x01, bType: Global, bTag: Logical Maximum
        0x4F    ,//Logical Maximum(0x4F )
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x21    ,//Usage(33)
        0xB1    ,//bSize: 0x01, bType: Main, bTag: Feature
        0x03    ,//Feature(Constant, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Non VolatileBit Field)
        0x25    ,//bSize: 0x01, bType: Global, bTag: Logical Maximum
        0x30    ,//Logical Maximum(0x30 )
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x22    ,//Usage(34)
        0xB1    ,//bSize: 0x01, bType: Main, bTag: Feature
        0x03    ,//Feature(Constant, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Non VolatileBit Field)
        0x95    ,//bSize: 0x01, bType: Global, bTag: Report Count
        0x03    ,//Report Count(0x3 )
        0x09    ,//bSize: 0x01, bType: Local, bTag: Usage
        0x24    ,//Usage(36)
        0xB1    ,//bSize: 0x01, bType: Main, bTag: Feature
        0x03    ,//Feature(Constant, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Non VolatileBit Field)
        0xC0    //bSize: 0x00, bType: Main, bTag: End Collection
};

 

 

Там же в видео и описана структура данных для передачи

Spoiler

image.png.09e332b720fe6cb37abd1473dba6cbab.png

Отправляю один символ R (код 0x15 согласно этому документу)

uint8_t USB_TX_BUF[8] = {0};
...
while(1) {
    USB_TX_BUF[3] = 0x15;
    USBD_HID_SendReport(&hUsbDeviceFS, USB_TX_BUF, 8);
    HAL_Delay(100);
    USB_TX_BUF[3] = 0x00;
    USBD_HID_SendReport(&hUsbDeviceFS, USB_TX_BUF, 8);
    HAL_Delay(100);
}

И ничего не отправляется, хотя lsusb выводит мое устройство, может кто сталкивался с подобным?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Не загоняйся, Нужно менять - просто поменяй и всё. Мож там вообще 1 емкость просела а тут целая формула бороды намечается 
    • Первый разобранный магнитофон  Где то даже движок от него лежит.
    • На некоторых Лого есть дисплейчик. и на нем видно все и даже в ручную при желании можно сделать коррекцию программы. Может уже хватит вздрагивать, пора ремонтировать.
    • Уважаемые товарищи, нужны схемы, либо НТД для ремонтов блоков очень срочно!!!! Всё кроме реле Р10ТМУ, уже нашёл не вашем форуме и их отремонтировали....любая помощь приветствуется
    • Все предложенные к рассмотрению источники питания работают примерно по одному принципу: сетевое напряжение выпрямляется, фильтруется (получаем чуть больше 300 вольт постоянного), затем преобразуется снова в переменное, но уже на частотах в несколько десятков килогерц, понижается на трансформаторе и снова выпрямляется. За счёт высокой частоты преобразования используется трансформатор на ферритовом, а не на стальном, сердечнике, гораздо меньших габаритов и стоимости. Минусы: значительное усложнение схемы блока и вероятность возникновения различных помех от него. Модули управления (кроме первого) также являются импульными преобразователями, с теми же достоинствами и недостатками. Если нужно по быстрому собрать некое подобие ЛБП, то уж лучше брать модуль вроде этого. Ну и блок питания к нему соответствующий. Но не очень понятно, какой практический опыт можно получить от соединения готовых модулей парой проводов.  
    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
×
×
  • Создать...