嵌入式以太网社区

?找回密码
?立即注册
搜索
365bet官网足球官方开户网利用Python来控制STM32365bet官网足球官方开户网365bet官网足球官方开户网
STM32高速USB数据传输方案,支持多系统!STM32全速USB数据传输方案,支持多系统!Flash高速烧写方案STM32 HID IAP/Bootloader升级方案
查看: 74254|bet365体-在线体育投注_365体育投注地址_365体育投注登录: 833
打印 上一主题 下一主题

STM32自定义USB设备开发详细流程讲解及全套资料源码下载(基于libusb)

? [复制链接]

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
跳转到指定楼层
楼主
发表于 2014-10-16 12:52:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 飞鸿踏雪 于 2017-3-17 09:42 编辑

前言
USB的用途就不多说了,下面的内容主要就是讲解如何利用ST提供的USB驱动库和libusb上位机驱动库实现一个USB数据传输功能,为了降低开发难度,我们仅仅讲解Bulk传输模式,当然这也是用得比较多的传输模式。

开发流程
1,完成STM32单片机端的USB程序;
2,利用libusb自带的inf-wizard工具生成USB驱动;
3,基于libusb编写USB通信程序;
4,测试PC和单片机的数据通信;

STM32程序编写
1,完成描述符的修改,修改后的描述符如下(在usb_desc.c文件中)
设备描述符:
[C] 纯文本查看 复制代码
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*/
    LOBYTE(USBD_VID),           /*idVendor*/
    HIBYTE(USBD_VID),           /*idVendor*/
    LOBYTE(USBD_PID),           /*idVendor*/
    HIBYTE(USBD_PID),           /*idVendor*/
    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 */


配置描述符:
[C] 纯文本查看 复制代码
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*/
    0xE0,         /* bmAttributes: Bus powered */
                  /*Bus powered: 7th bit, Self Powered: 6th bit, Remote wakeup: 5th bit, reserved: 4..0 bits */
    0xFA,         /* MaxPower 500 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 */
    0x04,         /* bNumEndpoints */
    0xDC,         /* bInterfaceClass: Class code = 0DCH */
    0xA0,         /* bInterfaceSubClass : Subclass code = 0A0H */
    0xB0,         /* nInterfaceProtocol : Protocol code = 0B0H */
    0,            /* iInterface: Index of string descriptor */
    /******************** endpoint descriptor ********************/
    /* 18 */
    0x07,         /* endpoint descriptor length = 07H */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* endpoint descriptor type = 05H */
    0x81,         /* endpoint 1 IN */
    0x02,                                        /* bulk transfer = 02H */
    0x40,0x00,    /* endpoint max packet size = 0040H */
    0x00,         /* the value is invalid when bulk transfer */

    0x07,         /* endpoint descriptor length = 07H */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* endpoint descriptor type = 05H */
    0x01,         /* endpoint 1 OUT */
    0x02,                                        /* bulk transfer = 02H */
    0x40,0x00,    /* endpoint max packet size = 0040H */
    0x00,         /* the value is invalid when bulk transfer */
                
    0x07,         /* endpoint descriptor length = 07H */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* endpoint descriptor type = 05H */
    0x82,         /* endpoint 2 IN */
    0x02,                                        /* bulk transfer = 02H */
    0x40,0x00,    /* endpoint max packet size = 0040H */
    0x00,         /* the value is invalid when bulk transfer */
                
    0x07,         /* endpoint descriptor length = 07H */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* endpoint descriptor type = 05H */
    0x02,         /* endpoint 2 OUT */
    0x02,                                        /* bulk transfer = 02H */
    0x40,0x00,    /* endpoint max packet size = 0040H */
    0x00,         /* the value is invalid when bulk transfer */
}; /* CustomHID_ConfigDescriptor */

配置描述符就包含了端点描述符,我们用了4个端点,两个BULK-OUT端点,两个BULK-IN端点。

其他的描述符:
[C] 纯文本查看 复制代码
/* USB String Descriptors (optional) */
const uint8_t CustomHID_StringLangID[CUSTOMHID_SIZ_STRING_LANGID] =
{
    CUSTOMHID_SIZ_STRING_LANGID,
    USB_STRING_DESCRIPTOR_TYPE,
    0x09,
    0x04
}; /* LangID = 0x0409: U.S. English */

const uint8_t CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR] =
{
    CUSTOMHID_SIZ_STRING_VENDOR, /* Size of Vendor string */
    USB_STRING_DESCRIPTOR_TYPE,  /* bDescriptorType*/
    // Manufacturer: "STMicroelectronics" 
    'M', 0, 'y', 0, 'U', 0,'S', 0,'B', 0, '_', 0, 'H', 0,'I',0,'D',0
};

const uint8_t CustomHID_StringProduct[CUSTOMHID_SIZ_STRING_PRODUCT] =
{
    CUSTOMHID_SIZ_STRING_PRODUCT,          /* bLength */
    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    'B', 0, 'y', 0, ' ', 0, 'e', 0, 'm', 0, 'b', 0,'e',0,'d',0,'-',0,'n',0,'e',0,'t',0
};
uint8_t CustomHID_StringSerial[CUSTOMHID_SIZ_STRING_SERIAL] =
{
    CUSTOMHID_SIZ_STRING_SERIAL,           /* bLength */
    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    'x', 0, 'x', 0, 'x', 0,'x', 0,'x', 0, 'x', 0, 'x', 0
};


2,根据端点缓冲区大小配置端点缓冲区地址,配置信息如下(在usb_conf.h文件中):
[C] 纯文本查看 复制代码
/* buffer table base address */
#define BTABLE_ADDRESS      (0x00)

/* EP0  */
/* rx/tx buffer base address */
#define ENDP0_RXADDR        (0x18)
#define ENDP0_TXADDR        (0x58)

/* EP1  */
/* tx buffer base address */
//地址为32位对其,位4的倍数,不能超过 bMaxPacketSize
//EP1
#define ENDP1_RXADDR        (0x98)
#define ENDP1_TXADDR        (0x98+64)
////EP2
#define ENDP2_RXADDR        (0xA0+64+64)
#define ENDP2_TXADDR        (0xA0+64+64+64)


3,初始化每个端点(在usb_prop.c文件中的CustomHID_Reset函数中)
[C] 纯文本查看 复制代码
  /* Initialize Endpoint 0 */
  SetEPType(ENDP0, EP_CONTROL);
  SetEPTxStatus(ENDP0, EP_TX_STALL);
  SetEPRxAddr(ENDP0, ENDP0_RXADDR);
  SetEPTxAddr(ENDP0, ENDP0_TXADDR);
  Clear_Status_Out(ENDP0);
  SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
  SetEPRxValid(ENDP0);

  /* Initialize Endpoint 1 */
         SetEPType(ENDP1, EP_BULK);
         SetEPRxAddr(ENDP1, ENDP1_RXADDR);
         SetEPTxAddr(ENDP1, ENDP1_TXADDR);
         SetEPRxCount(ENDP1, EP_SIZE);
         SetEPRxStatus(ENDP1, EP_RX_VALID);
   SetEPTxStatus(ENDP1, EP_TX_NAK);

  /* Initialize Endpoint 2 */
         SetEPType(ENDP2, EP_BULK);
         SetEPRxAddr(ENDP2, ENDP2_RXADDR);
         SetEPTxAddr(ENDP2, ENDP2_TXADDR);
         SetEPRxCount(ENDP2, EP_SIZE);
         SetEPRxStatus(ENDP2, EP_RX_VALID);
         SetEPTxStatus(ENDP2, EP_TX_NAK);


4,实现端点的回调函数(需要在usb_conf.h中注释掉对应的回调函数宏定义)
[C] 纯文本查看 复制代码
/*******************************************************************************
* Function Name  : EP1_OUT_Callback.
* Description    : EP1 OUT Callback Routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void EP1_OUT_Callback(void)
{
        EP1_ReceivedCount = GetEPRxCount(ENDP1);
        PMAToUserBufferCopy(USB_Receive_Buffer, ENDP1_RXADDR, EP1_ReceivedCount);
        SetEPRxStatus(ENDP1, EP_RX_VALID);
}
/*******************************************************************************
* Function Name  : EP2_OUT_Callback.
* Description    : EP2 OUT Callback Routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void EP2_OUT_Callback(void)
{
        EP2_ReceivedCount = GetEPRxCount(ENDP2);
        PMAToUserBufferCopy(USB_Receive_Buffer, ENDP2_RXADDR, EP2_ReceivedCount);
        SetEPRxStatus(ENDP2, EP_RX_VALID);
}


5,完成主函数的测试程序
[C] 纯文本查看 复制代码
int main(void)
{
        uint8_t data[256];
        uint32_t i=0;
        Set_System();//系统时钟初始化
        USART_Configuration();//串口1初始化
        printf("\x0c\0");printf("\x0c\0");//超级终端清屏
        printf("\033[1;40;32m");//设置超级终端背景为黑色,字符为绿色
        printf("\r\n*******************************************************************************");
        printf("\r\n************************ Copyright 2009-2012, EmbedNet ************************");
        printf("\r\n*************************** [url=http://www.embed-net.com]http://www.embed-net.com[/url] **************************");
        printf("\r\n***************************** All Rights Reserved *****************************");
        printf("\r\n*******************************************************************************");
        printf("\r\n");

        USB_Interrupts_Config();
        Set_USBClock();
        USB_Init();

        while(1)
        {
                if(EP1_ReceivedCount > 0){
                        USB_GetData(ENDP1,data,EP1_ReceivedCount);
                        USB_SendData(ENDP1,data,EP1_ReceivedCount);
                        printf("usb EP1 get data %d byte data\n\r",EP1_ReceivedCount);
                        for(i=0;i 0){
                        USB_GetData(ENDP2,data,EP2_ReceivedCount);
                        USB_SendData(ENDP2,data,EP2_ReceivedCount);
                        printf("usb EP2 get data %d byte data\n\r",EP2_ReceivedCount);
                        for(i=0;i


到此,STM32的程序基本上编写完成,然后编译下载程序,如果一切顺利,系统会检测到一个新的设备并试图加载对应的驱动,由于我们还没做驱动程序,所以肯定会加载驱动失败,如下图所示:


驱动程序生成
下面我们就利用libusb自带的inf-wizard工具生成USB驱动程序,该工具可以到本文章的附件下载,其具体过程如下:


运行该程序,出现下图对话框,点击“Next”;


出现下图对话框后选择我们需要生成驱动程序的设备;


这里可以写该Device Name,我们保持默认值,其他的都不需要修改;


点击Next后出现下图对话框,我们选择一个目录保存这个inf文件;


保存后的文件


若要立即安装驱动,可以点击下面对话框的红色框按钮;


Win7下可能会出现如下对话框,点击始终安装;


到此,USB驱动程序自动生成完毕,若安装了驱动,则在设备管理器里面会看到如下信息


基于libusb的上位机驱动程序编写
首先建立一个驱动程序工程,然后将libusb的库(附件有下载)添加到工程里面,编写以下几个函数
设备扫描函数,该函数用来找到插入电脑上的USB设备
[C] 纯文本查看 复制代码
/**
  * @brief  扫描设备连接数
  * @param  NeedInit 是否需要初始化,第一次调用该函数需要初始化
  * @retval 识别到的指定设备个数
  */
int __stdcall USBScanDev(int NeedInit)
{
        if(NeedInit){
                usb_init(); /* initialize the library */
                usb_find_busses(); /* find all busses */
                usb_find_devices(); /* find all connected devices */
        }
        return scan_dev(pBoard);
}


打开设备
[C] 纯文本查看 复制代码
/**
  * @brief  打开指定的USB设备
  * @param  devNum        需要打开的设备号
  * @retval 打开状态
  */
int __stdcall USBOpenDev(int DevIndex)
{
        pBoardHandle[DevIndex] = open_dev(DevIndex,pBoard);
        if(pBoardHandle[DevIndex]==NULL){
                return SEVERITY_ERROR;
        }else{
                return SEVERITY_SUCCESS;
        }
}


关闭设备
[C] 纯文本查看 复制代码
/**
  * @brief  关闭指定的USB设备
  * @param  devNum        需要关闭的设备号
  * @retval 打开状态
  */
int __stdcall USBCloseDev(int DevIndex)
{
        return close_dev(DevIndex,pBoardHandle);
}


BULK端点写数据
[C] 纯文本查看 复制代码
/**
  * @brief  USB Bulk端点写数据
  * @param  nBoardID 设备号
  * @param  pipenum 端点号
  * @param  sendbuffer 发送数据缓冲区
  * @param  len 发送数据字节数
  * @param  waittime 超时时间
  * @retval 成功发送的数据字节数
  */

int __stdcall USBBulkWriteData(unsigned int nBoardID,int pipenum,char *sendbuffer,int len,int waittime)
{
        int ret=0;
        if(pBoardHandle[nBoardID] == NULL){
                return SEVERITY_ERROR;
        }
#ifdef TEST_SET_CONFIGURATION
    if (usb_set_configuration(pBoardHandle[nBoardID], MY_CONFIG) < 0)
    {
        usb_close(pBoardHandle[nBoardID]);
        return SEVERITY_ERROR;
    }
#endif

#ifdef TEST_CLAIM_INTERFACE
    if (usb_claim_interface(pBoardHandle[nBoardID], 0) < 0)
    {
        usb_close(pBoardHandle[nBoardID]);
        return SEVERITY_ERROR;
    }
#endif

#if TEST_ASYNC
    // Running an async write test
    ret = transfer_bulk_async(dev, pipenum, sendbuffer, len, waittime);
#else
        ret = usb_bulk_write(pBoardHandle[nBoardID], pipenum, sendbuffer, len, waittime);
        /*if((len%64) == 0){
                usb_bulk_write(pBoardHandle[nBoardID], pipenum, sendbuffer, 0, waittime);
        }*/
#endif
#ifdef TEST_CLAIM_INTERFACE
    usb_release_interface(pBoardHandle[nBoardID], 0);
#endif
    return ret;
}


BULK端点读数据
[C] 纯文本查看 复制代码
/**
  * @brief  USB Bulk读数据
  * @param  nBoardID 设备号
  * @param  pipenum 端点号
  * @param  readbuffer 读取数据缓冲区
  * @param  len 读取数据字节数
  * @param  waittime 超时时间
  * @retval 读到的数据字节数
  */
int __stdcall USBBulkReadData(unsigned int nBoardID,int pipenum,char *readbuffer,int len,int waittime)
{
        int ret=0;
        if(pBoardHandle[nBoardID] == NULL){
                return SEVERITY_ERROR;
        }
#ifdef TEST_SET_CONFIGURATION
    if (usb_set_configuration(pBoardHandle[nBoardID], MY_CONFIG) < 0)
    {
        usb_close(pBoardHandle[nBoardID]);
        return SEVERITY_ERROR;
    }
#endif

#ifdef TEST_CLAIM_INTERFACE
    if (usb_claim_interface(pBoardHandle[nBoardID], 0) < 0)
    {
        usb_close(pBoardHandle[nBoardID]);
        return SEVERITY_ERROR;
    }
#endif

#if TEST_ASYNC
    // Running an async read test
    ret = transfer_bulk_async(pGinkgoBoardHandle[nBoardID], pipenum, sendbuffer, len, waittime);
#else
        ret = usb_bulk_read(pBoardHandle[nBoardID], pipenum, readbuffer, len, waittime);
#endif
#ifdef TEST_CLAIM_INTERFACE
    usb_release_interface(pBoardHandle[nBoardID], 0);
#endif
    return ret;
}


到此,PC端的驱动程序编写基本完成,下面就是驱动程序的测试,我们可以把之前这个程序生成为一个dll文件,然后单独建立一个测试工程来测试这个dll文件中的函数,测试程序如下:
[C] 纯文本查看 复制代码
// USB_DriverTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#define        EP1_OUT_SIZE        64
#define        EP1_IN_SIZE        64

int _tmain(int argc, _TCHAR* argv[])
{
        int DevNum;
        int ret;
        char WriteTestData[256]={1,2,3,4,5,6,7,8,9};
        char ReadTestData[256]={0};
        for(int i=0;i<256;i++){
                WriteTestData[i] = i;
        }
        //扫描设备连接数,需要初始化
        DevNum = USBScanDev(1);
        printf("设备连接数为:%d\n",DevNum);
        //打开设备0
        ret = USBOpenDev(0);
        if(ret == SEVERITY_ERROR){
                printf("打开设备失败!\n");
                return SEVERITY_ERROR;
        }else{
                printf("打开设备成功!\n");
        }

        //端点1写数据
        ret = USBBulkWriteData(0,EP1_OUT,WriteTestData,EP1_OUT_SIZE,500);
        if(ret != EP1_OUT_SIZE){
                printf("端点1写数据失败!%d\n",ret);
                return SEVERITY_ERROR;
        }else{
                printf("端点1写数据成功!\n");
        }
        //端点1读数据
        ret = USBBulkReadData(0,EP1_IN,ReadTestData,EP1_IN_SIZE,500);
        if(ret != EP1_IN_SIZE){
                printf("端点1读数据失败!%d\n",ret);
                return SEVERITY_ERROR;
        }else{
                printf("端点1读数据成功!\n");
                for(int i=0;i


到此,整个开发流程基本完成,下面是本套程序的测试图片

串口打印输出


PC端测试程序输出


Bus Hound抓取到的USB数据


程序源码下载
libusb驱动生成工具下载: inf_tool.rar (778.26 KB, 下载次数: 4076)
STM32程序源码下载: USB_DriverSTM32F103.rar (677.81 KB, 下载次数: 1946, 售价: 30 金币)
PC端USB驱动下载: USB Driver.rar (266.56 KB, 下载次数: 3059)
PC端USB驱动程序源码下载: USB_DriverBulk.rar (20.61 KB, 下载次数: 1427, 售价: 30 金币)
PC端USB驱动测试程序源码下载: USB_DriverTest.rar (12.34 KB, 下载次数: 1453, 售价: 30 金币)
libusb驱动包下载: libusb-win32-bin-1.2.6.0.rar (821.57 KB, 下载次数: 3803)
人生到处知何似,应似飞鸿踏雪泥。

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
推荐
?楼主| 发表于 2014-11-27 22:15:53 | 只看该作者
dytrhjl@163.com 发表于 2014-11-27 19:20
楼主问个初级问题请不要见笑。
编写完下位机后,要编写驱动,看到驱动方法很简单,但是之后编写动态库那段 ...

其实你用libusb,对usb操作细节都可以不管的,你直接调用libusb的库(dll)就可以查找设备,打开设备,对设备进行数据传输,所以最难的部分libusb都已经帮你搞定
人生到处知何似,应似飞鸿踏雪泥。

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
推荐
?楼主| 发表于 2014-10-17 20:38:38 | 只看该作者
Bluesky 发表于 2014-10-17 17:04
楼主的VC程序是哪个版本的VS写的啊?

VS2010
人生到处知何似,应似飞鸿踏雪泥。

56

帖子

3

主题

66

金币

注册会员

Rank: 2

积分
156
推荐
发表于 2014-10-16 13:27:25 | 只看该作者
USB设备的描述,
发送数据的多少,
稳定性,
这些都决定USB的产品应用

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
推荐
?楼主| 发表于 2017-3-1 14:33:10 | 只看该作者
Racler 发表于 2017-3-1 14:12
用这个库 在 安卓下的稳定度和速度 怎样才能提高,还使用超过10小时这样,有出现数据间断,需要重启usb设备 ...

这个库本身是非常稳定的,当然也可能会因为对库的使用不当而不稳定,USB通信不仅仅是主机程序的问题,设备端的程序没写好也会导致通信不稳定,所以是一个综合性问题。Libusb不方便直接在安卓上使用,论坛里面有在安卓端的驱动程序源码,你可以找下
人生到处知何似,应似飞鸿踏雪泥。

27

帖子

0

主题

26

金币

注册会员

Rank: 2

积分
89
推荐
发表于 2015-10-26 17:49:45 | 只看该作者
其实你用libusb,对usb操作细节都可以不管的,你直接调用libusb的库(dll)就可以查找设备,打开设备,对设备进行数据传输,所以最难的部分libusb都已经帮你搞定

6

帖子

0

主题

27

金币

新手上路

Rank: 1

积分
35
推荐
发表于 2015-7-10 21:02:19 | 只看该作者
本帖最后由 martin1986 于 2015-7-10 22:08 编辑

你好,我刚接触上位机编程,对很多东西不很了解,可能遇到的问题很低级,敬请见谅。在调试 PC端USB驱动测试程序 的时候程序提示??"应用程序无法正常启动(0xc000007b)。请单击“确定”关闭应用程序。" 请问这可能是什么原因?会不会是 lib 和 dll 文件没有正确加到工程中?

5

帖子

1

主题

939

金币

高级会员

Rank: 4

积分
944
推荐
发表于 2014-11-27 19:20:39 | 只看该作者
楼主问个初级问题请不要见笑。
编写完下位机后,要编写驱动,看到驱动方法很简单,但是之后编写动态库那段编程应该怎么理解?

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
推荐
?楼主| 发表于 2014-11-24 09:22:35 | 只看该作者
dytrhjl@163.com 发表于 2014-11-23 20:32
在百度上看到的,不能下载,找了好久才找到这里,这个是我看到的最好的一个例子。谢谢。
说说stm32usb学习 ...

说实话,USB的工作流程确实比较复杂,本人也是半桶水,这个例程只是在宏观上进行了简单的讲解,需要知道USB通信细节确实需要看专门的资料才行。
人生到处知何似,应似飞鸿踏雪泥。

5

帖子

1

主题

939

金币

高级会员

Rank: 4

积分
944
推荐
发表于 2014-11-23 20:32:12 | 只看该作者
在百度上看到的,不能下载,找了好久才找到这里,这个是我看到的最好的一个例子。谢谢。
说说stm32usb学习,本人是一点经验都没有直接上的,难度真的很大,主要问题是没有好的学习资料,圈圈讲的很好,可惜对stm32讲的就很少,我需要知道程序运行的流程,不懂得再去学习,在不懂流程的情况下真的不知道如何下手。文章要是在流程上再详细讲下就好了,懂usb的不在乎也不会看,不懂得就真的要从零开始。再次感谢

4

帖子

0

主题

8

金币

新手上路

Rank: 1

积分
12
推荐
发表于 2014-11-13 15:28:34 | 只看该作者
好贴!感谢了!下载去了!!!!

56

帖子

3

主题

66

金币

注册会员

Rank: 2

积分
156
沙发
发表于 2014-10-16 13:15:39 | 只看该作者
很全面,很详细,记忆犹新

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
板凳
?楼主| 发表于 2014-10-16 13:23:34 | 只看该作者
Racler 发表于 2014-10-16 13:15
很全面,很详细,记忆犹新

手里面还有很多资源,等整理好了都共享出来...
人生到处知何似,应似飞鸿踏雪泥。

56

帖子

3

主题

66

金币

注册会员

Rank: 2

积分
156
5#
发表于 2014-10-16 13:30:01 | 只看该作者
好好,大家努力打造中国USB公益学习平台

56

帖子

3

主题

66

金币

注册会员

Rank: 2

积分
156
6#
发表于 2014-10-16 13:30:28 | 只看该作者
我的也在赶快整理当中

3

帖子

0

主题

11

金币

新手上路

Rank: 1

积分
14
7#
发表于 2014-10-16 14:13:34 | 只看该作者
好贴必须赞一个。

26

帖子

0

主题

195

金币

新手上路

Rank: 1

积分
221
8#
发表于 2014-10-16 15:52:54 | 只看该作者
真心的不错,赞一个

1

帖子

0

主题

5

金币

新手上路

Rank: 1

积分
6
9#
发表于 2014-10-17 17:04:35 | 只看该作者
楼主的VC程序是哪个版本的VS写的啊?

3

帖子

0

主题

7

金币

新手上路

Rank: 1

积分
10
11#
发表于 2014-11-8 17:23:20 | 只看该作者
楼主,您真是及时雨啊,太感谢了!

3

帖子

0

主题

7

金币

新手上路

Rank: 1

积分
10
12#
发表于 2014-11-8 17:26:39 | 只看该作者
楼主,能问下这个能达到多大USB速度?

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
13#
?楼主| 发表于 2014-11-8 18:38:49 | 只看该作者
linzhihao82 发表于 2014-11-8 17:26
楼主,能问下这个能达到多大USB速度?

我做过读写速度最大可达800KByte/s的样子,还包括数据处理
人生到处知何似,应似飞鸿踏雪泥。

3

帖子

0

主题

7

金币

新手上路

Rank: 1

积分
10
14#
发表于 2014-11-10 09:28:32 | 只看该作者
楼主,800KByte/s相当不错了!

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
15#
?楼主| 发表于 2014-11-10 10:26:37 | 只看该作者
linzhihao82 发表于 2014-11-10 09:28
楼主,800KByte/s相当不错了!

是的,但是必须要一次性发送大量的数据,比如10K或者5K的数据,否则还是很难达到这个速度的
人生到处知何似,应似飞鸿踏雪泥。

1

帖子

0

主题

5

金币

新手上路

Rank: 1

积分
6
21#
发表于 2014-12-2 23:26:02 来自手机 | 只看该作者
我用了和楼主差不多的方案 不知道楼主有没有遇到速度慢的问题 http://bbs.21ic.com/forum.php?mod=viewthread&tid=842894&mobile=yes 希望楼主可以有时间帮忙看一下

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
22#
?楼主| 发表于 2014-12-3 09:33:03 | 只看该作者
tianchangming 发表于 2014-12-2 23:26
我用了和楼主差不多的方案 不知道楼主有没有遇到速度慢的问题 http://bbs.21ic.com/forum.php?mod=viewthre ...

你给的链接打开不是帖子的链接,根据我的经验,如果你用Bulk传输模式速度还慢的话,估计是一次只发送了不大于64字节的数据,libusb可以一次发送大于64字节数据的,底层会自动分包,比如我实际测试中,每次发送2K数据,这样传输速度很容易就上到了700KByte/s以上的速度!
人生到处知何似,应似飞鸿踏雪泥。

4

帖子

0

主题

14

金币

新手上路

Rank: 1

积分
18
23#
发表于 2014-12-5 16:36:10 | 只看该作者
好资料,学习一下。

8

帖子

1

主题

67

金币

注册会员

Rank: 2

积分
75
24#
发表于 2014-12-8 09:58:29 | 只看该作者
版主,我用你的程序测试了,出现了小问题,数据小于0x80没有问题,当我发送的数据大于等于0x80时,stm32f103串口数据输出没有问题,pc输出数据就有问题了,比如下发为0x80,pc输出为ffffff80,bus hound 看到的数据也没有问题,没有想明白为什么,pc测试程序没有改动,只是把发送数据变动了一下,望版主能指导一下

8

帖子

1

主题

67

金币

注册会员

Rank: 2

积分
75
25#
发表于 2014-12-8 10:21:32 | 只看该作者
yixuange 发表于 2014-12-8 09:58
版主,我用你的程序测试了,出现了小问题,数据小于0x80没有问题,当我发送的数据大于等于0x80时,stm32f10 ...

自己bet365体-在线体育投注_365体育投注地址_365体育投注登录吧,是我基本语法没有学好,打扰版主了

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
26#
?楼主| 发表于 2014-12-8 21:09:38 | 只看该作者
yixuange 发表于 2014-12-8 10:21
自己bet365体-在线体育投注_365体育投注地址_365体育投注登录吧,是我基本语法没有学好,打扰版主了

人生到处知何似,应似飞鸿踏雪泥。

4

帖子

0

主题

181

金币

注册会员

Rank: 2

积分
189
27#
发表于 2014-12-20 01:04:54 | 只看该作者
LZ 有 Bus Hound 的 link 吗? (百度网盘)

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
28#
?楼主| 发表于 2014-12-20 09:57:09 | 只看该作者
jarodz 发表于 2014-12-20 01:04
LZ 有 Bus Hound 的 link 吗? (百度网盘)

网上一搜一大把
人生到处知何似,应似飞鸿踏雪泥。

7

帖子

0

主题

24

金币

新手上路

Rank: 1

积分
31
30#
发表于 2014-12-31 10:41:19 | 只看该作者
楼主 我移植了你的程序? ?STM32在电脑上不显示驱动的名字??是无法识别USB??

板子是STM32F103RCT6??

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
31#
?楼主| 发表于 2014-12-31 11:07:39 | 只看该作者
WendellSun 发表于 2014-12-31 10:41
楼主 我移植了你的程序? ?STM32在电脑上不显示驱动的名字??是无法识别USB??

板子是STM32F103RCT6

USB总线上的上拉电阻有没有加?
人生到处知何似,应似飞鸿踏雪泥。

7

帖子

0

主题

24

金币

新手上路

Rank: 1

积分
31
32#
发表于 2014-12-31 11:16:31 | 只看该作者
飞鸿踏雪 发表于 2014-12-31 11:07
USB总线上的上拉电阻有没有加?

不是 我下载了你原装的程序??更改一下device 就可以

现在插上显示的是 获取描述符错误??移植的时候把你的源码直接拷贝 过去的??没有更改??

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
33#
?楼主| 发表于 2014-12-31 12:23:51 | 只看该作者
WendellSun 发表于 2014-12-31 11:16
不是 我下载了你原装的程序??更改一下device 就可以

现在插上显示的是 获取描述符错误??移植的时候把 ...

你是用的什么芯片?不同的芯片可能不一样哟
人生到处知何似,应似飞鸿踏雪泥。

7

帖子

0

主题

24

金币

新手上路

Rank: 1

积分
31
34#
发表于 2014-12-31 14:34:23 | 只看该作者
飞鸿踏雪 发表于 2014-12-31 12:23
你是用的什么芯片?不同的芯片可能不一样哟

用的是STM32F103RCT6? ?直接用你的项目编译来的是可以??能够显示标示符


我自己用的STM32库是??3.5的??用了你的usn-fs文件夹? ?还有user下的文件??编译出来显示获取标示符错误??

这个你猜测是哪方面的原因呢?

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
35#
?楼主| 发表于 2014-12-31 17:44:59 | 只看该作者
WendellSun 发表于 2014-12-31 14:34
用的是STM32F103RCT6? ?直接用你的项目编译来的是可以??能够显示标示符

USB库文件不一样?
人生到处知何似,应似飞鸿踏雪泥。

7

帖子

0

主题

24

金币

新手上路

Rank: 1

积分
31
36#
发表于 2014-12-31 20:46:48 | 只看该作者

库文件也没看到有啥不一样啊…………

3

帖子

0

主题

16

金币

新手上路

Rank: 1

积分
19
37#
发表于 2015-1-5 21:31:16 | 只看该作者
楼主,我已经用JLINK下载了程序到神州STM32开发板,但是电脑没有任何反应,就连未知设备的提醒都没有。我是用用一根USB线把板子和电脑连接,是我的这种硬件连接有问题吗,还是说需要用板子的PA11和PA12管脚(在我的板子上USBDM和USBDP的复用),谢谢

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
38#
?楼主| 发表于 2015-1-5 23:19:23 | 只看该作者
王丹彤 发表于 2015-1-5 21:31
楼主,我已经用JLINK下载了程序到神州STM32开发板,但是电脑没有任何反应,就连未知设备的提醒都没有。我是 ...

应该是上拉电阻没接,在USB数据线上需要接一个上拉电阻,你检查下是否接好
人生到处知何似,应似飞鸿踏雪泥。

11

帖子

0

主题

88

金币

注册会员

Rank: 2

积分
99
39#
发表于 2015-1-17 01:34:44 | 只看该作者
Very good, nice job !!!

5

帖子

0

主题

8

金币

新手上路

Rank: 1

积分
15
40#
发表于 2015-1-28 09:46:08 | 只看该作者
感谢楼主无私奉献!

5

帖子

0

主题

8

金币

新手上路

Rank: 1

积分
15
41#
发表于 2015-1-28 13:31:07 | 只看该作者
请教楼主一个问题,使用的是STM32F103,ENP1发送,ENP2接收,USB已经可以接收,使用BUS HOUND进行调试时,从PC发送到设备ENP2可以,但设备的ENP1回来的的信息,BUS HOUND无法自动显示,需要RUN一下ENP1才能出一次数据,请问这是啥问题?
我怎么才能持续传输数据呀?谢谢!

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
42#
?楼主| 发表于 2015-1-28 17:26:37 | 只看该作者
joysingz 发表于 2015-1-28 13:31
请教楼主一个问题,使用的是STM32F103,ENP1发送,ENP2接收,USB已经可以接收,使用BUS HOUND进行调试时,从PC发 ...

要点击下RUN才显示这个是BUS HOUND的问题,USB数据传输都是由主机发起,你可以做一个简单的协议,比如主机发送某个数据后,从机若接收到这个数据,则返回相关数据,主机也调用读数据函数获取设备返回的数据。
人生到处知何似,应似飞鸿踏雪泥。

5

帖子

0

主题

8

金币

新手上路

Rank: 1

积分
15
43#
发表于 2015-1-29 15:36:45 | 只看该作者
飞鸿踏雪 发表于 2015-1-28 17:26
要点击下RUN才显示这个是BUS HOUND的问题,USB数据传输都是由主机发起,你可以做一个简单的协议,比如主 ...

利用您的程序,弄出来了,十分感谢!!如果关于USB的PC端驱动也弄一个详细解释版本就好了

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
44#
?楼主| 发表于 2015-1-30 09:49:46 | 只看该作者
joysingz 发表于 2015-1-29 15:36
利用您的程序,弄出来了,十分感谢!!如果关于USB的PC端驱动也弄一个详细解释版本就好了

这个不是已经包含了PC端的驱动设计了吗?
人生到处知何似,应似飞鸿踏雪泥。

5

帖子

0

主题

8

金币

新手上路

Rank: 1

积分
15
45#
发表于 2015-1-31 16:38:11 | 只看该作者
飞鸿踏雪 发表于 2015-1-30 09:49
这个不是已经包含了PC端的驱动设计了吗?

只能利用您给的程序,修改VID以及PID,然后利用读写数据的函数,对具体的理解还是不够深入,如果您能再整理一下就好啦!谢谢!怒赞您一个先

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
46#
?楼主| 发表于 2015-1-31 23:31:33 | 只看该作者
joysingz 发表于 2015-1-31 16:38
只能利用您给的程序,修改VID以及PID,然后利用读写数据的函数,对具体的理解还是不够深入,如果您能再整理一 ...

libusb是一个开源的USB驱动,你可以去下载源码下来好好研究下
人生到处知何似,应似飞鸿踏雪泥。

1

帖子

0

主题

12

金币

新手上路

Rank: 1

积分
13
47#
发表于 2015-2-4 11:05:23 | 只看该作者
楼主,你好,请问你测试一次发送10K数据的时候,是直接调用USBBulkWriteData(0,EP1_OUT,WriteTestData,10*1024,500);将数据长度设置为10K吗,我看STM32的程序里面端点的长度设置的是64byte,这样能行吗,会分成很多帧顺序接收吗?

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
48#
?楼主| 发表于 2015-2-4 22:05:58 | 只看该作者
zhangc20 发表于 2015-2-4 11:05
楼主,你好,请问你测试一次发送10K数据的时候,是直接调用USBBulkWriteData(0,EP1_OUT,WriteTestData,10*1 ...

可以的,USB底层会分多帧接收数据,这样传输数据会很大的提高效率!
人生到处知何似,应似飞鸿踏雪泥。

1

帖子

0

主题

8

金币

新手上路

Rank: 1

积分
9
49#
发表于 2015-2-12 18:08:08 | 只看该作者
赞赞赞!!! 有问题想LZ请教 希望多指导。

8

帖子

0

主题

205

金币

中级会员

Rank: 3Rank: 3

积分
223
50#
发表于 2015-3-17 12:20:02 | 只看该作者
谢谢版主的精彩分享,值得学习!usb对我们新手来说是个很大的难点。

56

帖子

3

主题

66

金币

注册会员

Rank: 2

积分
156
51#
发表于 2015-3-25 15:27:51 | 只看该作者
软件使用的大家可要多多 阅读网上的PDF呀

7

帖子

0

主题

30

金币

新手上路

Rank: 1

积分
37
52#
发表于 2015-5-19 23:29:21 | 只看该作者
想问楼主3个问题:
1、系统时钟和USB时钟都设成72MHz了吗?
2、既然是USB应用,为何要设置USART?
3、好像对PA口做了一些设置,PA口还能另行使用吗?

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
53#
?楼主| 发表于 2015-5-21 17:10:10 | 只看该作者
gddscy 发表于 2015-5-19 23:29
想问楼主3个问题:
1、系统时钟和USB时钟都设成72MHz了吗?
2、既然是USB应用,为何要设置USART?

1,系统时钟是72M,USB时钟是单独的,好像是48M;
2,USART口只是通过串口打印输出程序执行的一些结果和数据,方便调试,比如USB发送了数据到芯片,芯片接收到数据后你是无法直接观看到的,所以我用串口打印输出,这样我就知道USB接收到了什么程序;
3,STM32的每个口都是可以单独配置工作的,一般来说,只要引脚不冲突,每个引脚是可以独立使用和控制的
人生到处知何似,应似飞鸿踏雪泥。

7

帖子

0

主题

30

金币

新手上路

Rank: 1

积分
37
55#
发表于 2015-5-21 22:19:31 | 只看该作者
PA11、PA12应该是用作USBDM、USBDP,是吗?

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
56#
?楼主| 发表于 2015-5-22 09:24:07 | 只看该作者
gddscy 发表于 2015-5-21 22:19
PA11、PA12应该是用作USBDM、USBDP,是吗?

如果你注释掉串口初始化配置函数,而程序里面你又用到了串口的相关操作,比如打印输出,这时程序公正会不正常,所以导致USB也工作不正常,串口没有硬件流控制的时候,CTS和RTS是没用的,只用到了TX和RX引脚。
人生到处知何似,应似飞鸿踏雪泥。

2

帖子

0

主题

13

金币

新手上路

Rank: 1

积分
15
57#
发表于 2015-5-22 16:15:21 | 只看该作者
mark,这个帖子参考了,感谢楼主的贡献

7

帖子

0

主题

30

金币

新手上路

Rank: 1

积分
37
58#
发表于 2015-5-23 23:32:26 | 只看该作者
我又把所有的printf注释掉后程序正常了,多谢楼主

7

帖子

0

主题

30

金币

新手上路

Rank: 1

积分
37
59#
发表于 2015-5-23 23:34:17 | 只看该作者
3、PA11、PA12用作USBDM、USBDP,是吗?
这些脚都不能用作IO了吧?

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
60#
?楼主| 发表于 2015-5-25 09:34:12 | 只看该作者
gddscy 发表于 2015-5-23 23:34
3、PA11、PA12用作USBDM、USBDP,是吗?
这些脚都不能用作IO了吧?

肯定的啊,你用成USB数据通信引脚了再用作GPIO肯定会影响USB数据通信啊
人生到处知何似,应似飞鸿踏雪泥。

2

帖子

1

主题

16

金币

新手上路

Rank: 1

积分
18
61#
发表于 2015-6-17 10:36:00 | 只看该作者
可以有WDM编写驱动的例子吗

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
62#
?楼主| 发表于 2015-6-17 12:15:51 | 只看该作者
jiawang 发表于 2015-6-17 10:36
可以有WDM编写驱动的例子吗

没有,只要能达到目的,用什么方式实现有啥关系呢?
人生到处知何似,应似飞鸿踏雪泥。

1

帖子

0

主题

16

金币

新手上路

Rank: 1

积分
17
63#
发表于 2015-6-24 09:48:09 | 只看该作者
马克? ?? ?? ?? ? 留名

3

帖子

0

主题

14

金币

新手上路

Rank: 1

积分
17
64#
发表于 2015-6-24 19:07:55 | 只看该作者
本帖最后由 wxxw1955 于 2015-6-24 19:15 编辑

唯独我提示“端点1写数据失败! -116”??
刚下了上位机和下位机程序,没改,直接运行,怎么回事 -116表示什么

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
65#
?楼主| 发表于 2015-6-24 21:33:19 | 只看该作者
wxxw1955 发表于 2015-6-24 19:07
唯独我提示“端点1写数据失败! -116”??
刚下了上位机和下位机程序,没改,直接运行,怎么回事 -116表 ...

可正常安装驱动?
人生到处知何似,应似飞鸿踏雪泥。

3

帖子

0

主题

14

金币

新手上路

Rank: 1

积分
17
66#
发表于 2015-6-25 17:34:48 | 只看该作者
驱动是没问题的,设备管理中可以看到,程序也会有 打开设备成功!的提示

今天来公司第一次试,可以的,
关掉,再打开又不行的,仍是-116
又试了多再试,又可以的了,
昨天是死活都一直是端点1写数据失败! -116,

这种不稳定性麻烦啊

直接通过窗口右上角的"X"强行关掉会不会有问题,是不是一定要在程序窗口中输任意键?
但这两周关掉方法都有去试了多次,找不到规律

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
67#
?楼主| 发表于 2015-6-26 09:30:50 | 只看该作者
wxxw1955 发表于 2015-6-25 17:34
驱动是没问题的,设备管理中可以看到,程序也会有 打开设备成功!的提示

今天来公司第一次试,可以的,
...

强行关闭程序有可能会有问题的,我大概知道你是怎么回事了,是不是你程序一直在读写数据?然后你强制关闭程序,然后再运行程序就出错了?如果是这样,其实就是PC程序和单片机程序没配合好导致,比如单片机程序调用了端点发送数据函数,如果PC端没调用相应的端点读数据函数,单片机端程序可能会一直处于发送状态,如果你PC程序这时候再重新运行,可能就会导致你说的这些问题,比较好的验证办法就是,PC程序关闭,单片机重新上电,然后再试试
人生到处知何似,应似飞鸿踏雪泥。

6

帖子

0

主题

39

金币

新手上路

Rank: 1

积分
45
68#
发表于 2015-6-29 15:35:16 | 只看该作者
我想问下,如果我自己写好了上位机软件,用QT写的,驱动什么的我也拿了一个U盘试着安装了一下,也能读到各种ID号。有什么办法能测试一下我自己写的读写函数么?
谢谢楼主。

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
69#
?楼主| 发表于 2015-6-29 16:20:33 | 只看该作者
xjjyzmb 发表于 2015-6-29 15:35
我想问下,如果我自己写好了上位机软件,用QT写的,驱动什么的我也拿了一个U盘试着安装了一下,也能读到各 ...

一般是需要USB设备来配合测试的,比如一个单片机程序,当然你也可以试试读取标准的设备,比如鼠标和键盘什么的,但是你得了解应该读取什么端点,每次应该读取多少字节数据,这可能需要去了解下HID协议
人生到处知何似,应似飞鸿踏雪泥。

3

帖子

0

主题

10

金币

新手上路

Rank: 1

积分
15
70#
发表于 2015-6-30 14:20:20 | 只看该作者
xuexile ,看来还得学习usb的流程啊

3

帖子

0

主题

14

金币

新手上路

Rank: 1

积分
17
71#
发表于 2015-6-30 17:54:32 | 只看该作者
飞鸿踏雪 发表于 2015-6-26 09:30
强行关闭程序有可能会有问题的,我大概知道你是怎么回事了,是不是你程序一直在读写数据?然后你强制关闭 ...

我实际需求是stm32一直进行语音采集,并往USB写,所以数据量还是挺大的。有什么 控制接口,比如在上位机中复位下位机usb之类的,
谢谢LZ的bet365体-在线体育投注_365体育投注地址_365体育投注登录

6

帖子

0

主题

39

金币

新手上路

Rank: 1

积分
45
72#
发表于 2015-6-30 18:01:17 | 只看该作者
ret = USBBulkWriteData(0,EP2_OUT,WriteTestData+64,64,500);
这一句返回值一直是-22,很疑惑。

现在想查找问题出在哪里。
有两个疑问:
1.如果写入数据失败,但是能读到设备的各种ID和信息,能不能证明打开设备成功?
2.按照函数的说明,返回值应该是写入的字节数,为什么会出现负值呢?

6

帖子

0

主题

39

金币

新手上路

Rank: 1

积分
45
73#
发表于 2015-6-30 18:04:53 | 只看该作者
飞鸿踏雪 发表于 2015-6-29 16:20
一般是需要USB设备来配合测试的,比如一个单片机程序,当然你也可以试试读取标准的设备,比如鼠标和键盘 ...

嗯,我现在是用鼠标在试。
假如我使用Bulk传输,读取端点是不是必须用端点2?这个端点是依赖于USB设备,还是有什么标准在里面?

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
74#
?楼主| 发表于 2015-7-1 10:35:19 | 只看该作者
xjjyzmb 发表于 2015-6-30 18:04
嗯,我现在是用鼠标在试。
假如我使用Bulk传输,读取端点是不是必须用端点2?这个端点是依赖于USB设备, ...

这个端点好不是固定的,得依赖于你的USB设备,只有端点0是固定使用方式,其他的端点都是设备自己分配的,你可以根据设备的端点描述符知道端点号及每个端点的类型,大小等
人生到处知何似,应似飞鸿踏雪泥。

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
75#
?楼主| 发表于 2015-7-1 10:38:22 | 只看该作者
xjjyzmb 发表于 2015-6-30 18:01
ret = USBBulkWriteData(0,EP2_OUT,WriteTestData+64,64,500);
这一句返回值一直是-22,很疑惑。

专门有个函数是打开设备的函数
这个函数返回负值代表写数据失败,正值代表写数据字节数
调用这个函数有几点需要注意:
1,设备的端点号是存在的
2,设备的端点类型是BULK类型
3,设备该端点支持连续数据接收
人生到处知何似,应似飞鸿踏雪泥。

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
76#
?楼主| 发表于 2015-7-1 10:39:52 | 只看该作者
wxxw1955 发表于 2015-6-30 17:54
我实际需求是stm32一直进行语音采集,并往USB写,所以数据量还是挺大的。有什么 控制接口,比如在上位机 ...

你可以单独开一个端点来传输控制信息,这样PC端就可以通过发送控制信息控制数据的收发
人生到处知何似,应似飞鸿踏雪泥。

6

帖子

0

主题

39

金币

新手上路

Rank: 1

积分
45
77#
发表于 2015-7-1 11:51:28 | 只看该作者
版主你这份代码 如果STM32不把收到的数据再丢出去的话,上位机还能读数据成功么

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
78#
?楼主| 发表于 2015-7-1 15:19:31 | 只看该作者
xjjyzmb 发表于 2015-7-1 11:51
版主你这份代码 如果STM32不把收到的数据再丢出去的话,上位机还能读数据成功么

其实把接收的数据丢出去,就是做一个类似于让接收端点重新使能接收的一个操作,简单的说,端点接收到数据后,端点就会进入类似于非使能的状态,你必须再次使能它才能接收下一帧数据.
上位机要能成功读取数据,必须要下位机发送数据才能成功,否则会出现超时错误!
人生到处知何似,应似飞鸿踏雪泥。

6

帖子

0

主题

39

金币

新手上路

Rank: 1

积分
45
79#
发表于 2015-7-1 16:05:16 | 只看该作者
飞鸿踏雪 发表于 2015-7-1 15:19
其实把接收的数据丢出去,就是做一个类似于让接收端点重新使能接收的一个操作,简单的说,端点接收到数据后, ...

谢谢耐心解答。
我自己试了一下,当端点接受到数据之后,返回上位机的是写入的字节数。此时若stm32没有那个丢包操作,或者就是你所说的进入类似于一种非使能态的话,再次写入会出现楼上所说的返回-22或者-116的情况。
读数据的情况我用标准设备试的话,能写进去,读不出来,usb_strerror()看到的确实是time out。

6

帖子

0

主题

39

金币

新手上路

Rank: 1

积分
45
80#
发表于 2015-7-1 16:08:56 | 只看该作者
读写数据失败,返回-116;请求提交失败,返回-22。
读写字节数不是64的倍数(块),但数据正确时,返回-5;
读写字节数为64的倍数,且数据正确时,返回值为成功读写的字节数。

7

帖子

0

主题

20

金币

新手上路

Rank: 1

积分
27
81#
发表于 2015-7-6 13:30:53 | 只看该作者
非常感谢!用这个学习USB

7

帖子

0

主题

20

金币

新手上路

Rank: 1

积分
27
82#
发表于 2015-7-7 10:18:26 | 只看该作者
非常感谢楼主,已经测试通,正在学USB BULK,省了驱动开发,很有帮助!

7

帖子

0

主题

20

金币

新手上路

Rank: 1

积分
27
83#
发表于 2015-7-7 14:33:26 | 只看该作者
楼主,麻烦问一下,用libusb生成的inf文件,如何安装在其它电脑上,目前我用你的例子已经调通,但是将STM32接到其它电脑上,无法安装驱动,用通常的inf安装方法无法安装。libusb的inf安装有特别的方法吗?多谢!

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
84#
?楼主| 发表于 2015-7-7 17:20:28 | 只看该作者
phenixyf 发表于 2015-7-7 14:33
楼主,麻烦问一下,用libusb生成的inf文件,如何安装在其它电脑上,目前我用你的例子已经调通,但是将STM32 ...

一样的,你把生成的驱动包拷贝到其他电脑,然后在设备管理器里面右键选择设备,选择更新驱动程序,然后找到驱动程序目录即可
人生到处知何似,应似飞鸿踏雪泥。

7

帖子

0

主题

20

金币

新手上路

Rank: 1

积分
27
85#
发表于 2015-7-8 14:58:25 | 只看该作者
飞鸿踏雪 发表于 2015-7-7 17:20
一样的,你把生成的驱动包拷贝到其他电脑,然后在设备管理器里面右键选择设备,选择更新驱动程序,然后找 ...

谢谢!把整个驱动包拷过去就可以了,我之前只拷了inf文件。

另外,用libusb我现在遇到一个问题:之前别的USB设备如silicon F340,现在接上电脑后,在设备管理器看到变成了libusb-win32 devices下的一个设备,不再是通用串行总线控制器下的设备,所以之前可以正常工作的USB设备,现在反而无法正常工作了。想请教一下楼主,libusb会更改所有驱动吗,这种问题有没有解决办法?多谢!

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
86#
?楼主| 发表于 2015-7-8 15:35:55 | 只看该作者
phenixyf 发表于 2015-7-8 14:58
谢谢!把整个驱动包拷过去就可以了,我之前只拷了inf文件。

另外,用libusb我现在遇到一个问题:之前 ...

目前我也没找到合适的解决方案
人生到处知何似,应似飞鸿踏雪泥。

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
88#
?楼主| 发表于 2015-7-11 09:11:11 | 只看该作者
martin1986 发表于 2015-7-10 21:02
你好,我刚接触上位机编程,对很多东西不很了解,可能遇到的问题很低级,敬请见谅。在调试 PC端USB驱动测试 ...

是我提供的工程还是你自己新建的工程?无法启动很有可能是没找到依赖库的原因
人生到处知何似,应似飞鸿踏雪泥。

6

帖子

0

主题

27

金币

新手上路

Rank: 1

积分
35
89#
发表于 2015-7-11 10:01:30 | 只看该作者
就是这个帖子中提供的工程,可能是我没有正确添加库,我再试试看。

8

帖子

5

主题

0

金币

新手上路

Rank: 1

积分
8
90#
发表于 2015-7-11 13:07:12 | 只看该作者
金钱不足啊

7

帖子

0

主题

20

金币

新手上路

Rank: 1

积分
27
91#
发表于 2015-7-13 10:06:35 | 只看该作者
飞鸿踏雪 发表于 2015-7-8 15:35
目前我也没找到合适的解决方案

谢谢楼主,这个问题解决了,我的方法是:当其它自己开发的USB设备被libusb误识别后,在设备管理器中右键点击然后卸载其驱动,然后再重新插拔这个USB设备就可以被正常识别了。

再追问一个问题 你的例子中,PC端USB的驱动程序,就是制作DLL和LIB的那个VC工程,是在VC Studio选择什么模板建立的,恳请赐教,谢谢!

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
92#
?楼主| 发表于 2015-7-13 10:22:46 | 只看该作者
phenixyf 发表于 2015-7-13 10:06
谢谢楼主,这个问题解决了,我的方法是:当其它自己开发的USB设备被libusb误识别后,在设备管理器中右键 ...

就是生成库的工程,不同的VC版本可能稍有不同
人生到处知何似,应似飞鸿踏雪泥。

7

帖子

0

主题

20

金币

新手上路

Rank: 1

积分
27
93#
发表于 2015-7-13 15:16:37 | 只看该作者
飞鸿踏雪 发表于 2015-7-13 10:22
就是生成库的工程,不同的VC版本可能稍有不同

VC是菜鸟,生成库的工程如何建立?谢谢!

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
94#
?楼主| 发表于 2015-7-13 18:50:04 | 只看该作者
phenixyf 发表于 2015-7-13 15:16
VC是菜鸟,生成库的工程如何建立?谢谢!

百度下吧,网上很多教程,而且是图文教程,写得非常详细的
人生到处知何似,应似飞鸿踏雪泥。

9

帖子

0

主题

22

金币

新手上路

Rank: 1

积分
31
95#
发表于 2015-7-14 10:44:46 | 只看该作者
Bulk传输是否是单端,传输速度能到1M/s以上吗?

1110

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149607
QQ
96#
?楼主| 发表于 2015-7-14 10:54:54 | 只看该作者
king09 发表于 2015-7-14 10:44
Bulk传输是否是单端,传输速度能到1M/s以上吗?

你说的1Mbps还是1MByte/s?如果是全速USB(12M)肯定是很难实现的,基本上也不可能实现,如果是高速USB(480M),肯定没问题,我最大能做到40多M每秒
人生到处知何似,应似飞鸿踏雪泥。

9

帖子

0

主题

22

金币

新手上路

Rank: 1

积分
31
97#
发表于 2015-7-14 11:26:24 | 只看该作者
martin1986 发表于 2015-7-11 10:01
就是这个帖子中提供的工程,可能是我没有正确添加库,我再试试看。

我也遇到了这个问题

31

帖子

0

主题

56

金币

注册会员

Rank: 2

积分
97
98#
发表于 2015-7-14 15:46:52 | 只看该作者
没有积分呀,,,

31

帖子

0

主题

56

金币

注册会员

Rank: 2

积分
97
99#
发表于 2015-7-14 15:49:18 | 只看该作者
再水一金,,,,

15

帖子

0

主题

15

金币

新手上路

Rank: 1

积分
34
100#
发表于 2015-7-14 22:49:31 | 只看该作者
好贵啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|嵌入式以太网社区 ( 渝ICP备14007427号 )?

GMT+8, 2019-11-6 12:34 , Processed in 0.535742 second(s), 37 queries .

Powered by Discuz! X3.2

? 2001-2013 Comsenz Inc.

快速bet365体-在线体育投注_365体育投注地址_365体育投注登录 返回顶部 返回列表