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

2019-07-21 03:04发布

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发送上来的数据。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
41条回答
wlff
2019-07-22 05:17
回复【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。鼠标键盘失灵倒是没遇到过

一周热门 更多>