用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吗?
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.
用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吗?
这个问题要分两部分来分析了.
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。