OpenEdv-开源电子网

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

用STM32F103ZET6写的USB HID设备与计算机通信程序,可以接收数据,但发送有问题,请教一下大家

[复制链接]

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2014-11-1
在线时间
0 小时
发表于 2014-11-1 17:02:39 | 显示全部楼层 |阅读模式
5金钱
USB枚举过程是成功了的,计算机设备管理器中看到的设备:


用PortHelper调试USB如下:


点击发送后,STM32接收到数据并且从串口返回接收到的数据如下:


我的STM32 USB通信程序中,当端点1接收到一次数据后就每隔一段时间通过端点2发送数据(内容是:哦艾斯黛拉),然后从串口返回的数据发现STM32每隔一段时间端点2都会产生IN中断,但是PortHelper软件并没有接收到数据,然后我用Bus Hound抓取USB包,首先抓取的是HID-compliant device设备,如下图:


然后用PortHelper USb调试器与STM32通信,Bus Hound只抓取到了OUT数据包,如下:


从端点2发送到计算机IN的数据包没有,但是STM32 USB每隔一段时间产生了IN中断,也就是说STM32发送了数据给电脑,但PortHelper中端点2没有收到数据,接着我有用Bus Hound抓取“USB输入设备”的数据,如下图:


PortHelper与STM32进行USB通信,Bus Hound抓取到的数据包如下:


从抓取到的数据包看到“USB输入设备”收到的STM32发来的数据,图中圈出来的就是“哦艾斯黛拉”的十六进制数据,我想问的是为什们“HID-compliant device”收不到IN数据?而“USB输入设备”可以?(USB的各种描述符是直接从一个STM USB HID例程复制过来的,那个例程HID-compliant device”和“USB输入设备”都可以收到STM32从端点2发送上来的数据。

最佳答案

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

谢谢原子哥帮顶,我好像找到问题了,端点2发送数据大小固定为22字节(参考的STM32 USB HID例程看到他就是固定的22字节),用PortHelper就可以接收到数据了,应该是报告描述符里面规定了传输的数据大小。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2014-11-1
在线时间
0 小时
 楼主| 发表于 2014-11-1 17:02:40 | 显示全部楼层
谢谢原子哥帮顶,我好像找到问题了,端点2发送数据大小固定为22字节(参考的STM32 USB HID例程看到他就是固定的22字节),用PortHelper就可以接收到数据了,应该是报告描述符里面规定了传输的数据大小。
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2014-11-1
在线时间
0 小时
 楼主| 发表于 2014-11-1 17:24:58 | 显示全部楼层
Keil程序:

USB.rar

1.55 MB, 下载次数: 13998

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-1 21:21:47 | 显示全部楼层
没搞过,帮顶。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-1 23:25:34 | 显示全部楼层
回复【4楼】wlff:
---------------------------------
恭喜
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

394

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2115
金钱
2115
注册时间
2012-5-8
在线时间
314 小时
发表于 2014-11-18 09:10:26 | 显示全部楼层
学习!谢谢楼主的共享!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-1-14
在线时间
0 小时
发表于 2015-1-14 16:07:01 | 显示全部楼层
回复【4楼】wlff:
---------------------------------
只要把len固定为0x16.也就是22个字节就行了,为啥啊,一般不是64个么?还有你的发送也是不能超过22个字节,实际有效的只能是22个,但是在pma缓冲里面存放的格式好奇怪啊,两个有效字节加上两个字节的00,还有如果是文件传输这个能处理么?比特率大约是多少??求楼主给答复,最近在做usb,这个hid的不要驱动很方便,但是有时候会占用鼠标或者键盘,让他们失灵,这个楼主有遇到过么???
回复

使用道具 举报

8

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-1-27
在线时间
15 小时
发表于 2015-1-27 11:15:41 | 显示全部楼层
楼主能否把USB的调试通过的程序,资料和一些调试软件全部打包发给我发给我一下啊,不胜感激  。    我的邮箱  835841098@qq.com      小弟初学STM32 单片机   菜鸟一个    想学习一下STM32的 USB通信   。
看着容易,学着不易,且学且努力!
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2014-11-1
在线时间
0 小时
 楼主| 发表于 2015-1-29 20:46:36 | 显示全部楼层
回复【7楼】yarmin:
---------------------------------
在USB报告描述符中这两句
0x75,0x08, // REPORT_SIZE (8) 
0x95,0x16, // REPORT_COUNT (22)
就规定了传输数据为8bit为一个单位,共22个单位也就是22字节。 
PMA缓冲地址范围是1KB的,而手册中说USB缓冲区是512字节,其原因我在网上搜的:
    1. usb和can公用512B的RAM,但是RAm地址为0x40006000-0x40006400,分明为1KB啊,为什么还是说512B.
    2. 若PC机读RAM中数据时,我同时对RAM进行写操作,怎么办,我感觉库中并没有对这种操作进行处理啊。
    3. 对于缓冲区,不理解为什么给了个地址,又同时给了个USB本地地址,并且我认为,地址偏移应该为[USB_BTABLE]*2+n*16+(0,4,8,12),也就是缓冲区描述表也应该扩大2倍,不知道是不是
    1)这个缓冲区是个双端口RAM,CPU一端是以32位宽访问,而USB一端是以16位宽访问,因此从CPU端看浪费了一半的地址空间,即从CPU端读出32位数据时只有16位是有效的;所以1KB的地址空间,实际只有512字节的存储空间。
    2)因为这个缓冲区是个双端口RAM,所以你不用担心访问冲突的问题,硬件会协调它们之间的操作。
    3)因为这个缓冲区是个双端口RAM,所以有2个地址空间,一个是从CPU端看,另一个是从USB收发器那一端看。

至于传输速度,我只测试了在中断时间为1ms,每次传输22字节时,速率为22KB/s。鼠标键盘失灵倒是没遇到过
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2014-11-1
在线时间
0 小时
 楼主| 发表于 2015-1-29 20:53:52 | 显示全部楼层
 回复【8楼】 @子非鱼 :
---------------------------------
第一个是USB HID例程,第二个是USB鼠标,软件网上很多。

USBMouse.rar

1.56 MB, 下载次数: 6046

USB.rar

1.55 MB, 下载次数: 6116

回复

使用道具 举报

8

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-1-27
在线时间
15 小时
发表于 2015-2-4 16:49:38 | 显示全部楼层
回复【9楼】wlff:
---------------------------------
谢谢楼主的分享!
看着容易,学着不易,且学且努力!
回复

使用道具 举报

6

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2014-10-6
在线时间
38 小时
发表于 2015-3-29 21:42:32 | 显示全部楼层
多谢分享,感谢……
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-4-1
在线时间
0 小时
发表于 2015-5-4 10:14:28 | 显示全部楼层
楼主,现在usb_hid设备能够接收到吗?  我也遇到了这个问题,但是我打开USB_HID根本没有端点啊,也只有USB人体学输入设备可以接收发送啊,这难道不对吗?
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2014-7-14
在线时间
0 小时
发表于 2015-7-5 20:06:55 | 显示全部楼层
我现在在做一个用stm32驱动FM1702的一个读卡器,然后通过USB和上位机通信,上位机用VC++ 做。在做之前我也查了一些资料但是感觉没有找到有用的资料。现在面临三个难点,1:怎么用stm32驱动FM1702 ;2:怎么写STM32的USB通信 ;3:怎么用vc++写USB通信的上位机。下位机芯片stm32f103ZET6;上位机用VS2013写的。求各位大神哥哥指点,也可以给我发点资料,源码,我的邮箱446310852@qq.com。
      我自己看别人的代码也写了个上位机,下位机是修改stm32鼠标实验(虽然我知道直接拿来用不太对,但是不会修改,稍微修改一下就设备都读取不出来)的,但是用读的方式无法打开,写数据也失败。
      我感觉我对这个从基础都不了解,也不知道先读写哪些基础的
    我想先把这个项目做出了
   希望哪个大神哥哥指点一下
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2015-7-27 13:31:21 | 显示全部楼层
mark<>
自在随心
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2015-7-24
在线时间
0 小时
发表于 2015-7-27 13:52:25 | 显示全部楼层
上位机也要注意读写字节 个数 这个比较严格
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2015-7-28 11:33:20 | 显示全部楼层
回复【16楼】yangye:
---------------------------------
想要从上位机读数据必需有什么缓存???楼主分享的程序用PortHelper可以发送数据并被bushound抓到。
http://www.openedv.com/posts/list/26375.htm
楼主的程序和这个帖子的程序很像,但是我们移植了它的描述符,改了prep.c conf.c。我的程序就没有楼主的效果。上面帖子的程序也没有楼主的效果,它们的区别在哪里呀?就只是这个缓存区吗?必需要有这个?
自在随心
回复

使用道具 举报

13

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2011-8-2
在线时间
0 小时
发表于 2015-8-4 15:46:41 | 显示全部楼层
我的stm32进不了发送回调函数EP2_IN_Callback
这是什么情况啊
回复

使用道具 举报

2

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2014-2-18
在线时间
12 小时
发表于 2015-11-18 23:48:41 | 显示全部楼层
谢谢,把程序改在mini开发板上。谢谢啦
回复

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2014-11-12
在线时间
8 小时
发表于 2015-12-3 15:54:10 | 显示全部楼层
谢谢作者的分享精神。
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-12-23
在线时间
9 小时
发表于 2015-12-10 10:02:47 | 显示全部楼层
回复【10楼】wlff:
---------------------------------
楼主好啊,我把这个移植到mini板上,枚举时认不出设备啊,unknow device
只改动了启动文件而已,请问还需修改些什么呢?
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-6-6
在线时间
4 小时
发表于 2016-1-23 21:33:00 | 显示全部楼层
MARK Thanks
回复

使用道具 举报

2

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-2-17
在线时间
82 小时
发表于 2016-2-18 16:14:39 | 显示全部楼层
楼主还在吗?楼主是USB在哪里接收的数据?
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2015-3-18
在线时间
7 小时
发表于 2016-2-23 16:37:37 | 显示全部楼层
谢谢分享,我的枚举成功了  收不到数据 正在找问题。拿原子老大的鼠标例程改成的通用设备
回复

使用道具 举报

爱丶萝莉 该用户已被删除
发表于 2016-3-14 09:47:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

1

主题

119

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2002
金钱
2002
注册时间
2013-10-7
在线时间
330 小时
发表于 2016-5-8 19:19:30 | 显示全部楼层
MAKE,标志学习下!
回复

使用道具 举报

9

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2013-5-28
在线时间
24 小时
发表于 2016-5-13 15:32:14 | 显示全部楼层
下载学习。感谢分享!
学习单片机编程贵在坚持,无论多难的问题都有不轻易放弃的原则,坚持着去解决它,相信你总会找到解决方法的。
回复

使用道具 举报

9

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2013-5-28
在线时间
24 小时
发表于 2016-5-13 16:20:05 | 显示全部楼层

大哥,请问我用您的代码移植到C8T6,初始化完成后收到中断函数里面打印出来的“Error”字符,电脑USB口也没有识别到USB设备。另外我看了USB_Config()函数里为何要初始化IO口PC13呢?而PA11,PA12的IO不用初始化。希望能指点下,谢谢!
学习单片机编程贵在坚持,无论多难的问题都有不轻易放弃的原则,坚持着去解决它,相信你总会找到解决方法的。
回复

使用道具 举报

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-3-29
在线时间
26 小时
发表于 2016-5-14 23:16:14 | 显示全部楼层
win键是哪个值呢HID
回复

使用道具 举报

9

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2013-5-28
在线时间
24 小时
发表于 2016-5-24 20:30:54 | 显示全部楼层
liuyu0624 发表于 2016-2-23 16:37
谢谢分享,我的枚举成功了  收不到数据 正在找问题。拿原子老大的鼠标例程改成的通用设备

大哥,你解决问题了吗?我的也跟你一样,枚举成功了。发送数据和接收数据都无反应。
学习单片机编程贵在坚持,无论多难的问题都有不轻易放弃的原则,坚持着去解决它,相信你总会找到解决方法的。
回复

使用道具 举报

9

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2013-5-28
在线时间
24 小时
发表于 2016-5-25 09:22:04 | 显示全部楼层
华南虎 发表于 2016-5-24 20:30
大哥,你解决问题了吗?我的也跟你一样,枚举成功了。发送数据和接收数据都无反应。

已经移植成功,代码可正常在STM32F103C8T6上正常收发数据,不知道楼主最后有没有搞定只能收发22字节的问题。
学习单片机编程贵在坚持,无论多难的问题都有不轻易放弃的原则,坚持着去解决它,相信你总会找到解决方法的。
回复

使用道具 举报

11

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-11-23
在线时间
12 小时
发表于 2016-5-28 11:31:47 | 显示全部楼层
wlff 发表于 2015-1-29 20:53
&nbsp;回复【8楼】 @子非鱼 :
---------------------------------

楼主啊,按照的你程序下载进入了STM32103CT86,枚举也成了,但就是通过ProHelper打印不出数据啊,len的长度也是22字节啊!就比如发送:123.
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2014-4-15
在线时间
5 小时
发表于 2016-7-1 16:00:52 | 显示全部楼层
华南虎 发表于 2016-5-25 09:22
已经移植成功,代码可正常在STM32F103C8T6上正常收发数据,不知道楼主最后有没有搞定只能收发22字节 ...

大哥, 你在STM32F103C8T6上usb通讯是怎么修改的,  指点一下!
回复

使用道具 举报

9

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2013-5-28
在线时间
24 小时
发表于 2016-7-2 20:15:18 | 显示全部楼层
虚虚虚 发表于 2016-7-1 16:00
大哥, 你在STM32F103C8T6上usb通讯是怎么修改的,  指点一下!

不用修改啊,直接调头文件过去就可以使用了。不过有个地方要提醒下你,要先确保硬件是没问题的。
学习单片机编程贵在坚持,无论多难的问题都有不轻易放弃的原则,坚持着去解决它,相信你总会找到解决方法的。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-7-21
在线时间
3 小时
发表于 2016-7-21 17:24:17 | 显示全部楼层
@华南虎    分享一下你的移植成果呗   ~~   开源共享
回复

使用道具 举报

9

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2013-5-28
在线时间
24 小时
发表于 2016-8-15 15:11:14 | 显示全部楼层
mali000 发表于 2016-7-21 17:24
@华南虎    分享一下你的移植成果呗   ~~   开源共享

http://www.openedv.com/forum.php ... mp;page=1#pid236522 你好,这个是论坛上原作者的代码,我没修改,直接下载到C8T6板子后功能正常。
学习单片机编程贵在坚持,无论多难的问题都有不轻易放弃的原则,坚持着去解决它,相信你总会找到解决方法的。
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-8-28
在线时间
2 小时
发表于 2016-8-29 13:51:53 | 显示全部楼层
谢谢分享
回复

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2011-4-4
在线时间
2 小时
发表于 2016-11-14 12:29:28 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

grizzly 该用户已被删除
发表于 2017-3-18 15:19:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2018-9-28
在线时间
62 小时
发表于 2018-10-17 13:00:40 | 显示全部楼层
楼主问题解决了吗?我按照楼主给的提示改了
在USB报告描述符中这两句
0x75,0x08, // REPORT_SIZE (8)  
0x95,0x16, // REPORT_COUNT (22)   =》0x95,0x40;

依旧没能解决一次只能发22的问题(发送64不成功)
回复

使用道具 举报

0

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2018-10-22
在线时间
30 小时
发表于 2018-10-23 11:02:41 | 显示全部楼层
谢谢分享 学习一下
回复

使用道具 举报

1

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2017-9-1
在线时间
19 小时
发表于 2018-11-7 10:39:17 | 显示全部楼层
MAKE,标志学习下!
回复

使用道具 举报

1

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2017-9-1
在线时间
19 小时
发表于 2018-11-9 16:32:43 | 显示全部楼层
非常感谢非常感谢!
回复

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-1-23
在线时间
25 小时
发表于 2019-4-10 16:30:50 | 显示全部楼层
楼主您那有可以收发64字节的例程吗我用的是stm32f103ZET6的片子。用您上边那个例程串口总不能打印出64字节的数据。上位机USB也收不到数据。麻烦您发一个最新的例程。
回复

使用道具 举报

2

主题

25

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-7-8
在线时间
5 小时
发表于 2020-10-17 15:22:59 | 显示全部楼层
谢谢分享 学习一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 07:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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