引言
绣花机广泛用于纺织行业,基本原理为读取绣花花版文件到主控设备,进行固定算法的花版解释,控制绣花机机头进行绣花动作,目前广泛利用USB接口读取花版文件。USB协议对所有USB设备进行分类,同类型的设备拥有一些共同的行为特征和传输协议,在此基础之上USB协议又划分了子类设备,进一步区分相同类设备的属性,以利于设计主机与设备的数据传输。对于USB大容量存储设备(mass storage device)设计, 普遍采用两种基本传输方式:CBI 和BULKONLY。使用较多的是BULKONLY协议,主要应用在U盘存储设备;而CBI协议由于具有中断传输的特性,主要应用在USB硬盘及工业上普遍使用的USB软盘驱动器,目前,在绣花机的使用过程中也需要磁盘读写花版文件,这样的好处是保密性强、可随时更换,可以作为U盘的很好补充。
1Mass storage CBI协议介绍
在CBI协议[1]的描述中,必须采用4种传输方式和通道进行主机和设备的数据交换,这4种方式称为端口,按顺序为: 0,控制传输;1,块输入(bulkin);2,块输出(bulkout);3,中断传输。这与普通U盘设备采用2个传输端口有明显区别。控制端口0主要用来在主机和设备间传送USB标准命令和对硬盘的控制命令集,批量输入端口1和批量输出端口2用来传输大量块数据,中断端口3用来返回命令的发送状态用于主机产生中断。
1.1数据传输过程
在对设备进行任何操作前,主机都必须发送mass_storage_ufi协议中定义的相关UFI命令块(USB Floppy Interface Command)。从控制端口0传送到设备,命令块被分为无数据、数据进、数据出3种类型。主机将以指定类请求ADSC开始命令传输,接着在控制传输的数据阶段传输命令块。指定类请求命令包如表1所列。
对于CBI设备来说,主机每次发送UFI命令块前都必须由指定类请求ADSC引导[2],否则设备不识别。以下是发送一组UFI命令响应的过程举例:
1SOF(xA5) //帧开始
2SETUP(xB4) ADDR(x7F) ENDP(x0)
//setup请求包,控制端口0发送
3DATA0(xC3) DATA(x 21 00 00:00 00:00 0C:00)
//DATA0第一缓冲区发送,CBI类命令,命令长度0x0C
4ACK(x4B)//状态返回,确认
5SOF(xA5)
6OUT(x87) ADDR(x7F) ENDP(x0)
//数据输出包,控制端口0发送
7DATA1(xD2) DATA(x 2A 00 00:01:23:45 00 00:)
//发送命令,共12字节,一次发送8字节
8ACK(x4B) //正确接收8字节状态返回
9SOF(xA5)
10DATA0(xC3) DATA(x 00 00 00:00)
//发送剩余4字节命令
11ACK(x4B)//正确接收4字节状态返回
12SOF(xA5)
13IN(x96) ADDR(x7F) ENDP(x0) //输入请求
14DATA1(xD2) DATA( )
//空包输入,所有命令发送必须以空包输入结束
15ACK(x4B)
表1指定类请求命令包
在主机命令发送得到接收正确响应ACK(确认接收)后,设备会从端口3自动返回2字节状态码,用于主机产生中断(中断不是必须),数据传输状态如下:
1 SOF(xA5)
2 IN(x96) ADDR(x7F) ENDP(x3)
//中断端口3发送,类型为输入
3 DATA1(xD2) DATA(x FF:FF)
//DATA1第一缓冲区接收,2字节状态包
4 ACK(x4B)
命令发送全过程完毕,当需要数据输入/输出时,设置主机发送IN/OUT PID请求,设备按照请求通过BULKIN/OUT端口传输数据,每次发送的字节数根据设备描述符所定义的端口最大吞吐量。
1.2CBI设备描述符及枚举过程
按照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次枚举所配置的端口,发送相关请求命令,进行初始化的数据输入/输出。具体函数及功能如下:
CBI_Inquiry();//查询获取设备信息
CBI_RequestSense();
//请求判别参数,可据此查看命令执行状态
CBI_ReadFormatCapacity();
//主机请求当前介质容量和能格式化的容量
CBI_ReadCapacity(); //主机请求当前全介质的容量
CBI_TestUnit();//查询设备是否准备好
CBI_Read(0x0,1,BUFFER);
//读磁盘首扇区512字节到指定数组中,验证读数据功能
2USB软驱主机程序设计
2.1开发平台介绍
开发平台主要包括:
① MCUS3C2410A(绣花机主芯片)
② USB芯片SL811HS
③ 开发语言嵌入式C语言
④ 编译环境CodeWarrior for ARM Developer SuiteV1.2
⑤ 仿真器MagicICE
⑥ USB软驱类型SONY MPF82EU1磁盘驱动器
2.2.1USB设备的枚举
USB软驱首先要进行设备枚举[3],主机通过控制端口0向设备发送DeviceRequest命令。DeviceRequest命令主要有Get_Descriptor,Set_Address,Set_Config, Set_Interface等,而Get_Descriptor描述符又可分为Device_Descriptor、Configuration_Descriptor、Interface_ Descriptor、Endpoint_Descriptor,枚举阶段所有的请求都是基于setup ID。根据不同的请求命令,配置相应的协议栈。以下是配置接收描述符的部分参数,以设备描述符为例:
usbstack.usbaddr=0; //指定端点0传输
usbstack.setup.wValue=0x01;//请求设备描述符
usbstack.setup.wIndex=0; //主机输出请求
usbstack.setup.wLength=18; //发送字长
usbstack.buffer=BUFFER[0]; //指定接收数据缓冲区
usbstack.setup.bmRequest=0x80; //该请求为输入型
配置请求参数完成以后,利用USB数据传输函数usbXfer()来传输该请求。usbXfer()必须完全遵循USB1.1协议。该函数具体算法流程如图1所示。
图1数据传输函数usbXfer()算法流程
2.2.2大容量存储设备的枚举
此阶段任务的中心是对主机发送UFI命令的处理[4]。ADSC请求是UFI命令的前导,通过控制端口0以setup数据包发送,接着仍通过端口0以数据包的形式发送UFI命令包。命令包均为12字节,发送前暂存在ufi[]数组中。以CBI_Read(unsigned long lba,unsigned char len,unsigned char *pBuffer)函数为例叙述命令发送过程,其他枚举函数实现基本原理相同。CBI_Read()函数读取扇区数据到指定数组,源程序如下:
ufi[0]=0x28;ufi[1]=0x00;//0x28标示为读指令
ufi[2]=(unsigned char)((lba>>24)&0xff);
ufi[3]=(unsigned char)((lba>>16)&0xff);
ufi[4]=(unsigned char)((lba>>8)&0xff);
ufi[5]=(unsigned char)(lba&0xff);//lba为读起始地址
ufi[6]=0x00;
ufi[7]=(unsigned char)((len>>8)&0xff);
ufi[8]=(unsigned char)(len&0xff);//len为所读扇区数
ufi[9]=0x00;ufi[10]=0x00;ufi[11]=0x00;
usbstack.buffer=ufi;//指定ufi[]为命令发送数组
if(!SendAdsc_UFI()) //发送UFI指令
return FALSE;
while(!epBulkRcv(pBuffer,len*DeviceInfo.BPB_BytesPerSec))//通过块输入端口1接收所指定扇区的数据到指定数组
return FALSE;
return TRUE; //接收完毕返回
该程序段成功返回标志着所发指令执行正常,且最后读写USB软驱首扇区数据正确。
2.3绣花机花版文件读取
实现读写磁盘首扇区数据功能,可以结合上层FAT文件系统读取磁盘中的花版文件。FAT文件系统中所有文件都作为链表存在,在文件系统的文件目录项中标明了文件的一些相关信息,如文件名、扩展名、文件属性、修改时间、起始簇号(簇是文件系统中的最小读写单位,一般为32字节),如表2所列。
表2FAT16目录项32个字节的定义
由于文件是以簇链的形式存在,所以可以根据起始簇号设计程序来读取磁盘中该文件的所有簇数据,进而抓取所需花版文件。
结语
CBI协议和BULKONLY协议[5]是当今USB大容量存储设备使用最多的传输方式。两种方式各有特点,本文只详细讲解了CBI传输应用到USB软驱上的实现方法和原理。这方面内容属于USB协议中很重要的子协议,可应用到USB通信设计中。开发人员可以借鉴CBI传输模式的诸多优点实施高质量高速率的数据传输。