引 言
绣花机广泛用于纺织行业,基本原理为读取绣花花版文件到主控设备,进行固定算法的花版解释,控制绣花机机头进行绣花动作,目前广泛利用USB接口读取花版文件。USB协议对所有USB设备进行分类,同类型的设备拥有一些共同的行为特征和传输协议,在此基础之上USB协议又划分了子类设备,进一步区分相同类设备的属性,以利于设计主机与设备的数据传输。对于USB大容量存储设备(mass storage device)设计,普遍采用两种基本传输方式:CBI和BULKONLY。使用较多的是BULKONLY协议,主要应用在U盘存储设备;而CBI协议由于具有中断传输的特性,主要应用在USB硬盘及工业上普遍使用的USB软盘驱动器,目前,在绣花机的使用过程中也需要磁盘读写花版文件,这样的好处是保密性强、可随时更换,可以作为U盘的很好补充。
1 M8SS storage CBI协议介绍
(资料图)
在CBI协议的描述中,必须采用4种传输方式和通道进行主机和设备的数据交换,这4种方式称为端口,按顺序为:O,控制传输;1,块输入(bulkin);2,块输出(bulk-out);3,中断传输。这与普通U盘设备采用2个传输端口有明显区别。控制端口0主要用来在主机和设备间传送USB标准命令和对硬盘的控制命令集,批量输入端口1和批量输出端口2用来传输大量块数据,中断端口3用来返回命令的发送状态用于主机产生中断。
1.1 数据传输过程
在对设备进行任何操作前,主机都必须发送mass_storage_ufi协议中定义的相关UFI命令块(USB FloppyInterface Command)。从控制端口0传送到设备,命令块被分为无数据、数据进、数据出3种类型。主机将以指定类请求ADSC开始命令传输,接着在控制传输的数据阶段传输命令块。指定类请求命令包如表1所列。
对于CBI设备来说,主机每次发送UFI命令块前都必须由指定类请求ADSC引导,否则设备不识别。以下是发送一组UFI命令响应的过程举例:
在主机命令发送得到接收正确响应ACK(确认接收)后,设备会从端口3自动返回2字节状态码,用于主机产生中断(中断不是必须),数据传输状态如下:
命令发送全过程完毕,当需要数据输入/输出时,设置主机发送IN/OUT PID请求,设备按照请求通过BULK-IN/OUT端口传输数据,每次发送的字节数根据设备描述符所定义的端口最大吞吐量。
1.2 CBI设备描述符及枚举过程
按照USB协议,所有USB设备接入主机后,主机进行设备枚举,识别此设备属于USB范畴的哪一类,以及该类型中的哪一子类;然后对此设备进行配置,直到该设备能进行正确读写。这些枚举信息都已固化在USB设备中,主机只进行提取操作。
CBI协议存储设备支持很多描述符,主要且必须支持下列USB描述符:
①设备描述符(device descriptor)
②配置描述符(configuration descriptor)
③接口描述符(interface descriptor) CBI存储设备至少应支持1个数据接口。
④端点描述符(endpoint descriptor) 除用作初始化和命令传输的控制端口Endpoint 0外,CBI存储设备还必须支持批量输入、批量输出、中断3种端点,配置、接口、端口描述符是在主机一次请求时接收的。
当某设备描述符被识别为mass storage device类CBI设备子类后,主机进行第2次枚举,对设备进行相关配置和初始化。具体枚举过程通过第1次枚举所配置的端口,发送相关请求命令,进行初始化的数据输入/输出。具体函数及功能如下:
2 USB 软驱主机程序设计
2.1 开发平台介绍
开发平台主要包括:
①MCU S3C24IOA(绣花机主芯片)
②USB芯片 SL811HS
③开发语言 嵌入式C语言
④编译环境 CodeWarrior for ARM Developer SuiteVl.2
⑤仿真器 Magic-ICE
⑥USB软驱类型 SONY MPF82E-U1磁盘驱动器
2.2.1 USB设备的枚举
USB软驱首先要进行设备枚举,主机通过控制端口0向设备发送DeviceRequest命令。DeviceRequest命令主要有Get_Descriptor,Set_Address,Set_Config,Set_Interface等,而Get_Descriptor描述符又可分为Device_Descriptor、Configuration_Descriptor、Interface_Descrip-tor、Endpoint_Descriptor,枚举阶段所有的请求都是基于setup ID。根据不同的请求命令,配置相应的协议栈。以下是配置接收描述符的部分参数,以设备描述符为例:
配置请求参数完成以后,利用USB数据传输函数usbXfer()来传输该请求。usbXfer()必须完全遵循USBl.1协议。该函数具体算法流程如图1所示。
2.2.2 大容量存储设备的枚举
此阶段任务的中心是对主机发送UFI命令的处理。ADSC请求是UFI命令的前导,通过控制端口0以setup数据包发送,接着仍通过端口0以数据包的形式发送UFI命令包。命令包均为12字节,发送前暂存在ufi[]数组中。以CBI_Read(unsigned long lba,unsigned charlen,unsigned char* pBuffer)函数为例叙述命令发送过程,其他枚举函数实现基本原理相同。CBI_Read()函数读取扇区数据到指定数组,源程序如下:
该程序段成功返回标志着所发指令执行正常,且最后读写USB软驱首扇区数据正确。
2.3 绣花机花版文件读取
实现读写磁盘首扇区数据功能,可以结合上层FAT文件系统读取磁盘中的花版文件。FAT文件系统中所有文件都作为链表存在,在文件系统的文件目录项中标明了文件的一些相关信息,如文件名、扩展名、文件属性、修改时间、起始簇号(簇是文件系统中的最小读写单位,一般为32字节),如表2所列。
由于文件是以簇链的形式存在,所以可以根据起始簇号设计程序来读取磁盘中该文件的所有簇数据,进而抓取所需花版文件。
结 语
CBI协议和BULKONLY协议是当今USB大容量存储设备使用最多的传输方式。两种方式各有特点,本文只详细讲解了CBI传输应用到USB软驱上的实现方法和原理。这方面内容属于USB协议中很重要的子协议,可应用到USB通信设计中。开发人员可以借鉴CBI传输模式的诸多优点实施高质量高速率的数据传输。