USB端点描述符中支持的最大包长度为0

海洋 2022-10-28 16:39:55 编辑

大家好,
我遇到的问题是这样的,STM32F107(支持全速)单片机做USB主机,把手机插入进来,点开手机的USB网络共享,获取到的设备描述符是这样的
0X09 0X02 0X4B 0X00 0X02 0X01 0X00 0X80 0XFA
0X08 0X0B 0X00 0X02 0XEF 0X04 0X01 0X0D
0X09 0X04 0X00 0X00 0X01 0XEF 0X04 0X01 0X0B
0X05 0X24 0X00 0X10 0X01
0X05 0X24 0X01 0X00 0X01
0X04 0X24 0X02 0X00
0X05 0X24 0X06 0X00 0X01
0X07 0X05 0X81 0X03 0X08 0X00 0X20
0X09 0X04 0X01 0X00 0X02 0X0A 0X00 0X00 0X0C
0X07 0X05 0X8E 0X02 0X00 0X00 0X00 (这里的端点最大包长度竟然是0,就是不允许我给这玩意发数据似的)
0X07 0X05 0X0F 0X02 0X00 0X00 0X00
其中CDC接口的数据接口端点描述符中最大包长度是0,相当于不允许发数据过去;这是接三星GS8手机的情况。
接华为、魅族之类的手机完全正常,端点最大包就是0x40,64字节,完全OK的。
开始我怀疑是因为我的主机端是全速,手机是个高速,有问题这样接,但其他华为之类的都OK,那应该就不是这个问题了。

USB中文网 2022-10-28 18:03:51 编辑

解析结果如下:

0x09,        // bLength
0x02,        // bDescriptorType (Configuration)
0x4B, 0x00,  // wTotalLength 75
0x02,        // bNumInterfaces 2
0x01,        // bConfigurationValue
0x00,        // iConfiguration (String Index)
0x80,        // bmAttributes
0xFA,        // bMaxPower 500mA

0x08,        // bLength
0x0B,        // bDescriptorType (Unknown) IAD
0x00, 0x02, 0xEF, 0x04, 0x01, 0x0D, 


0x09,        // bLength
0x04,        // bDescriptorType (Interface)
0x00,        // bInterfaceNumber 0
0x00,        // bAlternateSetting
0x01,        // bNumEndpoints 1
0xEF,        // bInterfaceClass
0x04,        // bInterfaceSubClass
0x01,        // bInterfaceProtocol
0x0B,        // iInterface (String Index)

0x05,        // bLength
0x24,        // bDescriptorType (Dependant on Type)
0x00, 0x10, 0x01, 
0x05,        // bLength
0x24,        // bDescriptorType (Dependant on Type)
0x01, 0x00, 0x01, 
0x04,        // bLength
0x24,        // bDescriptorType (Dependant on Type)
0x02, 0x00, 
0x05,        // bLength
0x24,        // bDescriptorType (Dependant on Type)
0x06, 0x00, 0x01, 
0x07,        // bLength
0x05,        // bDescriptorType (Endpoint)
0x81,        // bEndpointAddress (IN/D2H)
0x03,        // bmAttributes (Interrupt)
0x08, 0x00,  // wMaxPacketSize 8
0x20,        // bInterval 32 (unit depends on device speed)

0x09,        // bLength
0x04,        // bDescriptorType (Interface)
0x01,        // bInterfaceNumber 1
0x00,        // bAlternateSetting
0x02,        // bNumEndpoints 2
0x0A,        // bInterfaceClass
0x00,        // bInterfaceSubClass
0x00,        // bInterfaceProtocol
0x0C,        // iInterface (String Index)

0x07,        // bLength
0x05,        // bDescriptorType (Endpoint)
0x8E,        // bEndpointAddress (IN/D2H)
0x02,        // bmAttributes (Bulk)
0x00, 0x00,  // wMaxPacketSize 0
0x00,        // bInterval 0 (unit depends on device speed)

0x07,        // bLength
0x05,        // bDescriptorType (Endpoint)
0x0F,        // bEndpointAddress (OUT/H2D)
0x02,        // bmAttributes (Bulk)
0x00, 0x00,  // wMaxPacketSize 0
0x00,        // bInterval 0 (unit depends on device speed)

// 75 bytes

// best guess: USB Standard Descriptor