[STM32F1] STM32F103 USB 设备描述符问题请教

[复制链接]
2307|16
 楼主| elephant00 发表于 2024-8-20 16:36 | 显示全部楼层 |阅读模式
我用STM32F103 开发一个USB 自定义设备, 因为STM32CUBE 里没有自定义设备,所以我选择CDC然后更改设备描述符,我之前在407的芯片上这样做没有任何问题,但是我在103上更改,电脑就经常是显示还是CDC设备,有时候就找不到设备,很奇怪

我尝试单步调试USB的描述符加载过程,发现在USBD_LL_Init 里有强行指定了3个endpoint ,跟我的设置不一样,但是设备描述符他自己还是加载的CDC的没搞清楚

HAL_PCDEx_PMAConfig((PCD_HandleTypeDef)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); / USER CODE END EndPoint_Configuration / / USER CODE BEGIN EndPoint_Configuration_CDC / HAL_PCDEx_PMAConfig((PCD_HandleTypeDef)pdev->pData , 0x81 , PCD_SNG_BUF, 0xC0); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef)pdev->pData , 0x01 , PCD_SNG_BUF, 0x110); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x82 , PCD_SNG_BUF, 0x100);

下面是我修改的 usb_cdc.C

/ USB CDC device Configuration Descriptor / ALIGN_BEGIN uint8_t USBD_CDC_CfgHSDesc[USB_CDC_CONFIG_DESC_SIZ] ALIGN_END = { /Configuration Descriptor/ 0x09, / bLength: Configuration Descriptor size / USB_DESC_TYPE_CONFIGURATION, / bDescriptorType: Configuration / USB_CDC_CONFIG_DESC_SIZ, / wTotalLength:no of returned bytes / 0x00, 0x01, / bNumInterfaces: 2 interface / 0x01, / bConfigurationValue: Configuration value / 0x00, / iConfiguration: Index of string descriptor describing the configuration / 0xC0, / bmAttributes: self powered / 0x32, / MaxPower 0 mA /

/---------------------------------------------------------------------------/

/Interface Descriptor / 0x09, / bLength: Interface Descriptor size / USB_DESC_TYPE_INTERFACE, / bDescriptorType: Interface / / Interface descriptor type / 0x00, / bInterfaceNumber: Number of Interface / 0x00, / bAlternateSetting: Alternate setting / 0x02, / bNumEndpoints: One endpoints used / 0xff, / bInterfaceClass: Communication Interface Class / 0xff, / bInterfaceSubClass: Abstract Control Model / 0x00, / bInterfaceProtocol: Common AT commands / 0x00, / iInterface: /

/Endpoint OUT Descriptor/ 0x07, / bLength: Endpoint Descriptor size / USB_DESC_TYPE_ENDPOINT, / bDescriptorType: Endpoint / CDC_OUT_EP, / bEndpointAddress / 0x02, / bmAttributes: Bulk / LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), / wMaxPacketSize: / HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, / bInterval: ignore for Bulk transfer /

/Endpoint IN Descriptor/ 0x07, / bLength: Endpoint Descriptor size / USB_DESC_TYPE_ENDPOINT, / bDescriptorType: Endpoint / CDC_IN_EP, / bEndpointAddress / 0x02, / bmAttributes: Bulk / LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), / wMaxPacketSize: / HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00 / bInterval: ignore for Bulk transfer / } ;

/ USB CDC device Configuration Descriptor / ALIGN_BEGIN uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] ALIGN_END = { /Configuration Descriptor/ 0x09, / bLength: Configuration Descriptor size / USB_DESC_TYPE_CONFIGURATION, / bDescriptorType: Configuration / USB_CDC_CONFIG_DESC_SIZ, / wTotalLength:no of returned bytes / 0x00, 0x01, / bNumInterfaces: 2 interface / 0x01, / bConfigurationValue: Configuration value / 0x00, / iConfiguration: Index of string descriptor describing the configuration / 0xC0, / bmAttributes: self powered / 0x32, / MaxPower 0 mA /

/---------------------------------------------------------------------------/

/Interface Descriptor / 0x09, / bLength: Interface Descriptor size / USB_DESC_TYPE_INTERFACE, / bDescriptorType: Interface / / Interface descriptor type / 0x00, / bInterfaceNumber: Number of Interface / 0x00, / bAlternateSetting: Alternate setting / 0x02, / bNumEndpoints: One endpoints used / 0xff, / bInterfaceClass: Communication Interface Class / 0xff, / bInterfaceSubClass: Abstract Control Model / 0x00, / bInterfaceProtocol: Common AT commands / 0x00, / iInterface: /

/Endpoint OUT Descriptor/ 0x07, / bLength: Endpoint Descriptor size / USB_DESC_TYPE_ENDPOINT, / bDescriptorType: Endpoint / CDC_OUT_EP, / bEndpointAddress / 0x02, / bmAttributes: Bulk / LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), / wMaxPacketSize: / HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, / bInterval: ignore for Bulk transfer /

/Endpoint IN Descriptor/ 0x07, / bLength: Endpoint Descriptor size / USB_DESC_TYPE_ENDPOINT, / bDescriptorType: Endpoint / CDC_IN_EP, / bEndpointAddress / 0x02, / bmAttributes: Bulk / LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), / wMaxPacketSize: / HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00 / bInterval: ignore for Bulk transfer / } ;

ALIGN_BEGIN uint8_t USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ] ALIGN_END = { 0x09, / bLength: Configuation Descriptor size / USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, USB_CDC_CONFIG_DESC_SIZ, 0x00, 0x01, / bNumInterfaces: 2 interfaces / 0x01, / bConfigurationValue: / 0x00, / iConfiguration: / 0xC0, / bmAttributes: / 0x32, / MaxPower 100 mA /

/Interface Descriptor / 0x09, / bLength: Interface Descriptor size / USB_DESC_TYPE_INTERFACE, / bDescriptorType: Interface / / Interface descriptor type / 0x00, / bInterfaceNumber: Number of Interface / 0x00, / bAlternateSetting: Alternate setting / 0x02, / bNumEndpoints: One endpoints used / 0xff, / bInterfaceClass: Communication Interface Class / 0xff, / bInterfaceSubClass: Abstract Control Model / 0x00, / bInterfaceProtocol: Common AT commands / 0x00, / iInterface: /

/Endpoint OUT Descriptor/ 0x07, / bLength: Endpoint Descriptor size / USB_DESC_TYPE_ENDPOINT, / bDescriptorType: Endpoint / CDC_OUT_EP, / bEndpointAddress / 0x02, / bmAttributes: Bulk / 0x40, / wMaxPacketSize: / 0x00, 0x00, / bInterval: ignore for Bulk transfer /

/Endpoint IN Descriptor/ 0x07, / bLength: Endpoint Descriptor size / USB_DESC_TYPE_ENDPOINT, / bDescriptorType: Endpoint / CDC_IN_EP, / bEndpointAddress / 0x02, / bmAttributes: Bulk / 0x40, / wMaxPacketSize: / 0x00, 0x00 / bInterval / };

下面是我修改的 usb_cdc.H

define CDC_IN_EP 0x82U / EP1 for data IN /
define CDC_OUT_EP 0x01U / EP1 for data OUT /
define CDC_CMD_EP 0x83U / EP2 for CDC commands /
ifndef CDC_HS_BINTERVAL
define CDC_HS_BINTERVAL 0x10U
endif / CDC_HS_BINTERVAL /
ifndef CDC_FS_BINTERVAL
define CDC_FS_BINTERVAL 0x10U
endif / CDC_FS_BINTERVAL /
/ CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. /

define CDC_DATA_HS_MAX_PACKET_SIZE 512U / Endpoint IN & OUT Packet size /
define CDC_DATA_FS_MAX_PACKET_SIZE 64U / Endpoint IN & OUT Packet size /
define CDC_CMD_PACKET_SIZE 8U / Control Endpoint Packet size /
define USB_CDC_CONFIG_DESC_SIZ 32U//67U
laocuo1142 发表于 2024-8-20 19:27 | 显示全部楼层
设备描述符未正确更新
flycamelaaa 发表于 2024-8-20 19:27 | 显示全部楼层
USBD_LL_Init函数中硬编码的端点配置可能与你的设备描述符不匹配。
powerantone 发表于 2024-8-20 19:28 | 显示全部楼层
在设备描述符中更改VID和PID,以避免与已知设备类型的冲突。
xionghaoyun 发表于 2024-8-21 09:05 | 显示全部楼层
一串英语看得头痛
别乱了阵脚 发表于 2024-10-9 21:13 | 显示全部楼层
在你的描述中,你遇到了STM32F103上USB自定义设备的问题,尽管你已经尝试修改设备描述符和端点配置,但设备仍然被识别为CDC设备,或者有时根本无法识别
江河千里 发表于 2024-10-10 02:00 | 显示全部楼层
确保你的设备描述符在整个代码中是一致的。你提到在USBD_LL_Init中强行指定了3个端点,这与你的设备描述符设置不一致。你需要确保所有相关的描述符(如配置描述符、接口描述符、端点描述符等)都正确匹配

暖了夏天蓝了海 发表于 2024-10-10 03:00 | 显示全部楼层
HAL_PCDEx_PMAConfig函数中,你配置了多个端点。确保这些端点的地址和属性与你的设备描述符中的定义一致。例如,你在描述符中定义了端点0x820x01,但在HAL_PCDEx_PMAConfig中可能需要确保这些端点的配置正确

一秒落纱 发表于 2024-10-10 04:00 | 显示全部楼层
看看设备描述符在USB初始化过程中是否被正确加载。你可以通过调试工具(如ST-Link)单步调试USB初始化过程,确保设备描述符在正确的时机被加载。

夜阑风雨 发表于 2024-10-10 05:00 | 显示全部楼层
一般需要你使用的STM32Cube库版本与你的芯片兼容。有时,不同版本的库可能会有不同的默认配置或行为

远山寻你 发表于 2024-10-10 06:00 | 显示全部楼层
保证你的设备描述符是完整的,并且符合USB规范。你可以参考USB规范文档,确保每个字段的值都是正确的

光辉梦境 发表于 2024-10-10 07:00 | 显示全部楼层
在代码中添加更多的调试信息,记录USB初始化过程中的关键步骤和变量值。这可以帮助你更好地理解问题所在

光辉梦境 发表于 2024-10-10 08:00 | 显示全部楼层
一定要保证你的设备描述符中的端点地址和属性与实际配置一致

淡漠安然 发表于 2024-10-10 09:00 | 显示全部楼层
通过确保设备描述符的一致性、端点配置的正确性以及USB初始化过程的完整性,你应该能够解决设备识别问题。如果问题仍然存在,建议进一步调试USB初始化过程,并检查是否有其他代码片段影响了USB设备的配置

三生万物 发表于 2024-10-10 10:00 | 显示全部楼层
现在是枚举都失败吗?还是哪里失败

略略u 发表于 2024-10-11 21:46 来自手机 | 显示全部楼层
因为STM32CUBE 里没有自定义设
Stahan 发表于 2024-10-13 21:38 | 显示全部楼层
生成的文件得修改一下吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1031

主题

3980

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部