你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F205 USB FS 模式下 USB 通讯异常

[复制链接]
5768340 提问时间:2018-3-5 11:20 /
Hi  
    我使用STM32F205RET6 进行USB指纹相关工作的开发,使用到 USB FS 模式与PC通讯,使用 libusb 进行开发,使用的 CustomHID 历程进行修改,将传输断点修改为 bulk 模式,在 STM32 向 PC 连续发送数据时出现需要延时一会才能发送,且发送速度很慢,请帮忙看看,谢谢 !
   我使用的时标准固件库,版本号为 v1.1.2 , USB 库使用的是 STM32_USB-Host-Device_Lib_V2.2.0;
   我的设备描述符如下:

  1. __ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END =
  2. {
  3.   0x12,                       /*bLength */   //描述符长度
  4.   USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/ //描述符类型
  5.   0x00,                       /*bcdUSB */ //USB 类型规范版本
  6.   0x02,
  7.   0x00,                       /*bDeviceClass*/ //类型代码
  8.   0x00,                       /*bDeviceSubClass*/  //子类型代码
  9.   0x00,                       /*bDeviceProtocol*/  //协议代码
  10.   USB_OTG_MAX_EP0_SIZE,      /*bMaxPacketSize*/   //断点0 支持最大数据包长度
  11.   LOBYTE(USBD_VID),           /*idVendor*/       //供应商ID
  12.   HIBYTE(USBD_VID),           /*idVendor*/
  13.   LOBYTE(USBD_PID),           /*idVendor*/      //厂商ID
  14.   HIBYTE(USBD_PID),           /*idVendor*/
  15.   0x00,                       /*bcdDevice rel. 2.00*/  //设备BCD 码
  16.   0x02,
  17.   USBD_IDX_MFC_STR,           /*Index of manufacturer  string*/ //供应商字符串描述符索引
  18.   USBD_IDX_PRODUCT_STR,       /*Index of product string*/ //产品字符串描述索引
  19.   USBD_IDX_SERIAL_STR,        /*Index of serial number string*/ //设备序列号索引
  20.   USBD_CFG_MAX_NUM            /*bNumConfigurations*/ //所支持的配置描述符索引
  21. } ; /* USB_DeviceDescriptor */
复制代码
  1. __ALIGN_BEGIN uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END =
  2. {
  3.   USB_LEN_DEV_QUALIFIER_DESC,
  4.   USB_DESC_TYPE_DEVICE_QUALIFIER,
  5.   0x00,
  6.   0x02,
  7.   0x00,
  8.   0x00,
  9.   0x00,
  10.   0x40,
  11.   0x01,
  12.   0x00,
  13. };
复制代码
  1. __ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END =
  2. {
  3.   0x09, /* bLength: Configuration Descriptor size */
  4.   USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
  5.   USB_CUSTOM_HID_CONFIG_DESC_SIZ,
  6.   /* wTotalLength: Bytes returned */
  7.   0x00,
  8.   0x01,         /*bNumInterfaces: 1 interface*/
  9.   0x01,         /*bConfigurationValue: Configuration value*/
  10.   0x00,         /*iConfiguration: Index of string descriptor describing the configuration*/
  11.   0xE0,         /*bmAttributes: bus powered and Support Remote Wake-up */
  12.   0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/
  13.   
  14.   /************** Descriptor of Custom HID interface ****************/
  15.   /* 09 */
  16.   0x09,         /*bLength: Interface Descriptor size*/
  17.   USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
  18.   0x00,         /*bInterfaceNumber: Number of Interface*/
  19.   0x00,         /*bAlternateSetting: Alternate setting*/
  20.   0x02,         /*bNumEndpoints*/
  21.   0xDC,         /*bInterfaceClass: 自定义*/
  22.   0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
  23.   0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
  24.   0,            /*iInterface: Index of string descriptor*/
  25.   /******************** Descriptor of Custom HID ********************/

  26.   /* 18 */
  27.   0x07,          /* bLength: Endpoint Descriptor size */
  28.   USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */
  29.   HID_IN_EP,     /* bEndpointAddress: Endpoint Address (IN) */
  30.   0x02,          /* bmAttributes: bulk endpoint */
  31.   HID_IN_PACKET, /* wMaxPacketSize: 64 Bytes max */
  32.   0x00,
  33.   0x01,          /* bInterval: Polling Interval (32 ms) */
  34.   /* 25 */

  35.   0x07,                 /* bLength: Endpoint Descriptor size */
  36.   USB_ENDPOINT_DESCRIPTOR_TYPE,        /* bDescriptorType: */
  37.   HID_OUT_EP,        /* bEndpointAddress: */
  38.   0x02,        /* bmAttributes: Interrupt endpoint */
  39.   HID_OUT_PACKET,        /* wMaxPacketSize: 64 Bytes max  */
  40.   0x00,
  41.   0x01,        /* bInterval: Polling Interval (20 ms) */
  42.   /* 32 */
  43. } ;

  44. #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
  45.   #if defined ( __ICCARM__ ) /*!< IAR Compiler */
  46.     #pragma data_alignment=4   
  47.   #endif
  48. #endif

  49. __ALIGN_BEGIN static uint8_t CustomHID_ReportDesc[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
  50. {
  51.         0x05, 0x8c, /* USAGE_PAGE (ST Page) */
  52.         0x09, 0x01, /* USAGE (Demo Kit) */
  53.         0xa1, 0x01, /* COLLECTION (Application) */
  54.         0x09, 0x03, // USAGE ID - Vendor defined
  55.         0x15, 0x00, // LOGICAL_MINIMUM (0)
  56.         0x26, 0x00, 0xFF, // LOGICAL_MAXIMUM (255)
  57.         0x75, 0x08, // REPORT_SIZE (8)
  58.         0x95, 0x40, // REPORT_COUNT (64)                 
  59.         0x81, 0x02, // INPUT (Data,Var,Abs)
  60.         0x09, 0x04, // USAGE ID - Vendor defined
  61.         0x15, 0x00, // LOGICAL_MINIMUM (0)
  62.         0x26, 0x00,0xFF, // LOGICAL_MAXIMUM (255)
  63.         0x75, 0x08, // REPORT_SIZE (8)
  64.         0x95, 0x40, // REPORT_COUNT (08)                  
  65.         0x91, 0x02, // OUTPUT (Data,Var,Abs)
  66.         0xc0
  67. };
复制代码
其中我的发送代码地方的写法如下:
  1.    else  if(FPS998E == gcdfinger_chipid)
  2.     {
  3.         for(count = 0;count<288;count++)
  4.         {
  5.          //CDFINGER_LOGI("sss %x\r\n",gcdfinger_chipid);  
  6.          Cdfinger_Bspdelay_ms(1);            
  7.          USBD_CUSTOM_HID_SendReport(&USB_OTG_dev,&gcdfinger_imgbuf[64*count],64);
  8.         }
  9.     }
复制代码
如果不加延时的话数据发送不出去,添加延时的话可以发送,但是速度很慢。

点评

技术问题请先发STM32求助帖,谢谢!  发表于 2018-3-5 16:43
收藏 1 评论9 发布时间:2018-3-5 11:20

举报

9个回答
yu0405jie 回答时间:2018-3-5 13:16:20
bInterfaceClass取值oxFF时表示为自定义的设备,在发送数据时,可以直接调用库提供的发送函数,USBD_CUSTOM_HID_SendReport这个应该是HID例子中封装过的,你可以查看一下里面是怎么实现的

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

toofree 回答时间:2018-3-5 14:04:38
我只知道USB全速模式下有个叫SOF的东西,上位机每1ms发一次。
我在用PIC单片机做USB鼠标的时候,就是在SOF中断服务程序中给上位机发送鼠标数据的,在主循环中采集鼠标数据,没管太多。反正就是USB有它自己的机制,不是说下位机任意时刻都可以往上传数据。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

衔胆栖冰 回答时间:2018-3-5 14:22:39
Cdfinger_Bspdelay_ms(1)这个是什么,在发送函数里加了延时吗?HID用BULK?

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

5768340 回答时间:2018-3-5 16:38:06
yu0405jie 发表于 2018-3-5 13:16
bInterfaceClass取值oxFF时表示为自定义的设备,在发送数据时,可以直接调用库提供的发送函数,USBD_CUSTOM ...

你的意思是我应该不使用这个发送接口吗 ?
5768340 回答时间:2018-3-5 16:39:14
衔胆栖冰 发表于 2018-3-5 14:22
Cdfinger_Bspdelay_ms(1)这个是什么,在发送函数里加了延时吗?HID用BULK?

嗯嗯,是延时函数。我是基于HID的USB历程来改的,将端点改为bulk类型的。
5768340 回答时间:2018-3-5 16:39:45
toofree 发表于 2018-3-5 14:04
我只知道USB全速模式下有个叫SOF的东西,上位机每1ms发一次。
我在用PIC单片机做USB鼠标的时候,就是在SO ...

嗯嗯,我上位机一直在读数据。
yu0405jie 回答时间:2018-3-5 21:05:44
5768340 发表于 2018-3-5 16:38
你的意思是我应该不使用这个发送接口吗 ?

我也修改过,没有使用这个函数
衔胆栖冰 回答时间:2018-3-6 16:35:43
5768340 发表于 2018-3-5 16:39
嗯嗯,是延时函数。我是基于HID的USB历程来改的,将端点改为bulk类型的。

拿USB传指纹图像是吧。既然用BULK,为什么不用Mass Storage Class的例程,改起来会更快更方便。发送不出去肯定有问题,加了延时肯定慢。所有标准的的HID设备通过USB的控制管道(默认管道,即端点0)和中断管道与主机通信。端点0的最大数据包才多大,就算通信正常速率又能多快!你的HID_IN_EP宏是多少,HID_IN_PACKET, /* wMaxPacketSize: 64 Bytes max */从这我要猜测你就是直接用端点0?端点0既负责控制传输也负责数据传输?最大包64Byte用bulk传输没有什么意义。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版