STM32 USB改双缓冲后,STM32的OUT接收速度到了1MB/S!

[复制链接]
35997|65
winsunhy 发表于 2011-9-8 07:21 | 显示全部楼层
楼主提到的PIPE MaxTransferSize是在哪里设置的啊?
zxl6534 发表于 2011-10-18 09:03 | 显示全部楼层
请问函数改成
void EP3_OUT_Callback(void)
{
  if (GetENDPOINT(ENDP3) & EP_DTOG_TX)//判断接收到的数据在哪个缓冲区
  {
    count_out = GetEPDblBuf0Count(ENDP3);//读取接收到的字节数
    PMAToUserBufferCopy(buffer_out, ENDP3_BUF0Addr, count_out); //用户拷贝出数据
  }
  else
  {
    count_out = GetEPDblBuf1Count(ENDP3);
    PMAToUserBufferCopy(buffer_out, ENDP3_BUF1Addr, count_out);
  }
  FreeUserBuffer(ENDP3, EP_DBUF_OUT); //翻转标志,释放用户缓冲区
之后和原来使用单缓存有什么区别呢,每次USB都要等用户处理了缓存数据才继续通信,怎么会速度变快呢
}
nds_shenzhen 发表于 2011-10-20 13:39 | 显示全部楼层
楼主没有给源代码啊参考吧,我也想做 但是 不知道应该如何做
kmani 发表于 2012-6-2 12:07 | 显示全部楼层
joe3501 发表于 2012-6-22 14:22 | 显示全部楼层
与42楼的兄弟有相同的疑问。

感觉版主所研究的速度只是STM32 USB模块可以实现的理论上的速度而已,因为从头到尾都是围绕在处理OUT数据包的中断时,利用双缓冲的机制使用户在处理上一包接收到数据的同时还可以接收下一包数据。但是实际很多应用的情况下,用户处理接收到的数据并不仅仅是从端口的接收缓存COPY到用户数据缓存区这么简单,可能还需要将接收到的数据分组重新组包,然后进行其它处理,比如写入SD卡。这段处理时间肯定是不足以在接收完下一个数据包之前能完成的,那么也就体现不出双缓存乒乓机制的优势了。

虽然此贴已经结贴了,但是还是欢迎大家继续讨论下去。
微兮兮 发表于 2013-5-6 10:51 | 显示全部楼层
alien2006 发表于 2008-1-14 23:15
自己还是对USB的协议理解不够深啊。香版主的功力深厚,非常感谢!    现在BULK O ...

Alien你好,请问如果用BOT的话,是不是一次只能发送64个字节?如果我想做到一次性发送几K数据,是利用什么例程来修改呢?非常感谢
STARM 发表于 2013-6-16 11:27 | 显示全部楼层
请问函数改成
void EP3_OUT_Callback(void)
{
  if (GetENDPOINT(ENDP3) & EP_DTOG_TX)//判断接收到的数据在哪个缓冲区
  {
    count_out = GetEPDblBuf0Count(ENDP3);//读取接收到的字节数
    PMAToUserBufferCopy(buffer_out, ENDP3_BUF0Addr, count_out); //用户拷贝出数据
  }
  else
  {
    count_out = GetEPDblBuf1Count(ENDP3);
    PMAToUserBufferCopy(buffer_out, ENDP3_BUF1Addr, count_out);
  }
  FreeUserBuffer(ENDP3, EP_DBUF_OUT); //翻转标志,释放用户缓冲区
}


之后和原来使用单缓存有什么区别呢,每次USB都要等用户处理了缓存数据才继续通信,怎么会速度变快呢 ?



STARM 发表于 2013-6-16 11:41 | 显示全部楼层
  +-----+-------+--------------+ +-----+        +-----+-------+--------------+ +-----+
  | OUT | DATA0 | 64 Byte Data | | ACK | Delay  | OUT | DATA1 | 64 Byte Data | | ??? |
  +-----+-------+--------------+ +-----+        +-----+-------+--------------+ +-----+
                                 |--------------|
                                 |设置好Endpoint |
                                 |              |
只要收到第1个数据包后,Firmware不能在第2个数据包到来之前(不是结束之前)设置好Endpoint,
就要浪费整整一个数据包的传送时间;

如果Firmware能按时设置好Endpoint的状态,哪怕是1us,则可能赢得了一个数据包的传送时间。
设置好Endpoint 这一段时间吗 ?


trumpxp 发表于 2013-6-16 20:25 | 显示全部楼层
USB这一块    有时间需要好好看看   需要加强这一块的专业素养
saluo 发表于 2013-10-23 12:19 | 显示全部楼层
我用官方的虚拟串口例子,跑起来速度只有90多kbps是小b,大家是怎么测出来速度的,我怕我测的不对。
另外程序中串口输出占用了很大的时间,去掉USB_To_USART_Send_Data(USB_Rx_Buffer, USB_Rx_Cnt);可以达到300多kbps
void EP3_OUT_Callback(void)
{
  uint16_t USB_Rx_Cnt;
  
  /* Get the received data buffer and update the counter */
  USB_Rx_Cnt = USB_SIL_Read(EP3_OUT, USB_Rx_Buffer);
  
  /* USB data will be immediately processed, this allow next USB traffic being
  NAKed till the end of the USART Xfer */
  
  USB_To_USART_Send_Data(USB_Rx_Buffer, USB_Rx_Cnt);

  /* Enable the receive of data on EP3 */
  SetEPRxValid(ENDP3);
}
后来改成双缓冲,不加USB_To_USART_Send_Data(USB_Rx_Buffer, USB_Rx_Cnt);这句,可以达到7M多bps,加了后还是90多kbps,问下大家有什么解决方法吗?
outstanding 发表于 2013-10-23 12:36 | 显示全部楼层
huang_4115 发表于 2014-3-4 10:43 | 显示全部楼层
正在学usb,标记一下
yang4469 发表于 2014-3-21 17:58 | 显示全部楼层
saluo 发表于 2013-10-23 12:19
我用官方的虚拟串口例子,跑起来速度只有90多kbps是小b,大家是怎么测出来速度的,我怕我测的不对。
另外程 ...

USB_To_USART_Send_Data(USB_Rx_Buffer, USB_Rx_Cnt);是用串口发送数据好么,串口发送数据能快?
1398117027 发表于 2014-8-30 18:47 | 显示全部楼层
听各位大侠讨论学习了
jemy00 发表于 2014-9-1 09:37 | 显示全部楼层
shilinlin0321 发表于 2014-12-22 16:17 | 显示全部楼层
saluo 发表于 2013-10-23 12:19
我用官方的虚拟串口例子,跑起来速度只有90多kbps是小b,大家是怎么测出来速度的,我怕我测的不对。
另外程 ...

哥们你好,在21ic上看到了有关“stm32 usb双缓冲”的跟帖,想请教一下用com修改双缓冲的问题,方便的话请联系我。QQ:94471266(天涯),谢谢!
zxt520506 发表于 2015-4-2 16:15 | 显示全部楼层
楼主在不,想咨询个问题,我现在做STM32F407ZGT6来实现自定义全速模式下的USB设备,测上行速度(IN)速度是500多KB/S,想提高速度到1MB/S以上,查407的手册介绍感觉不能用双缓冲,不知道楼主有涉及到不,双缓冲方式对407芯片提高速度到底可行不
lanjackg2003 发表于 2015-4-7 10:28 | 显示全部楼层
七颗咖啡豆 发表于 2015-4-7 15:44 | 显示全部楼层
jcdzxh 发表于 2016-3-28 13:17 | 显示全部楼层
学习,争取早些理解双缓冲收发
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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