打印
[STM32F1]

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

[复制链接]
7412|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Evanss|  楼主 | 2015-1-13 16:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
最近在做个数据采集系统,8个模拟通道,最大采集速率想做到20K,然后把数据传给PC,保存和绘图。但是由于数据量很大,USB的IN端口的发送怎么都提不上来(100KB/s左右),好像双缓存也没什么效果(不知道是不是代码有问题)。求大神支援。
沙发
Evanss|  楼主 | 2015-1-13 16:28 | 只看该作者
USB 端口1代码
SetEPType(ENDP1, EP_BULK);
// SetEPTxAddr(ENDP1, ENDP1_TXADDR);

  SetEPDoubleBuff(ENDP1);   //
  SetEPDblBuffAddr(ENDP1, ENDP1_TXADDR, ENDP1_TXADDR_BUF); //
  //SetEPDblBuffCount(ENDP1, EP_DBUF_IN, VIRTUAL_COM_PORT_DATA_SIZE); //
  ClearDTOG_RX(ENDP1);  //
  ClearDTOG_TX(ENDP1);  //
  ToggleDTOG_RX(ENDP1); //
  SetEPTxStatus(ENDP1, EP_TX_NAK);
  SetEPRxStatus(ENDP1, EP_RX_DIS);
void EP1_IN_Callback (void)
{
  uint16_t USB_Tx_ptr;
  uint16_t USB_Tx_length;
  
  if (USB_Tx_State == 1)
  {
    if (AD_Tx_length == 0)
    {
      USB_Tx_State = 0;
    }
    else
    {
      if (AD_Tx_length > (VIRTUAL_COM_PORT_DATA_SIZE)){
        USB_Tx_ptr = AD_Tx_ptr_out;
        USB_Tx_length = (VIRTUAL_COM_PORT_DATA_SIZE) ;
        AD_Tx_ptr_out += (VIRTUAL_COM_PORT_DATA_SIZE);
        AD_Tx_length -= (VIRTUAL_COM_PORT_DATA_SIZE);   
      }
      else
      {
        USB_Tx_ptr = AD_Tx_ptr_out;
        USB_Tx_length = AD_Tx_length;
        
        AD_Tx_ptr_out += AD_Tx_length;
        AD_Tx_length = 0;
      }
                        if (GetENDPOINT(ENDP1) & EP_DTOG_RX)
                        {
                                UserToPMABufferCopy(&AD_Tx_Buffer[USB_Tx_ptr], ENDP1_TXADDR_BUF, USB_Tx_length);
                                FreeUserBuffer(ENDP1, EP_DBUF_IN);
                                SetEPTxCount(ENDP1, USB_Tx_length);
                                SetEPTxValid(ENDP1);
                        }
                        else
                        {
                                        UserToPMABufferCopy(&AD_Tx_Buffer[USB_Tx_ptr], ENDP1_TXADDR, USB_Tx_length);
                                        FreeUserBuffer(ENDP1, EP_DBUF_IN);
                                        SetEPTxCount(ENDP1, USB_Tx_length);
                                        SetEPTxValid(ENDP1);
                        }
    }
  }
}

使用特权

评论回复
板凳
Evanss|  楼主 | 2015-1-13 16:29 | 只看该作者
下位机图

QQ图片20150114023959.jpg (45.43 KB )

QQ图片20150114023959.jpg

使用特权

评论回复
地板
Evanss|  楼主 | 2015-1-13 16:41 | 只看该作者
每次都没人回复,是我做错了什么吗?

使用特权

评论回复
5
pattywu| | 2015-1-13 16:59 | 只看该作者
    你要能保证每次发送最大数据量,usb的速度就不会慢。
    当然,包最好不要达到64字节。(64字节的包,usb认为还有后续数据,不会马上传给应用程序)
    另外,st的usb虚拟串口代码,是串行操作的,速度不会很快。
    你得想办法把它改成并行。即:USB在发送数据的时候,你的AD已经在准备下次发送的数据。
    而不是:等USB把数据发完,你再准备AD的数据。

使用特权

评论回复
6
Evanss|  楼主 | 2015-1-13 17:12 | 只看该作者
pattywu 发表于 2015-1-13 16:59
你要能保证每次发送最大数据量,usb的速度就不会慢。
    当然,包最好不要达到64字节。(64字节的包, ...

AD数据放在环形队列里面的。试过每个包63个字节,好像一次就发63个字节(BUS HOUND 看到的),没有现在的快。

使用特权

评论回复
7
pattywu| | 2015-1-13 17:16 | 只看该作者
本帖最后由 pattywu 于 2015-1-13 17:18 编辑

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

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

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
Evanss + 2 赞一个!
8
Evanss|  楼主 | 2015-1-13 17:22 | 只看该作者
BUS HOUND捕获的图,不知道怎么测准电脑端接收的数据,一直都通过1分钟串口助手收到的数据个数来判断。而BUS HOUND 608个数据大概3ms的样子,这样算的话有200K左右,但是通过串口助手只有100K。

_E`5615~EL8{4F`I$[(BNSW.png (4.94 KB )

_E`5615~EL8{4F`I$[(BNSW.png

使用特权

评论回复
9
Evanss|  楼主 | 2015-1-13 19:01 | 只看该作者
pattywu 发表于 2015-1-13 17:16
看一下端点描述符,把时间间隔改成0,再试试。

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

自己写了一个任务每隔1s去读下发送的数据个数,最多就120K左右了。

使用特权

评论回复
10
Evanss|  楼主 | 2015-1-13 19:15 | 只看该作者

使用特权

评论回复
11
Evanss|  楼主 | 2015-1-13 19:25 | 只看该作者

使用特权

评论回复
12
huangqi412| | 2015-1-13 20:54 | 只看该作者
一帧发几百个字节,一帧分成若干个64字节的包。。。  当然,前提是用批量或者同步模式

使用特权

评论回复
13
myx1992521| | 2015-1-13 21:33 | 只看该作者
不好意思,借个楼(帖子一直没人回复。。),我想问下楼主usb传输数据会出错吗?我使用的是usb out模式,发三个字节,接受的只能送到前两个,并且放在后两位(例如发1 2 3,接受结果是0  1 2,下一次再发的时候,例如再发4 5 6,接受结果是3 4 5),就是说第一位总是会出现延时状况,不知道楼主以及各路高手知道原因么?

使用特权

评论回复
14
icecut| | 2015-1-13 22:35 | 只看该作者
用死循环往 usb 里写.看速度.

使用特权

评论回复
15
pattywu| | 2015-1-13 23:31 | 只看该作者
另外,串口助手本身的处理速度,也是个问题。
还是自己写个小程序验证一下。

上位机程序写的不坏的话,达到500K字节,不算难的。

使用特权

评论回复
16
huangqi412| | 2015-1-14 10:09 | 只看该作者
上位机用个通用串口助手,搞2个LED,  分别指示发帧时刻,发包时刻,慢的原因一分钟一目了然,再针对具体应用做规划。

使用特权

评论回复
17
insignal| | 2015-1-14 10:58 | 只看该作者
本帖最后由 insignal 于 2015-1-14 11:08 编辑

stm32哪个型号?即便是full speed接口,做U盘也能达到900kB/s
加上采集,按5折算都有400kB/s
简单改改缓存大小,如果还不行,那就是程序框架或者选择的usb协议不合适。

使用特权

评论回复
18
huangqi412| | 2015-1-14 11:33 | 只看该作者
insignal 发表于 2015-1-14 10:58
stm32哪个型号?即便是full speed接口,做U盘也能达到900kB/s
加上采集,按5折算都有400kB/s
简单改改缓存 ...

U盘能做到900K?

使用特权

评论回复
19
insignal| | 2015-1-14 14:42 | 只看该作者
huangqi412 发表于 2015-1-14 11:33
U盘能做到900K?

做得好的 接近1MB/s

使用特权

评论回复
20
huangqi412| | 2015-1-14 22:12 | 只看该作者
insignal 发表于 2015-1-14 14:42
做得好的 接近1MB/s

有点怀疑,文件系统等等东西都要开销

使用特权

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

本版积分规则

5

主题

21

帖子

0

粉丝