probedog 发表于 2024-9-30 15:26

STM32F107无法枚举成HID+MSC

做了很多次尝试,STM32F107 还是无法枚举成 HID+MSC ,哪位能提供下例程?

回复就哭哭 发表于 2024-9-30 23:18

// usb_desc.c

#include "usb_desc.h"

// USB标准描述符
const uint8_t USB_DeviceDescriptor[] = {
    // Device Descriptor
    0x12,                   // bLength
    USB_DESC_TYPE_DEVICE,   // bDescriptorType
    0x00, 0x02,             // bcdUSB (USB 2.0)
    0x00,                   // bDeviceClass
    0x00,                   // bDeviceSubClass
    0x00,                   // bDeviceProtocol
    USB_MAX_EP0_SIZE,      // bMaxPacketSize0
    LOBYTE(VENDOR_ID),      // idVendor
    HIBYTE(VENDOR_ID),      // idVendor
    LOBYTE(PRODUCT_ID),   // idProduct
    HIBYTE(PRODUCT_ID),   // idProduct
    0x00, 0x01,             // bcdDevice (v1.00)
    1,                      // Index of manufacturer string descriptor
    2,                      // Index of product string descriptor
    3,                      // Index of serial number string descriptor
    0x01                  // bNumConfigurations
};

// HID和MSC接口描述符定义
const uint8_t USB_ConfigDescriptor[] = {
    // Configuration Descriptor
    0x09,                   // bLength
    USB_DESC_TYPE_CONFIG,   // bDescriptorType
    USB_DESC_LEN_CONFIG,    // wTotalLength (to be defined)
    0x00,                   // bNumInterfaces
    0x01,                   // bConfigurationValue
    0x00,                   // iConfiguration
    0x80,                   // bmAttributes
    USB_MAX_POWER,         // bMaxPower

    // HID Interface Descriptor
    0x09,                   // bLength
    USB_DESC_TYPE_INTERFACE,// bDescriptorType
    0x00,                   // bInterfaceNumber
    0x00,                   // bAlternateSetting
    0x01,                   // bNumEndpoints
    0x03,                   // bInterfaceClass (HID)
    0x01,                   // bInterfaceSubClass
    0x01,                   // bInterfaceProtocol
    0x00,                   // iInterface

    // HID Descriptor
    0x09,                   // bLength
    HID_DESCRIPTOR_TYPE,    // bDescriptorType
    0x11, 0x01,            // bcdHID
    0x00,                   // bCountryCode
    0x01,                   // bNumDescriptors
    0x22,                   // bDescriptorType
    sizeof(HID_ReportDescriptor), 0x00, // wDescriptorLength

    // Endpoint Descriptor
    0x07,                   // bLength
    USB_DESC_TYPE_ENDPOINT, // bDescriptorType
    HID_EP_IN,             // bEndpointAddress
    0x03,                   // bmAttributes (Interrupt)
    LOBYTE(HID_EP_SIZE),    // wMaxPacketSize
    HIBYTE(HID_EP_SIZE),    // wMaxPacketSize
    0x0A,                   // bInterval

    // MSC Interface Descriptor
    0x09,                   // bLength
    USB_DESC_TYPE_INTERFACE,// bDescriptorType
    0x01,                   // bInterfaceNumber
    0x00,                   // bAlternateSetting
    0x02,                   // bNumEndpoints
    0x08,                   // bInterfaceClass (Mass Storage)
    0x06,                   // bInterfaceSubClass
    0x50,                   // bInterfaceProtocol
    0x00,                   // iInterface

    // Bulk IN Endpoint Descriptor
    0x07,                   // bLength
    USB_DESC_TYPE_ENDPOINT, // bDescriptorType
    MSC_EP_IN,             // bEndpointAddress
    0x02,                   // bmAttributes (Bulk)
    LOBYTE(MSC_EP_SIZE),    // wMaxPacketSize
    HIBYTE(MSC_EP_SIZE),    // wMaxPacketSize
    0x00,                   // bInterval

    // Bulk OUT Endpoint Descriptor
    0x07,                   // bLength
    USB_DESC_TYPE_ENDPOINT, // bDescriptorType
    MSC_EP_OUT,            // bEndpointAddress
    0x02,                   // bmAttributes (Bulk)
    LOBYTE(MSC_EP_SIZE),    // wMaxPacketSize
    HIBYTE(MSC_EP_SIZE),    // wMaxPacketSize
    0x00                  // bInterval
};

// HID报告描述符
const uint8_t HID_ReportDescriptor[] = {
    // Your HID report descriptor here
};

将爱藏于深海 发表于 2024-11-3 13:00

STM32F107系列微控制器支持USB功能,但要将STM32F107枚举为HID和MSC复合设备,需要正确配置USB库和设备描述符

月亮一键变蓝 发表于 2024-11-3 14:00

USB库配置问题,确保你使用的USB库支持复合设备功能。STM32的标准外设库和HAL库都支持复合设备配置

未说出口的像你 发表于 2024-11-3 15:00

设备描述符配置,复合设备的设备描述符需要正确配置,以支持多个接口(Interface)。每个接口对应一个设备类(如HID或MSC)

她已醉 发表于 2024-11-3 16:00

报告描述符配置要HID的报告描述符正确配置

在曼谷的春 发表于 2024-11-3 17:00

初始化和处理函数,确保在初始化和处理函数中正确配置和处理HID和MSC的请求

温室雏菊 发表于 2024-11-3 18:00

使用USB分析仪或调试工具(如Bus Hound)来捕获USB通信数据,验证设备描述符和请求是否正确

春日负喧 发表于 2024-11-3 19:00

确保设备描述符、报告描述符和初始化函数正确配置,以支持HID和MSC复合设备。通过调试工具验证USB通信数据,确保设备正确枚举为HID+MSC复合设备

一只眠羊 发表于 2024-11-3 20:00

我觉得这种可以用cubemx来配置试试

失物招領 发表于 2024-11-3 21:00

一般来说是有例程的,网上有很多HID和MSC的符合例程的

我吃小朋友 发表于 2024-11-3 22:00

估计就是描述符没配置好,不过USB的描述符确实麻烦

公羊子丹 发表于 2025-1-23 14:01

HID+MSC同时枚举挺麻烦的,建议先单独测试HID和MSC,看哪块出问题了。

周半梅 发表于 2025-1-23 14:02

STM32官方例程好像有类似的组合功能,可以参考下USB库的Examples目录。

帛灿灿 发表于 2025-1-23 14:03

确保用的是最新的USB库版本,旧版本可能在复合设备上支持不太好。

童雨竹 发表于 2025-1-23 14:05

HID+MSC需要修改描述符,检查下设备和配置描述符有没有问题。

万图 发表于 2025-1-23 14:06

枚举不成功可能是电源供电问题,确保USB接口电压稳定。

Wordsworth 发表于 2025-1-23 14:07

如果是用STM32CubeMX生成的代码,记得启用USB中断,不然会卡住。

Bblythe 发表于 2025-1-23 14:08

检查下PID和VID配置,有时候重复或者设置错误也会导致枚举失败。

Pulitzer 发表于 2025-1-23 14:09

推荐看下USB复合设备的协议栈初始化流程,重点排查USB_Init函数。
页: [1] 2
查看完整版本: STM32F107无法枚举成HID+MSC