打印

STM32F107 USB OTG 的DEVICE模式BULK传输研究,几个问题求解

[复制链接]
8373|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小弟近一个月一直在研究STM32F107 的 USB传输.

由于有上位机开发经验,并且一两年前也研究过STM32F107的USB,这次准备开发一个USB CAN高速监控设备.

目前碰到几个关于OTG device 模式的几个问题:

首先是BULK传输的问题.
经过计算,CAN总线在最高速传输时(1M波特率)可以达到7帧每毫秒的传输速度,并且很稳定.在经过PCAN验证后发现STM32的CAN也是非常稳定可以接收7帧左右每毫秒,满速情况下不丢帧.
在设计初期,我准备用BULK传输作为传输方式,以1MS在主循环轮询,查看是否有CAN新接收的数据在缓存,如果缓存有数据,则发送USB数据给上位机.上位机使用线程,全程读取,不延迟,理论上是一有数据立即读取的,可以保证实时性.并且BULK传输的传输数据量经过测试可以达到近1M的字节传输速度,因此个人认为完全够用,结果出现以下问题:


可以看到,在多数情况下,USB BULK传输511字节,可以保持在1MS之内,但是在某些情况下,传输不知道是什么原因会被搁置几个毫秒.别看这几个毫秒,每一个毫秒在满速情况下需要占用我约200字节的缓存消耗,STM32F107的内存本来也不是非常大..所以就算延迟了几个毫秒,基本会导致缓存溢出,从而丢帧.
请问高手,USB BULK是否无法保证传输的实时性?这种非常偶尔出现的毫秒级搁置是否正常?

经过了解,一次BULK传输应该在USB2.0全速情况下,每次传输可以达到512字节,应该是一毫秒一次.但是为什么有些传输经过时间需要达到好几毫秒呢?不太理解,求助...

另一个问题,STM32可以设置SOF(即USB帧起始)包中断,经过对比发现SOF基本上是很稳定的1MS一次,但是如果某BULK帧占用了5MS时间,是否中间的SOF帧就收不到了?

还有一个关于STM32 OTG/USB 库的问题,每次调用函数  USB_SIL_Write(EP2_IN, outbuff, len) 中,发送长度为64的整数倍的时候,该次发送就不成功(用BUSHOUND显示BABBLE DETECTED,用USBlyzer显示BULK传输FAIL),比如,len设置63,65都可以,但是设置64就发送失败.在这个程序里所有设置里,每一个packet size都设置的是0X40,也就是64,但是和发送数据应该是没有关系的,不知道是否有人碰到过这种问题?


求高手解决......

另,发现网上讨论这方面的东西非常少..除了论坛,也就总共没几篇**了,真心希望有人能来讨论

现在只想做一个USB设备....话说USB真心别串口什么的复杂太多了...













沙发
IJK| | 2013-4-18 16:47 | 只看该作者
USB BULK是否无法保证传输的实时性?这种非常偶尔出现的毫秒级搁置是否正常?

是这么回事,USB BULK在设计USB协议时就是不保证传输实时性的。

使用特权

评论回复
板凳
IJK| | 2013-4-18 16:50 | 只看该作者
如果某BULK帧占用了5MS时间,是否中间的SOF帧就收不到了?

SOF帧不会 因为BULK传输丢掉

使用特权

评论回复
地板
wangjun2012| | 2013-4-18 16:58 | 只看该作者
关键的问题是STM32的库很多BUG的,我也遇到但不是一两句就讲清楚.而这方面的支持真的是太少啦,我自己慢慢摸索的饿

使用特权

评论回复
5
cjhk| | 2013-4-18 18:27 | 只看该作者
只能自己慢慢摸索了   做电子工程师  需要学会自己独立面对很多问题   同时要独立解决很多问题

使用特权

评论回复
6
kingzhang132|  楼主 | 2013-4-19 08:06 | 只看该作者
再顶一个~

如果某帧BULK时间间隔达到了100MS,是不是不正常了?但是最后还是有进接受完成中断啊..

使用特权

评论回复
7
kingzhang132|  楼主 | 2013-4-19 08:23 | 只看该作者
问一个问题,STM32F107 里USB中断中,FIFO发送空中断和IN传输完成中断有区别么?

使用特权

评论回复
8
qdszl| | 2013-4-19 20:08 | 只看该作者
你好,小弟最近刚开始研究stm32F107 USB OTG的设备模式 我想做一个读卡器用stm32读取tf卡,现在我用st自带的USBOTG的库里面好像有很多都没有定义的变量,我用的是keil编译器,您能发个我一个编译没有错误的库吗谢谢  我的qq 1052675255

使用特权

评论回复
9
kingzhang132|  楼主 | 2013-4-22 11:08 | 只看该作者
qdszl 发表于 2013-4-19 20:08
你好,小弟最近刚开始研究stm32F107 USB OTG的设备模式 我想做一个读卡器用stm32读取tf卡,现在我用st自带 ...

你好,估计你没有选择工程文档,在左上角工程选项里选择一个对应你MCU型号的开发板应该就可以了

使用特权

评论回复
10
qdszl| | 2013-4-22 22:33 | 只看该作者
error:#20:identifier USBF_ERR_NONE is undefined
error:#20:identifier USBF_USB_OTG_DevPtr is undefined
就是这两个变量没有定义 是在 USB_PCB。c文件里

使用特权

评论回复
11
kingzhang132|  楼主 | 2013-4-24 16:12 | 只看该作者
好吧,我来结贴了

目前可以实现 1MS 6个CAN中断,100W帧不丢帧全部上位机接收成功,并且带有标准的时间戳..给出个DEMO画面,其中时间间隔用是的接收帧数间隔所以显示的并不是实际接收时间间隔,实际间隔是1MS.

第一次UCAN成功.jpg (162.94 KB )

第一次UCAN成功.jpg

使用特权

评论回复
12
lxyppc| | 2013-4-24 17:25 | 只看该作者
Bulk传输是这样的,如果SOF开始后数据还没有准备好,那么会错过这一个帧的传输时间
107是带FIFO的,可以尝试把FIFO设置大一些,你的应该不是这个问题
Bulk的效率和PC那边的驱动层也有一些关系,不过一般驱动中都开一个比较大的缓存,不会成为瓶颈
PC端在收到USB的数据后要立即通过ReadFile发个URB下去,这样才能充分利用带宽

貌似楼主已经解决了这个问题,不知道是如何解决的

使用特权

评论回复
13
cjhk| | 2013-4-24 19:20 | 只看该作者
怎样解决的   楼主   把你的经验贴出来看看吧   希望对我有收获

使用特权

评论回复
14
kingzhang132|  楼主 | 2013-5-6 16:36 | 只看该作者
我发现讨论USB或者传授USB经验的帖子普遍非常少,估计一是因为USB起点高,门槛高,二是大家也不愿意分享高端的经验~~话说这次调试真是整死我了,其中很多问题如果问有经验的人估计2个月的工作量可以压缩成1星期~哎

姑且透露一下,在USB端点中断里,如果要达到最高速度的IN即下位机发送USB给上位机,必须好好利用USB IN端点中断...实话说USB的反应速度并没有很多人想的那么快,并且非常不稳定..结贴了

使用特权

评论回复
15
hawksabre| | 2013-5-6 19:29 | 只看该作者
呵呵   结贴这么快   问题解决就好

使用特权

评论回复
16
lanmanck| | 2013-5-21 23:47 | 只看该作者
他妈的主要是ST太垃圾,把bulk藏着捂着,一点没有cypress和silabs做的好,人家的bulk传输例子刚刚的,要不是他的cpu带CAN,鬼才用他来USB to can呢。

使用特权

评论回复
17
beyond696| | 2013-8-9 18:43 | 只看该作者
其实ST的USB本身并不错,关键是他提供的库原本就有很多问题,需要自己优化,我用107和PC机通信数据基本上可以稳定的达到1MByte/s,其核心技巧是增大单次数据传输的数据量,有的人说bulk传输一次性只能传输64字节数据,这是针对全速USB2.0底层协议来说的,对于软件应用层完全可以一次性发送几十K字节数据都没问题,数据发送完全通过USB的中断来处理,这样基本上可以达到全速USB2.0的理论速度。

使用特权

评论回复
18
beyond696| | 2013-8-9 18:51 | 只看该作者

大家可以通过这个软件里面看到,在一个毫秒内基本上可以接收9帧数据,也就是说每秒可以接收9000帧左右的数据,而且在双通道同时接收的时候完全不会丢帧。


使用特权

评论回复
19
powder| | 2014-12-15 15:01 | 只看该作者
好久没有来这里了,时间过去太久了,讨论回答估计也没有用了

使用特权

评论回复
20
xuanchenzhu| | 2018-12-17 13:56 | 只看该作者
beyond696 发表于 2013-8-9 18:43
其实ST的USB本身并不错,关键是他提供的库原本就有很多问题,需要自己优化,我用107和PC机通信数据基本上可 ...

唯一的问题是,pma确实只有64byte的大小,但是fifo的大小比pma的端点的txbuffer大的多,这两者之间是什么关系呢?

使用特权

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

本版积分规则

3

主题

13

帖子

0

粉丝