打印

STM32F103RB的USB读取问题

[复制链接]
2422|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
火箭球迷|  楼主 | 2010-6-7 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在调试STM32的USB。设置三个端点。
端点0作为控制端点,端点1作为批量读端点,端点2作为批量写端点;
现在在windows上用测试软件发现写完全正常,但是读取STM32的数据时,总是需要读取两次,第一次读取的数据是上一次的数据,只有读取第二次才能读取正确。其中端点0没有用到。

测试如下:
第一次开机运行,windows写32字节数据A给STM32,windows读刚刚发送STM32数据A,结果发现全为0XCC。后续windows再读一次STM32数据就可以读取正确。
后续每次都是如此。

现在肯定是STM32出问题了,但是不知道是什么环节设置出的问题,我是用STM32的USB库修改过来的程序。望高手指点一下。
沙发
香水城| | 2010-6-7 22:02 | 只看该作者
显然是程序的问题。

使用特权

评论回复
板凳
myfaith| | 2010-6-8 00:11 | 只看该作者
显然是程序的问题。
香水城 发表于 2010-6-7 22:02

这个回答太经典了~~

使用特权

评论回复
地板
香水城| | 2010-6-8 09:24 | 只看该作者
这个回答太经典了~~
myfaith 发表于 2010-6-8 00:11


哈哈,同样经典的是,这个问题只有现象描述没有过程描述,;P 。

使用特权

评论回复
5
vigia| | 2010-6-8 14:29 | 只看该作者
USB IN传输对于STM32来说,是先将USB BUFFER中的数据传送出去,然后产生IN中断。

你的现象很明显,是第一次主机要求IN的时候,数据并没有存放在USB BUFFER中,而是在产生了IN的中断后,才将数据放入了USB BUFFER,所以在主机的第二次IN请求时,正确的数据才被传送了出去。

使用特权

评论回复
6
秋天落叶| | 2010-6-8 20:53 | 只看该作者
你是自己写的PC端驱动程序?是不是你PC端解析包协议出错了。
你的问题具体一下看不到是哪地方的问题,以前只用STM32搞过HID和MASS STORAGE的,对PC端USB驱动不太了解。
      其实对STM32这边来说,USB做的工作是比较简单的,简单的说就是响应,STM32来中断后收数据然后做出响应的响应回给PC

使用特权

评论回复
7
火箭球迷|  楼主 | 2010-6-8 21:08 | 只看该作者
这样吧,我讲一下我设计的思路。
STM32功能:每次windows程序发送数据过来,则保存在缓冲区内;若windows程序读取数据,则把缓冲区内的数据发送出去。

windows程序功能:执行一次功能则发送32字节数据给STM32,然后读取刚刚发送出去的32字节数据,也就是说每次发送和读取的数据应该是一样。

以下是bus hound的数据。
测试步骤:

打开windows程序,第一次发送“00 01 02 03  04 05 06 07  08 09 0a 0b  0c 0d 0e 0f 10 11 12 13  14 15 16 17  18 19 1a 1b  1c 1d 1e 1f” 32字节数据。bus hound上没有显示有读取数据,但是windows上显示读取数据都为0xcc;

第二次发送“01 02 03 04  05 06 07 08  09 0a 0b 0c  0d 0e 0f 10 11 12 13 14  15 16 17 18  19 1a 1b 1c  1d 1e 1f 20”32字节,跟着windows读取32字节“00 01 02 03  04 05 06 07  08 09 0a 0b  0c 0d 0e 0f  10 11 12 13  14 15 16 17  18 19 1a 1b  1c 1d 1e 1f”这里就不对应了。读取的32字节是第一次发送的32字节。

第三次发送“02 03 04  05 06 07 08  09 0a 0b 0c  0d 0e 0f 10 11 12 13 14  15 16 17 18  19 1a 1b 1c  1d 1e 1f 20 21”32字节,跟着windows读取32字节“ 01 02 03  04 05 06 07  08 09 0a 0b  0c 0d 0e 0f  10 11 12 13  14 15 16 17  18 19 1a 1b  1c 1d 1e 1f 20”同样不对应了。读取的32字节是第二次发送的32字节。

第四次发送“03 04  05 06 07 08  09 0a 0b 0c  0d 0e 0f 10 11 12 13 14  15 16 17 18  19 1a 1b 1c  1d 1e 1f 20 21 22”32字节,跟着windows读取32字节“02 03  04 05 06 07  08 09 0a 0b  0c 0d 0e 0f  10 11 12 13  14 15 16 17  18 19 1a 1b  1c 1d 1e 1f 20 21”同样不对应了。读取的32字节是第三次发送的32字节。


bus hound数据如下:
  Device - Device ID (followed by the endpoint for USB devices)
            (16) Generic USB Hub
            (21) STM32 USB
  Phase  - Phase Type
            CTL   USB control transfer      
            DI    Data in                    
            DO    Data out                  
  Data   - Hex dump of the data transferred
  Descr  - Description of the phase
  Cmd... - Position in the captured data

Device  Phase  Data                                                Description       Cmd.Phase.Ofs(rep)
------  -----  --------------------------------------------------  ----------------  ------------------
  16.1  DI     02                                                  .                        1.1.0        
  16.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS               2.1.0(2)     
  16.0  DI     01 01 01 00                                         ....                     2.2.0        
  16.0  CTL    23 01 10 00  01 00 00 00                            CLEAR FEATURE            4.1.0        
  16.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS               5.1.0(2)     
  16.0  DI     01 01 00 00                                         ....                     5.2.0        
  16.0  CTL    23 03 04 00  01 00 00 00                            SET FEATURE              7.1.0        
  16.1  DI     02                                                  .                        8.1.0        
  16.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS               9.1.0        
  16.0  DI     03 01 10 00                                         ....                     9.2.0        
  16.0  CTL    23 01 14 00  01 00 00 00                            CLEAR FEATURE           10.1.0        
  16.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS              11.1.0(2)     
  16.0  DI     03 01 00 00                                         ....                    11.2.0        
  16.0  CTL    23 03 04 00  01 00 00 00                            SET FEATURE             13.1.0        
  16.1  DI     02                                                  .                       14.1.0        
  16.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS              15.1.0        
  16.0  DI     03 01 10 00                                         ....                    15.2.0        
  16.0  CTL    23 01 14 00  01 00 00 00                            CLEAR FEATURE           16.1.0        
  16.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS              17.1.0        
  16.0  DI     00 01 00 00                                         ....                    17.2.0        
  16.0  CTL    a3 00 00 00  03 00 04 00                            GET STATUS              18.1.0        
  16.0  DI     00 01 00 00                                         ....                    18.2.0        
  16.0  CTL    a3 00 00 00  04 00 04 00                            GET STATUS              19.1.0        
  16.0  DI     00 01 00 00                                         ....                    19.2.0        
  16.0  CTL    a3 00 00 00  05 00 04 00                            GET STATUS              20.1.0        
  16.0  DI     00 01 00 00                                         ....                    20.2.0        
  16.0  CTL    a3 00 00 00  06 00 04 00                            GET STATUS              21.1.0        
  16.0  DI     00 01 00 00                                         ....                    21.2.0        
  16.0  CTL    a3 00 00 00  07 00 04 00                            GET STATUS              22.1.0        
  16.0  DI     00 01 00 00                                         ....                    22.2.0        
  21.0  CTL    80 06 00 01  00 00 12 00                            GET DESCRIPTOR          23.1.0        
  21.0  DI     12 01 10 01  00 00 00 40  59 58 01 00  00 02 01 02  [email=.......@YX].......@YX[/email]......        23.2.0        
               03 01                                               ..                      23.2.16      
  21.0  CTL    80 06 00 02  00 00 09 00                            GET DESCRIPTOR          24.1.0        
  21.0  DI     09 02 20 00  01 01 00 a0  32                        .. .....2               24.2.0        
  21.0  CTL    80 06 00 02  00 00 20 00                            GET DESCRIPTOR          25.1.0        
  21.0  DI     09 02 20 00  01 01 00 a0  32 09 04 00  00 02 ff ff  .. .....2.......        25.2.0        
               ff 04 07 05  81 02 40 00  00 07 05 02  02 40 00 00  ......@......@..        25.2.16      
  21.0  CTL    80 00 00 00  00 00 02 00                            GET STATUS              26.1.0        
  21.0  DI     03 00                                               ..                      26.2.0        
  21.0  CTL    00 09 01 00  00 00 00 00                            SET CONFIG              27.1.0        
  21.2  DO     00 01 02 03  04 05 06 07  08 09 0a 0b  0c 0d 0e 0f  ................        28.1.0        
               10 11 12 13  14 15 16 17  18 19 1a 1b  1c 1d 1e 1f  ................        28.1.16      
  21.2  DO     01 02 03 04  05 06 07 08  09 0a 0b 0c  0d 0e 0f 10  ................        29.1.0        
               11 12 13 14  15 16 17 18  19 1a 1b 1c  1d 1e 1f 20  ...............         29.1.16      
  21.1  DI     00 01 02 03  04 05 06 07  08 09 0a 0b  0c 0d 0e 0f  ................        30.1.0        
               10 11 12 13  14 15 16 17  18 19 1a 1b  1c 1d 1e 1f  ................        30.1.16      
  21.2  DO     02 03 04 05  06 07 08 09  0a 0b 0c 0d  0e 0f 10 11  ................        31.1.0        
               12 13 14 15  16 17 18 19  1a 1b 1c 1d  1e 1f 20 21  .............. !        31.1.16      
  21.1  DI     01 02 03 04  05 06 07 08  09 0a 0b 0c  0d 0e 0f 10  ................        32.1.0        
               11 12 13 14  15 16 17 18  19 1a 1b 1c  1d 1e 1f 20  ...............         32.1.16      
  21.2  DO     03 04 05 06  07 08 09 0a  0b 0c 0d 0e  0f 10 11 12  ................        33.1.0        
               13 14 15 16  17 18 19 1a  1b 1c 1d 1e  1f 20 21 22  ............. !"        33.1.16      
  21.1  DI     02 03 04 05  06 07 08 09  0a 0b 0c 0d  0e 0f 10 11  ................        34.1.0        
               12 13 14 15  16 17 18 19  1a 1b 1c 1d  1e 1f 20 21  .............. !        34.1.16

使用特权

评论回复
8
香水城| | 2010-6-8 22:37 | 只看该作者
这样吧,我讲一下我设计的思路。
STM32功能:每次windows程序发送数据过来,则保存在缓冲区内;若windows程序读取数据,则把缓冲区内的数据发送出去。

windows程序功能:执行一次功能则发送32字节数据给STM32,然后读取刚刚发送出去的32字节数据,也就是说每次发送和读取的数据应该是一样。

以下是bus hound的数据。
测试步骤:

打开windows程序,第一次发送“00 01 02 03  04 05 06 07  08 09 0a 0b  0c 0d 0e 0f 10 11 12 13  14 15 16 17  18 19 1a 1b  1c 1d 1e 1f” 32字节数据。bus hound上没有显示有读取数据,但是windows上显示读取数据都为0xcc;

...
火箭球迷 发表于 2010-6-8 21:08


关键是你的Windows程序,为什么"Bus hound上没有显示有读取数据"?显然读取数据的操作并没有发送USB请求给STM32。

使用特权

评论回复
9
zwll| | 2010-6-8 22:38 | 只看该作者
还是没看懂……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:姚明的铁杆球迷

150

主题

3470

帖子

3

粉丝