This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

用430的全速USB接口做一个U盘怎么提高传输速度?



用MSP430F5系列的单片机自带的USB接口,我用的 8M系统时钟和 8M的SPI时钟,因为暂时只想实现U盘功能,所以没有FAT文件系统,存储用的SD卡(SPI方式),结果做出来读写速度太令人崩溃了... 读取110KByte/s,写入 83KByte/s,全速USB的理论速度应该是1.5MByte/s 吧,这差的也太多了吧,怎么优化才能让读写速度上1MByte/s 啊?  官方给的那个USB库,SPI时钟用的12.5M,系统时钟25M,这个我没试,读写SD卡速度能上1MByte/s吗?

  • Heng Zhao,

    全速USB的理论速度是12Mb/s, 但是净速率一般为:500kb/s到10Mb/s。你试着提高系统时钟和SPI时钟频率试试吧。测测看最高能到多少吧?

  • 这个问题要分两部分来分析了.

    1. USB传输速率

       全速USB的传输速率标准为12MBPS, 这个是指USB的物理层数据速率,落实到具体的帧数据,大概有10-15%的帧格式消耗,一般按照5-10M来计算USB的实际数据速率。

        这部分消耗的时间和系统主频没有关系。

    2. 实现U盘消耗的时间.也和你处理的方式也有关系。

        这部分操作中MCU要完成USB的命令解析,数据搬移,以及SD卡的读写访问。这部分的时间取决于两个方面,一个就是MCU的主频,另一个就是你的操作流程是否合理.

    例如如果处理写U盘操作,你如果没接收到一帧USB数据就去写SD卡,这样的效率就非常低,因为USB的一帧数据只有64个字节,而你传送的文件一般都不只这么长。你可以设计一个稍微大点的BUFFER来接收USB的数据,当BUFFER要满了,或者数据接收完成后在往SD卡中写.同理,你也可以把读SD的操作分解下,看如何最大达到节约处理时间的效果。

    一般的SD卡的SPI都可以达到10M以上的速率,所以不用太担心1M的SPI速率。

    个人认为流程的优化才是解决访问速度的根本,因为主频都相对固定的。流程的优化原则是,尽量让CPU事先流水操作,而不是顺序操作。另外如果能合理地利用DMA,能大大减少数据搬移的操作,节约大量的时间。

     

     

     

     

     

  • 谢谢。我帖子里说的传输速率是指 每秒字节,不是每秒位,之前没说清楚,呵呵。

  • 非常感谢,其实你说的这些都是令我很头疼的地方,比如开辟一个buffer存储usb端点数据,单片机本身的内存就不大只有8k,能空出2k就算很不错了,如果我开辟出2K的buffer,当我buffer满了的时候,需要用连续读写块命令操作SD卡,但是读取或写入SD卡期间,cpu无法处理usb端点的数据到buffer的搬移,只能等待,感觉提高不了效率,再一个我最关系的是你说的DMA,其实我很想用这个来处理buffer的数据和SD卡数据的搬移,但是感觉SD卡的命令操作方式很难用DMA来实现数据的读写,真不知道该怎么办....

    最后我想问一下,实际应用当中,基于全速USB的U盘读写速度能上1MByte/s 吗?

  • 1. 如果你能空2K出来,就可以用做2个1K的BUFFER,乒乓使用.这样不会存在操作SD卡时时,不能倒USB的数据的问题.

    2. DMA主要用在成块的数据搬移,SPI操作SD卡时,包含命令操作和数据操作,不建议在命令操作时使用DMA,但在数据操作时可以使用DMA功能。一块的数据读写操作,数据访问占到了主要的时间,命令和控制命令的比例要越小越好,否者无效的操作就太多了.

    3. 实际应用中全速的U盘的读写速度取决于2个方面,一个是FLASH的读写速度,一个是数据搬移的速度。

       排除FLASH ERASE的时间,FLASH的实际读写速度可以达到10M以上的速度。数据搬移的速度取决于主频和U盘的BUFFER及上位机的BUFFER。