小弟近一个月一直在研究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真心别串口什么的复杂太多了...
|
|