打印

求助!!!!!STM32F103 USB Masstorge 读写速度超慢!只有20KB/s

[复制链接]
7277|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近一直用ST自带的USB Masstorge例程进行FLASH的读写操作,发现速度特别慢,程序跟例程几乎一模一样,我只是增加了FLASH读写的部分,但是测试下来速度超级慢,FLASH读数据的速度只有25KB/s左右。
  反反复复看参考文献,也没有想出什么好的解决办法。有没有做过这方面的朋友,给提供一些解决的办法或者思路,stm32f103片子的USB速度主要受制于哪些因素?小女子在这里拜谢大家!!!!!
沙发
penguin_cc|  楼主 | 2012-5-24 15:47 | 只看该作者
各位大侠帮忙想想吧,为什么没有人理我咧!!!求助啊!!!

使用特权

评论回复
板凳
penguin_cc|  楼主 | 2012-5-29 17:10 | 只看该作者
再请教一下,STM32 的usb有没有"管道",也就是“PIPE”的概念啊?在哪里定义呢?

使用特权

评论回复
地板
vigia| | 2012-5-29 17:12 | 只看该作者
刚看到,读FLASH只有25KB/S吗?明天我来测测看。

使用特权

评论回复
5
IJK| | 2012-5-29 17:53 | 只看该作者
可以略过对FLASH读写的部分,单单看USB+mass storage部分的速度如何。

使用特权

评论回复
6
penguin_cc|  楼主 | 2012-5-30 11:01 | 只看该作者
谢谢啊,对啊,读FLASH速度只有25KB,我把读FALSH的操作都去了,速度没有太大变化,我上位机的读取函数用的是DeviceIOControl()。
这两天又发现一个问题,再请教一下,就是在发送数据的时候,为什么SetTxCount()的数据长度只能是64字节呢?不是说可以设置成较大的数,USB自己会进行分组的吗?例如,如果SetTxCount()的数据长度设置成128,那就可以分成两个包发送,是么?但是现在好像不行,不管是大于或者小于64,都会直接默认为数据已发送完成,而且只有64字节。
然后就是老问题了,Masstorage例程里,设置的是BULK传输,为什么每发送64字节都要进入 传输完成中断 呢?
真的非常感谢大家!!!希望多多指教!

使用特权

评论回复
7
vigia| | 2012-5-30 17:03 | 只看该作者
我来了,刚测了下STM32F103芯片的MASS STORAGE例程存储媒介为SD卡的测试结果


存储媒介为NAND FLASH的测试结果

使用特权

评论回复
8
vigia| | 2012-5-30 17:04 | 只看该作者
本帖最后由 vigia 于 2012-5-30 17:06 编辑

两个存储媒介基本没区别,写在200KB/S左右,读在600KB/S左右
这个速度不是怎么很令人满意,不过也好过LZ的测试结果。


另外,由于例程使用的是SimpleBuffer,我相信启动了doublebuffer功能以后,速度应该能取得不少的提升。

使用特权

评论回复
9
vigia| | 2012-5-30 17:12 | 只看该作者
另外回答LZ的提问

全速传输中,一个数据包的最大数据长度只能是64字节。SetTxCount()函数设置的就是一次数据包的长度。所以不能超过64字节。所谓的自动拆包,不是由硬件完成的,需要软件在上层代码里实现的。比如要传输512字节,需要由软件自己将512字节拆分成8个数据包,分别进行传输。

这样也就回答了LZ的另一个提问。为什么每64字节,会产生一个传输完成中断。因为软件需要该中断,告知可以启动下一个数据包的传输。

使用特权

评论回复
10
香水城| | 2012-5-30 23:46 | 只看该作者
呵呵,LZ碰到超级专家了,有图有真相,还有理论! :lol

使用特权

评论回复
11
penguin_cc|  楼主 | 2012-5-31 11:10 | 只看该作者
不好意思,刚才看到您的回帖。我把我的程序给您贴一下,您帮忙看看,可以吗?非常感谢!!!
void Read_Memory_flash(void)
{
static u32 Package_Read_Count_32u =0, Data_Buffer_Offset_32u =0;

   if (!Package_Read_Count_32u)
  {
    PageRead_Nor(Data_Buffer, NorPageAddr_u32G, CSW.dDataResidue);
    UserToPMABufferCopy(Data_Buffer, ENDP1_TXADDR, BULK_MAX_PACKET_SIZE1);
    Package_Read_Count_32u = CSW.dDataResidue - BULK_MAX_PACKET_SIZE1;
    Data_Buffer_Offset_32u = BULK_MAX_PACKET_SIZE1;
  }
  else
  {
    UserToPMABufferCopy(Data_Buffer + Data_Buffer_Offset_32u, ENDP1_TXADDR, BULK_MAX_PACKET_SIZE1);
    Package_Read_Count_32u -= BULK_MAX_PACKET_SIZE1;
    Data_Buffer_Offset_32u += BULK_MAX_PACKET_SIZE1;
  }

  SetEPTxCount(ENDP1, BULK_MAX_PACKET_SIZE1);
  SetEPTxStatus(ENDP1, EP_TX_VALID);


  Memory_Offset += BULK_MAX_PACKET_SIZE1;
  Transfer_Length -= BULK_MAX_PACKET_SIZE1;

  CSW.dDataResidue -= BULK_MAX_PACKET_SIZE1;
  Led_RW_ON();

  if (Package_Read_Count_32u == 0)
  {
    Data_Buffer_Offset_32u = 0;
    Bot_State = BOT_DATA_IN_LAST;
    Led_RW_OFF();

  }
}
每调用一次这个函数,发送64字节,发送完以后进入“正确传输中断”,在中断里调用这个函数,继续发送。上位机使用的函数是DeviceIOControl()函数,每发送一次命令需要传输的字节数与Data_Buffer的大小一致。但是这样速度非常慢,希望您帮忙看一下,问题出在什么地方,真是非常感谢!!!

使用特权

评论回复
12
penguin_cc|  楼主 | 2012-5-31 11:10 | 只看该作者
BULK_MAX_PACKET_SIZE = BULK_MAX_PACKET_SIZE1 = 64

使用特权

评论回复
13
penguin_cc|  楼主 | 2012-5-31 11:11 | 只看该作者
真是太感谢了!!!!!!!:handshake

使用特权

评论回复
14
vigia| | 2012-5-31 16:02 | 只看该作者
单从代码看,没什么问题。

你的速度是怎么测试的?我建议你上位机和下位机软件分开测试,比如上位机软件可以对一个真正的U盘进行测试,下位机也可以用我用的那个工具进行测试。这样可以将你的瓶颈定位。

另外,建议你开启DOUBLE BUFFER功能, UserToPMABufferCopy函数的执行也是需要时间的,如果开启了双缓存,就可以在USB传输时,拷贝下一组数据。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
penguin_cc + 1 精品文章
15
penguin_cc|  楼主 | 2012-5-31 20:17 | 只看该作者
谢谢啊,我试着改过双缓冲,但是改完以后就不能正常通信了。其实我这个也不是真正意义上的U盘,不能像其它U盘那样拷东西,只能用我自己写的那个软件去读FLASH里面的东西(也就是调用DeviceIOControl函数)。我想请教一下您,哪里能找到双缓冲的资料呢?我从网上找到一些,改完后反而不能正常通信,不好意思,总是麻烦您!

使用特权

评论回复
16
vigia| | 2012-6-1 15:50 | 只看该作者
本帖最后由 vigia 于 2012-6-1 15:51 编辑

我记得以前有个贴子讨论了双缓冲的,找了下,果然:lol

https://bbs.21ic.com/viewthread.php?tid=109584

使用特权

评论回复
17
penguin_cc|  楼主 | 2012-6-1 16:07 | 只看该作者
嘻嘻,谢谢啊,这个帖子我看过,照着改完后,不能通信了,我再继续研究研究,嘿嘿,真是太麻烦您了!!!有问题再向您请教,也请您多关注关注俺的信息,嘿嘿!拜谢!!!

使用特权

评论回复
18
vigia| | 2012-6-1 16:36 | 只看该作者
呵呵,说不定你现在就是黎明前的黑暗了。

使用特权

评论回复
19
penguin_cc|  楼主 | 2012-6-1 18:44 | 只看该作者
嘿嘿,好,我继续努力!:handshake

使用特权

评论回复
20
jacky0505| | 2013-8-14 16:54 | 只看该作者
penguin_cc 发表于 2012-6-1 18:44
嘿嘿,好,我继续努力!

你好,请问你这个速度问题解决了吗? 还有你是怎么用上位机读取的? 谢谢了

使用特权

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

本版积分规则

0

主题

17

帖子

0

粉丝