打印
[USB编程]

stm32f10系列使用usb,d+直接接IO口可以吗?

[复制链接]
5346|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
danieljustice|  楼主 | 2014-6-19 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在使用stm32f10系列在学习usb,自己做了一块板,画板的时候d+没有使用三极管电路,而是直接连到一个IO口上去了。现在usb插上之后电脑能够检测到设备,但是安装不了驱动,请问是什么原因呢?
我检查了一下usb_desc.c下面的device、config、report的descriptor,没有发现什么问题。像我这种情况安装不了驱动是因为d+的电路问题,还是我的软件上配置错误了呢?下面是我的几个descriptor的配置。

/* USB Standard Device Descriptor */
const uint8_t CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC] =
{
    0x12,                       /*bLength */
    USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
    0x00,                       /*bcdUSB */
    0x02,
    0x00,                       /*bDeviceClass*/
    0x00,                       /*bDeviceSubClass*/
    0x00,                       /*bDeviceProtocol*/
    0x40,                       /*bMaxPacketSize40*/
    0x83,                       /*idVendor (0x0483)*/
    0x04,
    0x50,                       /*idProduct = 0x5750*/
    0x57,
    0x00,                       /*bcdDevice rel. 2.00*/
    0x02,
    1,                          /*Index of string descriptor describing manufacturer */
    2,                          /*Index of string descriptor describing product*/
    3,                          /*Index of string descriptor describing the device serial number */
    0x01                        /*bNumConfigurations*/
}; /* CustomHID_DeviceDescriptor */


/* USB Configuration Descriptor */
/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
{
    0x09, /* bLength: Configuation Descriptor size */
    USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
    CUSTOMHID_SIZ_CONFIG_DESC,
    /* wTotalLength: Bytes returned */
    0x00,
    0x01,         /* bNumInterfaces: 1 interface */
    0x01,         /* bConfigurationValue: Configuration value */
    0x00,         /* iConfiguration: Index of string descriptor describing
                                 the configuration*/
    0xC0,         /* bmAttributes: Bus powered */
                  /*Bus powered: 7th bit, Self Powered: 6th bit, Remote wakeup: 5th bit, reserved: 4..0 bits */
//    0x32,         /* MaxPower 100 mA: this current is used for detecting Vbus */
    0x96,         /* MaxPower 300 mA: this current is used for detecting Vbus */
    /************** Descriptor of Custom HID interface ****************/
    /* 09 */
    0x09,         /* bLength: Interface Descriptor size */
    USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */
    0x00,         /* bInterfaceNumber: Number of Interface */
    0x00,         /* bAlternateSetting: Alternate setting */
    0x02,         /* bNumEndpoints */
    0x03,         /* bInterfaceClass: HID */
    0x00,         /* bInterfaceSubClass : 1=BOOT, 0=no boot */
    0x00,         /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
    0,            /* iInterface: Index of string descriptor */
    /******************** Descriptor of Custom HID HID ********************/
    /* 18 */
    0x09,         /* bLength: HID Descriptor size */
    HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
    0x10,         /* bcdHID: HID Class Spec release number */
    0x01,
    0x00,         /* bCountryCode: Hardware target country */
    0x01,         /* bNumDescriptors: Number of HID class descriptors to follow */
    0x22,         /* bDescriptorType */
    CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */
    0x00,
    /******************** Descriptor of Custom HID endpoints ******************/
    /* 27 */
    0x07,          /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */

    0x82,          /* bEndpointAddress: Endpoint Address (IN) */               
                   // bit 3...0 : the endpoint number
                   // bit 6...4 : reserved
                    // bit 7     : 0(OUT), 1(IN)
    0x03,          /* bmAttributes: Interrupt endpoint */
    0x40,          /* wMaxPacketSize: 64 Bytes max */
    0x00,
    0x02,          /* bInterval: Polling Interval (2 ms) */
    /* 34 */
           
    0x07,        /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,        /* bDescriptorType: */
                        /*        Endpoint descriptor type */
    0x01,        /* bEndpointAddress: */
                        /*        Endpoint Address (OUT) */
    0x03,        /* bmAttributes: Interrupt endpoint */
    0x40,        /* wMaxPacketSize: 64 Bytes max  */
    0x00,
    0x02,        /* bInterval: Polling Interval (2 ms) */
    /* 41 */
}; /* CustomHID_ConfigDescriptor */
const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
{
        0x05, 0x8c, /* USAGE_PAGE (ST Page) */
        0x09, 0x01, /* USAGE (Demo Kit) */
        0xa1, 0x01, /* COLLECTION (Application) */
       
        // The Input report
        0x09,0x03, // USAGE ID - Vendor defined
        0x15,0x00, // LOGICAL_MINIMUM (0)
        0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
        0x75,0x08, // REPORT_SIZE (8bit)
        0x95,0x40, // REPORT_COUNT (64Byte)
        0x81,0x02, // INPUT (Data,Var,Abs)

        // The Output report
        0x09,0x04, // USAGE ID - Vendor defined
        0x15,0x00, // LOGICAL_MINIMUM (0)
        0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
        0x75,0x08, // REPORT_SIZE (8bit)
        0x95,0x40, // REPORT_COUNT (64Byte)
        0x91,0x02, // OUTPUT (Data,Var,Abs)

        0xc0 /* END_COLLECTION */
}; /* CustomHID_ReportDescriptor */
希望各位大神帮我看看,究竟是什么问题,感激不尽了~

相关帖子

沙发
danieljustice|  楼主 | 2014-6-23 08:49 | 只看该作者
我大概用了四种方法进行实验,只有两种成功。
第一种,把D+线先当作IO来用等待枚举成功再转换成USB数据功能。结果失败,能检测到USB设备但是读不了descriptor信息安装不了驱动。
第二种,把D+线接到另一个IO口上。结果失败,情况跟上一个一样。
第三种,把D+线通过一个1.5k的电阻接到另一个IO口上。成功。
第四种,按照标准接法,用一个IO口控制三极管基极,集电极接VBUS的5V电压,发射极通过一个1.5k上拉电阻接D+线。成功。
但是用呀呀usb的上位机,无法通讯,最后我从网上下载了这个上位机,成功通讯能收发数据

hid上位机.rar

9.13 KB

stm32 usb 上位机

使用特权

评论回复
板凳
djxf| | 2014-6-23 09:45 | 只看该作者
根据你的描述,感觉是D+没有上拉的原因。

使用特权

评论回复
地板
amwrdfe| | 2014-6-23 20:37 | 只看该作者
你不会直接把两个io连在一起吧。

使用特权

评论回复
5
danieljustice|  楼主 | 2014-6-25 08:49 | 只看该作者
amwrdfe 发表于 2014-6-23 20:37
你不会直接把两个io连在一起吧。

是啊,一开始直接连了。后来发现不行,还是加了一个电阻,就可以了

使用特权

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

本版积分规则

1

主题

3

帖子

0

粉丝