打印

离奇的bulk in传输,求高人指点

[复制链接]
7315|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dayplover|  楼主 | 2012-5-4 21:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验1:在EP3 OUT的中断函数中,转发该端点收到的PC下发的数据到EP1 IN端点,设置EP1 VALID,结果主机收到了这段数据;实验2:在EP3 OUT的中断函数中,PC下发数据后,将MCU自己生成的数据(自己做了一个数组,往里面填了些数据)转到EP1 IN端点,设置EP1 VALID,结果主机收不到这段数据;断电后,,,收到
这是个神马情况,搞了一天,快疯了,求达人指点,感激不尽
沙发
pattywu| | 2012-5-5 01:20 | 只看该作者
可能你的USB枚举数据有问题。

使用特权

评论回复
板凳
dayplover|  楼主 | 2012-5-5 08:55 | 只看该作者
但是实验1是成功的,是不是说明枚举没问题?

使用特权

评论回复
地板
pattywu| | 2012-5-5 10:38 | 只看该作者
不能说明枚举没问题。
     也许只能上传一帧数据也说不定。

使用特权

评论回复
5
香水城| | 2012-5-5 12:12 | 只看该作者
请问你实验1与实验2传送的数据长度一样吗?内容一样吗?

你的问题与使用的协议有关,与枚举无关。

使用特权

评论回复
6
dayplover|  楼主 | 2012-5-5 15:35 | 只看该作者
在EP3 OUT的中断响应函数中:
实验一:
USB_SIL_Write(EP1_IN, Receive_Buffer,count_out);  
SetEPTxValid(ENDP1);
其中,Receive_Buffer是定义的一个数组,用来存储3号输出端点收到的数据。用bus hound发出一组数据,就进入该中断,执行上述代码,捕获到相同的数据,表示发送/接收成功。
实验二:
进入中断后
//产生数据
  int i;
  for(i=0;i<64;i++)
  {
    Tem_Tx_Buffer_0[i] = 0x01;
  }

USB_SIL_Write(EP1_IN, Tem_Tx_Buffer_0,64);
SetEPTxValid(ENDP1);
仍使用bushound发送数据触发中断,执行以上代码,结果没能收到数据。
求指点迷津

使用特权

评论回复
7
dayplover|  楼主 | 2012-5-5 16:04 | 只看该作者
多谢各位关心,问题已解决,将实验2中的传输64个字节改小即可。。。同时实验1中如果是64也不行。好吧,至少问题转移到怎么解决64个字节的问题了,松了一口气。60都行,,,,64为什么不行,没天理啊

使用特权

评论回复
8
pattywu| | 2012-5-5 22:12 | 只看该作者
如果刚好是64字节,紧跟着必须发一帧长度为0的帧,告诉USB的host,数据帧发完了,可以提交给上层应用了。
    你参考一下,端点0在发送枚举数据时的代码。

使用特权

评论回复
9
huangfeng33| | 2012-5-6 00:13 | 只看该作者
8# pattywu

使用特权

评论回复
10
dayplover|  楼主 | 2012-5-6 21:15 | 只看该作者
pattywu,确实如你所言,64字节是无论如何收不到的;63字节没问题;65字节情况比较复杂,总结下来有四种可能,随机发生:收不到;收到第65字节数据;收到完整的65字节数据;收到前几次发送的但没收到的数据以及本次数据。。。应该是端点收发程序写的太简陋了。那么有一个问题请教诸位,假如端点缓冲区大小只有64字节,可否在一次bulk传输中传输超过64字节的数据?个人倾向于不行,因为当PC轮询到这个端点时,发现它只有这么些数据,就收走了,还有数据就是下一次的了。。。这个理解对么?

使用特权

评论回复
11
pattywu| | 2012-5-6 22:05 | 只看该作者
不对的。
    host主机对于bulk端点,一次最多可以接收4K字节的。
    如果是65字节,那要发2次:1次64字节,再一次发1字节;然后主机要等到下次来接收数据了。

使用特权

评论回复
12
香水城| | 2012-5-6 22:06 | 只看该作者
对于全速USB,每个Token所能传送的最大包是64字节,大于64字节就要分开传送,正好64字节时就要多发一个0字节的包。

更详细的内容,请看USB协议。

使用特权

评论回复
13
Simon21ic| | 2012-5-7 02:09 | 只看该作者
ZLP

使用特权

评论回复
14
dayplover|  楼主 | 2012-5-7 08:58 | 只看该作者
那么,STM32的USB外设设置的端点缓冲区的大小对传输速率的影响体现在哪里呢?我尝试将它设置为200字节大小,但是,,,报错了,求指点,谢谢

使用特权

评论回复
15
vigia| | 2012-5-7 11:18 | 只看该作者
缓冲区设小了数据会丢失,设大了浪费空间
一般你的数据最大包长度是多少,缓冲区就设多少
比如BULK的包最多是64字节,缓冲区64字节足以
如果要提高传输效率,可以使用双缓存,但是每个缓存还是64字节足以

63字节的数据,一个包就可以发完,64字节到127字节的数据,要2个包,以此类推,只能在收到前一个EP1 IN中断之后,才能启动第二个包的传输

具体看我这个帖子
https://bbs.21ic.com/viewthread.p ... ;highlight=%2Bvigia

使用特权

评论回复
16
dayplover|  楼主 | 2012-5-7 21:08 | 只看该作者
谢谢各位的热心指导,受益良多。小弟还有一个问题,在一次传输完64字节数据后,用什么判断传输完了?因为要求在定时中断中处理USB传输,而不是到端点回调函数中去执行。我跟踪了固件库,也查阅了手册,觉得应该是if((_GetENDPOINT(ENDP1) & EPTX_STAT) == EP_TX_NAK)这个条件来判断,因为传输完成后,硬件会置位CTR和STAT位,固件函数已经清除了CTR位,剩下一个STAT,需要用SetEPTxValid(ENDP1)来置位,可是没用。不知道还有哪里疏忽了,或者还有别的判断方法么?谢谢各位不吝赐教,多谢

使用特权

评论回复
17
pattywu| | 2012-5-8 00:02 | 只看该作者
我不用ST的库,你的问题我解答不了。

使用特权

评论回复
18
vigia| | 2012-5-8 10:30 | 只看该作者
因为要求在定时中断中处理USB传输,而不是到端点回调函数中去执行


端点回调函数中设置一个标识符,在你需要进行传输的地方查询该标识符,如果标识符成立,说明前一次传输成功,可以启动下一次传输,如果标识符不成立,等待你的下一次定时中断。

我理解没错吧。。。

使用特权

评论回复
19
dayplover|  楼主 | 2012-5-8 14:32 | 只看该作者
是的,就是这样的

使用特权

评论回复
20
dayplover|  楼主 | 2012-5-8 15:18 | 只看该作者
理想情况是不进端点中断,所以想查端点寄存器的标识符,但是。。。没成功,到底是该使用哪个判断条件呢?

使用特权

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

本版积分规则

0

主题

38

帖子

1

粉丝