打印
[STM32F1]

STM32F103 USB 设备描述符问题请教

[复制链接]
1020|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,以避免与已知设备类型的冲突。

使用特权

评论回复
5
xionghaoyun| | 2024-8-21 09:05 | 只看该作者
一串英语看得头痛

使用特权

评论回复
6
别乱了阵脚| | 2024-10-9 21:13 | 只看该作者
在你的描述中,你遇到了STM32F103上USB自定义设备的问题,尽管你已经尝试修改设备描述符和端点配置,但设备仍然被识别为CDC设备,或者有时根本无法识别

使用特权

评论回复
7
江河千里| | 2024-10-10 02:00 | 只看该作者
确保你的设备描述符在整个代码中是一致的。你提到在USBD_LL_Init中强行指定了3个端点,这与你的设备描述符设置不一致。你需要确保所有相关的描述符(如配置描述符、接口描述符、端点描述符等)都正确匹配

使用特权

评论回复
8
暖了夏天蓝了海| | 2024-10-10 03:00 | 只看该作者
HAL_PCDEx_PMAConfig函数中,你配置了多个端点。确保这些端点的地址和属性与你的设备描述符中的定义一致。例如,你在描述符中定义了端点0x820x01,但在HAL_PCDEx_PMAConfig中可能需要确保这些端点的配置正确

使用特权

评论回复
9
一秒落纱| | 2024-10-10 04:00 | 只看该作者
看看设备描述符在USB初始化过程中是否被正确加载。你可以通过调试工具(如ST-Link)单步调试USB初始化过程,确保设备描述符在正确的时机被加载。

使用特权

评论回复
10
夜阑风雨| | 2024-10-10 05:00 | 只看该作者
一般需要你使用的STM32Cube库版本与你的芯片兼容。有时,不同版本的库可能会有不同的默认配置或行为

使用特权

评论回复
11
远山寻你| | 2024-10-10 06:00 | 只看该作者
保证你的设备描述符是完整的,并且符合USB规范。你可以参考USB规范文档,确保每个字段的值都是正确的

使用特权

评论回复
12
光辉梦境| | 2024-10-10 07:00 | 只看该作者
在代码中添加更多的调试信息,记录USB初始化过程中的关键步骤和变量值。这可以帮助你更好地理解问题所在

使用特权

评论回复
13
光辉梦境| | 2024-10-10 08:00 | 只看该作者
一定要保证你的设备描述符中的端点地址和属性与实际配置一致

使用特权

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

使用特权

评论回复
15
三生万物| | 2024-10-10 10:00 | 只看该作者
现在是枚举都失败吗?还是哪里失败

使用特权

评论回复
16
略略u| | 2024-10-11 21:46 | 只看该作者
因为STM32CUBE 里没有自定义设

使用特权

评论回复
17
Stahan| | 2024-10-13 21:38 | 只看该作者
生成的文件得修改一下吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

969

主题

2978

帖子

7

粉丝