OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10000|回复: 6

STM32F103RBT6中USB-HID问题PC上位机向USB-HID设备发送信息,第二次死机

[复制链接]

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2013-12-6
在线时间
13 小时
发表于 2015-8-10 17:21:00 | 显示全部楼层 |阅读模式
5金钱
如题,根据st官网USB-HID例程改编收发64个字节,都是在端点1进行的,stm32设备向PC机发送没有问题,
但PC机向stm32设备发送64个字节数据只有第一次能成功,但第二次就不行了,而且上位机那边软件也死掉(stm32设备复位重新启动又好了,但需重新枚举)。
不知道是什么原因,配置感觉也没错。用BUS HOUND查看也是一样的效果(PC机那边只能向stm32设备发一次,第二次没反应)。
我想实现的功能是用端点1完成收发功能(没有次数限制!!)。
大家帮帮忙,这个地方卡了2天了,不知道是什么问题。
关键代码如下:
#define USBDATALEN 64
-------------usb_prop.c文件--------------
 /* Initialize Endpoint 1 */
  SetEPType(ENDP1, EP_INTERRUPT);
  SetEPTxAddr(ENDP1, ENDP1_TXADDR);
  SetEPRxAddr(ENDP1, ENDP1_RXADDR);
  SetEPTxCount(ENDP1, USBDATALEN);//收发都是64个字节
  SetEPRxCount(ENDP1, USBDATALEN);
  SetEPRxStatus(ENDP1, EP_RX_VALID);
  SetEPTxStatus(ENDP1, EP_TX_NAK);

---------------------usb_desc.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*/
    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 */

const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
  {
    0x09, /* bLength: Configuration 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 */
    0x32,         /* MaxPower 100 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: */

    0x81,          /* bEndpointAddress: Endpoint Address (IN) */
    0x03,          /* bmAttributes: Interrupt endpoint ???????? */
    USBDATALEN,          /* wMaxPacketSize: 64 Bytes max */
    0x00,
    0x20,          /* bInterval: Polling Interval (32 ms) */
    /* 34 */
   
    0x07, /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */
/* Endpoint descriptor type */
    0x01, /* bEndpointAddress: */
/* Endpoint Address (OUT) */
    0x03, /* bmAttributes: Interrupt endpoint */
    USBDATALEN, /* wMaxPacketSize: 64 Bytes max  */
    0x00,
    0x20, /* bInterval: Polling Interval (20 ms) */
    /* 41 */
  }

const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =//这里改的比较多,删掉了不用的代码
  {                    
    0x05, 0x01,                    // USAGE_PAGE(1)(User define)
    0x09, 0x00,                    // USAGE(User define)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x19, 0x00,                    //   USAGE_MINIMUM(0)
    0x29, 0xFF,                    //   USAGE_MAXIMUM(255)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0xFF,                    //   LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, USBDATALEN,              //   REPORT_COUNT (3)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)

    0x05, 0x02,                    // USAGE_PAGE(2)
    0x19, 0x00,                    //   USAGE_MINIMUM (0)
    0x29, 0xFF,                    //   USAGE_MAXIMUM (255)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0xFF,                    //   LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //   REPORT_SIZE (64)
    0x95, USBDATALEN,              //   REPORT_COUNT (8)
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)

    0xc0            /*     END_COLLECTION              */
  }; /* CustomHID_ReportDescriptor */

----------usb_conf.h文件--------------------
/* EP0  */
/* rx/tx buffer base address */
#define ENDP0_RXADDR        (0x18)
#define ENDP0_TXADDR        (0x58)

/* EP1  */
/* tx buffer base address */
#define ENDP1_TXADDR        (0x100)
#define ENDP1_RXADDR        (0x140)

----------------usb_endp.c文件-----------------
void EP1_OUT_Callback(void)
{
/* Read received data (64 bytes) */  
  USB_SIL_Read(EP1_OUT, Receive_Buffer);
printf("Enter ---> EP1_OUT_Callback\r\n");
}

void EP1_IN_Callback(void)
{
  PrevXferComplete = 1;
printf("Enter ---> EP1_IN_Callback\r\n");
}

BUS HOUND查看


最佳答案

查看完整内容[请看2#楼]

问题已经解决,PC向stm32第一次发送数据后EP_RX_VALID变为了EP_RX_NAK, 在EP1_OUT_Callback(void)函数中加入SetEPRxStatus(ENDP1, EP_RX_VALID)即可。 void EP1_OUT_Callback(void) { /* Read received data (64 bytes) */     USB_SIL_Read(EP1_OUT, Receive_Buffer); printf("Enter ---> EP1_OUT_Callback\r\n"); SetEPRxStatus(E ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2013-12-6
在线时间
13 小时
 楼主| 发表于 2015-8-10 17:21:01 | 显示全部楼层
问题已经解决,PC向stm32第一次发送数据后EP_RX_VALID变为了EP_RX_NAK,
在EP1_OUT_Callback(void)函数中加入SetEPRxStatus(ENDP1, EP_RX_VALID)即可。
void EP1_OUT_Callback(void)
{
/* Read received data (64 bytes) */  
  USB_SIL_Read(EP1_OUT, Receive_Buffer);
printf("Enter ---> EP1_OUT_Callback\r\n");
SetEPRxStatus(ENDP1, EP_RX_VALID);
}
但说实话为什么在发完之后状态不自己改变呢?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-8-10 22:01:06 | 显示全部楼层
回复【2楼】RockObama:
---------------------------------
谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

234

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2014-7-8
在线时间
10 小时
发表于 2015-8-11 10:28:35 | 显示全部楼层
回复【2楼】RockObama:
---------------------------------
能分享一下嗎
回复

使用道具 举报

4

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2016-1-25
在线时间
16 小时
发表于 2017-6-15 20:30:53 | 显示全部楼层
RockObama 发表于 2015-8-10 17:21
问题已经解决,PC向stm32第一次发送数据后EP_RX_VALID变为了EP_RX_NAK,
在EP1_OUT_Callback(void)函数中 ...

还有个大bug你没发现?插拔以后,pc就没办法读取数据了。。。
诚交各路大侠
回复

使用道具 举报

11

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2018-3-19
在线时间
54 小时
发表于 2021-4-15 19:59:38 | 显示全部楼层
今天diy键盘,发现按了caps clock电脑就会死机,按别的键都正常,按照楼主的办法试了一下好了,猜测在caps clock按下后,电脑向键盘又返回数据。。
回复

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-3-11
在线时间
10 小时
发表于 2021-5-8 18:19:43 | 显示全部楼层
RockObama 发表于 2015-8-10 17:21
问题已经解决,PC向stm32第一次发送数据后EP_RX_VALID变为了EP_RX_NAK,
在EP1_OUT_Callback(void)函数中 ...

您好 STM32 USB HID设备求助 不知道大神现在什么阶段的人物了。。。我在6年后看到了你的帖子。。。遇到了类似的问题 正在开发一款USB设备。。。需要用到通信 希望您看到能联系我一下 感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 08:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表