[STM32F1] 关于STM32 USB数据采集系统,怎么提高USB传输速度

[复制链接]
8317|23
 楼主| Evanss 发表于 2015-1-13 16:27 | 显示全部楼层 |阅读模式
最近在做个数据采集系统,8个模拟通道,最大采集速率想做到20K,然后把数据传给PC,保存和绘图。但是由于数据量很大,USB的IN端口的发送怎么都提不上来(100KB/s左右),好像双缓存也没什么效果(不知道是不是代码有问题)。求大神支援。
 楼主| Evanss 发表于 2015-1-13 16:28 | 显示全部楼层
USB 端口1代码
  1. SetEPType(ENDP1, EP_BULK);
  2. // SetEPTxAddr(ENDP1, ENDP1_TXADDR);

  3.   SetEPDoubleBuff(ENDP1);   //
  4.   SetEPDblBuffAddr(ENDP1, ENDP1_TXADDR, ENDP1_TXADDR_BUF); //
  5.   //SetEPDblBuffCount(ENDP1, EP_DBUF_IN, VIRTUAL_COM_PORT_DATA_SIZE); //
  6.   ClearDTOG_RX(ENDP1);  //
  7.   ClearDTOG_TX(ENDP1);  //
  8.   ToggleDTOG_RX(ENDP1); //
  9.   SetEPTxStatus(ENDP1, EP_TX_NAK);
  10.   SetEPRxStatus(ENDP1, EP_RX_DIS);
  11. void EP1_IN_Callback (void)
  12. {
  13.   uint16_t USB_Tx_ptr;
  14.   uint16_t USB_Tx_length;
  15.   
  16.   if (USB_Tx_State == 1)
  17.   {
  18.     if (AD_Tx_length == 0)
  19.     {
  20.       USB_Tx_State = 0;
  21.     }
  22.     else
  23.     {
  24.       if (AD_Tx_length > (VIRTUAL_COM_PORT_DATA_SIZE)){
  25.         USB_Tx_ptr = AD_Tx_ptr_out;
  26.         USB_Tx_length = (VIRTUAL_COM_PORT_DATA_SIZE) ;
  27.         AD_Tx_ptr_out += (VIRTUAL_COM_PORT_DATA_SIZE);
  28.         AD_Tx_length -= (VIRTUAL_COM_PORT_DATA_SIZE);   
  29.       }
  30.       else
  31.       {
  32.         USB_Tx_ptr = AD_Tx_ptr_out;
  33.         USB_Tx_length = AD_Tx_length;
  34.         
  35.         AD_Tx_ptr_out += AD_Tx_length;
  36.         AD_Tx_length = 0;
  37.       }
  38.                         if (GetENDPOINT(ENDP1) & EP_DTOG_RX)
  39.                         {
  40.                                 UserToPMABufferCopy(&AD_Tx_Buffer[USB_Tx_ptr], ENDP1_TXADDR_BUF, USB_Tx_length);
  41.                                 FreeUserBuffer(ENDP1, EP_DBUF_IN);
  42.                                 SetEPTxCount(ENDP1, USB_Tx_length);
  43.                                 SetEPTxValid(ENDP1);
  44.                         }
  45.                         else
  46.                         {
  47.                                         UserToPMABufferCopy(&AD_Tx_Buffer[USB_Tx_ptr], ENDP1_TXADDR, USB_Tx_length);
  48.                                         FreeUserBuffer(ENDP1, EP_DBUF_IN);
  49.                                         SetEPTxCount(ENDP1, USB_Tx_length);
  50.                                         SetEPTxValid(ENDP1);
  51.                         }
  52.     }
  53.   }
  54. }
 楼主| Evanss 发表于 2015-1-13 16:29 | 显示全部楼层
下位机图
QQ图片20150114023959.jpg
 楼主| Evanss 发表于 2015-1-13 16:41 | 显示全部楼层
每次都没人回复,是我做错了什么吗?
pattywu 发表于 2015-1-13 16:59 | 显示全部楼层
    你要能保证每次发送最大数据量,usb的速度就不会慢。
    当然,包最好不要达到64字节。(64字节的包,usb认为还有后续数据,不会马上传给应用程序)
    另外,st的usb虚拟串口代码,是串行操作的,速度不会很快。
    你得想办法把它改成并行。即:USB在发送数据的时候,你的AD已经在准备下次发送的数据。
    而不是:等USB把数据发完,你再准备AD的数据。
 楼主| Evanss 发表于 2015-1-13 17:12 | 显示全部楼层
pattywu 发表于 2015-1-13 16:59
你要能保证每次发送最大数据量,usb的速度就不会慢。
    当然,包最好不要达到64字节。(64字节的包, ...

AD数据放在环形队列里面的。试过每个包63个字节,好像一次就发63个字节(BUS HOUND 看到的),没有现在的快。
pattywu 发表于 2015-1-13 17:16 | 显示全部楼层
本帖最后由 pattywu 于 2015-1-13 17:18 编辑

看一下端点描述符,把时间间隔改成0,再试试。

不要太想信那些测试设备。
你自己调试一下,设几个变量,把发送的数量和时间记下来,自己计算一下速度。

评分

参与人数 1威望 +2 收起 理由
Evanss + 2 赞一个!

查看全部评分

 楼主| Evanss 发表于 2015-1-13 17:22 | 显示全部楼层
BUS HOUND捕获的图,不知道怎么测准电脑端接收的数据,一直都通过1分钟串口助手收到的数据个数来判断。而BUS HOUND 608个数据大概3ms的样子,这样算的话有200K左右,但是通过串口助手只有100K。
_E`5615~EL8{4F`I$[(BNSW.png
 楼主| Evanss 发表于 2015-1-13 19:01 | 显示全部楼层
pattywu 发表于 2015-1-13 17:16
看一下端点描述符,把时间间隔改成0,再试试。

不要太想信那些测试设备。

自己写了一个任务每隔1s去读下发送的数据个数,最多就120K左右了。
 楼主| Evanss 发表于 2015-1-13 19:15 | 显示全部楼层
 楼主| Evanss 发表于 2015-1-13 19:25 | 显示全部楼层
huangqi412 发表于 2015-1-13 20:54 | 显示全部楼层
一帧发几百个字节,一帧分成若干个64字节的包。。。  当然,前提是用批量或者同步模式
myx1992521 发表于 2015-1-13 21:33 | 显示全部楼层
不好意思,借个楼(帖子一直没人回复。。),我想问下楼主usb传输数据会出错吗?我使用的是usb out模式,发三个字节,接受的只能送到前两个,并且放在后两位(例如发1 2 3,接受结果是0  1 2,下一次再发的时候,例如再发4 5 6,接受结果是3 4 5),就是说第一位总是会出现延时状况,不知道楼主以及各路高手知道原因么?
icecut 发表于 2015-1-13 22:35 | 显示全部楼层
用死循环往 usb 里写.看速度.
pattywu 发表于 2015-1-13 23:31 | 显示全部楼层
另外,串口助手本身的处理速度,也是个问题。
还是自己写个小程序验证一下。

上位机程序写的不坏的话,达到500K字节,不算难的。
huangqi412 发表于 2015-1-14 10:09 | 显示全部楼层
上位机用个通用串口助手,搞2个LED,  分别指示发帧时刻,发包时刻,慢的原因一分钟一目了然,再针对具体应用做规划。
insignal 发表于 2015-1-14 10:58 | 显示全部楼层
本帖最后由 insignal 于 2015-1-14 11:08 编辑

stm32哪个型号?即便是full speed接口,做U盘也能达到900kB/s
加上采集,按5折算都有400kB/s
简单改改缓存大小,如果还不行,那就是程序框架或者选择的usb协议不合适。
huangqi412 发表于 2015-1-14 11:33 | 显示全部楼层
insignal 发表于 2015-1-14 10:58
stm32哪个型号?即便是full speed接口,做U盘也能达到900kB/s
加上采集,按5折算都有400kB/s
简单改改缓存 ...

U盘能做到900K?
insignal 发表于 2015-1-14 14:42 | 显示全部楼层
huangqi412 发表于 2015-1-14 11:33
U盘能做到900K?

做得好的 接近1MB/s
huangqi412 发表于 2015-1-14 22:12 | 显示全部楼层
insignal 发表于 2015-1-14 14:42
做得好的 接近1MB/s

有点怀疑,文件系统等等东西都要开销
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

21

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部