图4是数据/命令/状态在USB总线上的传输流程图。根据此图Bulk-only传输的状态可以定义为:空闲、CBW处理、数据输出(从Host向DevICe传输数据)、数据输入(从Device向Host传输数据)、CSW处理、管道阻塞等6种状态。在空闲状态下,接收到的数据包为CBW包;在数据输出状态下,接收到的数据包为Host期待写入Device的数据;在数据输入状态下,Host请求从Device读取数据,Device将向Host发送这些数据包;在CSW状态下,Device封装并发送CSW包以向Host返回状态信息。因此,任何Bulk-Only事务均是以Host向Device发送CBW包并试图建立相应的数据传输开始的;而Device接收到CBW包,进行检查并解释,试图满足Host的要求,并通过CSW向主机返回状态信息。以读一个逻辑块为例,填写一个CBW包的程序如下所示:
逻辑分析仪抓包结果如图5所示。从抓包结果可以清晰的看出CBW包由31个字节组成。
CBW包和CSW包正确收发后,Bulk-only传输就能顺利实现。完成对扇区的读写,文件系统的挂载。上层应用程序使用文件系统提供的API,操作底层设备,实现对文件的建立、读写、删除等操作。经测试本系统支持长文件名和超过2 GB容量的USB设备。本设计最终实现了在不同型号U盘上完成对长文件名文件的新建、读写以及删除操作。
5 结语
本设计在以CK510为内核的HM1521_B芯片上,通过文件系统实现了对USB设备的读写操作。程序代码放弃了USB协议中的繁文缛节,抓住协议核心以达到精简高效之目的。在大容量USB存储设备的兼容性方面也进行了探讨。经测试本系统支持长文件名和超过2 GB容量的USB设备。最终实现了在不同型号U盘上完成对长文件名文件的新建、读写以及删除操作。
本系统尚需改进的地方主要是读写过程中的出错应对能力。如何应对USB设备在读写过程中的突然拔插,以及如何提高数据传输出错时的校验能力都是本课题进一步研究的方向。