基于单片机的USB接口的设计
The Design Of USB Interface Based On The Single Chip
刘井权 王宪 戴旻 来源:自动化仪表杂志
(江南大学通信与控制工程学院 江苏无锡 214122)
摘要提出了一种基于单片机的智能仪表扩展USB接口的方法。介绍了USB接口芯片SL811HS[1]的结构和性能以及USB接口的硬件电路图,详细分析了USB接口的驱动程序的设计方法及FAT16[2]文件系统的结构。利用SCSI[3]传输命令集,通过BULK-IN和BULK-OUT[3]端点实现了主机与U盘设备之间的数据通讯。实验和应用结果表明,该方案具有控制方便、传输速度快、存储数据稳定可靠等优点。
关键词 USB 端点 枚举 配置 文件系统
Abstract A method of intelligent instrument expandation USB interface based on singlechip is stated. The structure and capability of the USB interface chip SL811HS, hardware circuit diagram of the USB interface is introduced, and the design method of the USB interface drivers,structure of the FAT16 file systems is analysed detailedly。The communication between the host computer and U disk device is completed via BULK-IN and BULK-OUT endpoint using SCSI command class. The results of experiment and application show that the scheme features convenient control、fast transmitting data and reliably storaging data.
Key words USB Endpoint Enumerate File system
中图分类号:TP368 文献标识码:B
引言
USB (Universal Serial Bus)是近年来发展起来的一种快速、灵活的总线接口。它最大的特点是易于使用,可热插拔,接口连接灵活,并且能够提供外设电源[4],在嵌入式系统及智能仪表中获得广泛的应用。而51系列单片机以其优越的性能、成熟的技术、高性价比被广泛应用于测控仪器和自动化领域。因此用51系列单片机实现USB主机接口,进而实现对USB外设的控制,对提高整个系统的数据存储、数据传输、设备控制等性能都有很大的作用。本文论述的方案基于压强测试仪的应用环境,在开发压强测试仪的过程中根据实际的需求,要求能够存储大量数据,以往的解决方案是RS232C接口,但由于传输速度慢,在高速采样系统容易导致数据丢失,而且必须有上位机的参与,这对于室外作业很不方便。USB接口克服了上述缺点,测试仪器可以把采集到的数据保存到U盘,工作人员可以随时取下U盘,将数据拿到异地进行分析,另外笔者还开发了读写U盘的文件系统,存储的数据可以直接在PC机上打开,不需要编写其它的分析软件。本设计的另一优点是成本低廉,可应用于各种智能仪器及嵌入式设备中,实现对海量数据的存储。
1 硬件设计
1.1 SL811HS概述
SL811HS是Cypress公司推出的具有主/从两种工作模式的USB控制器[4],遵循USB1.1规范;可自动检测总线速率,支持全速12Mbps和低速1.5Mbps设备;具有8位双向的数据总线,易与单片机连接;片内256字节的SRAM(其中16字节用于工作寄存器),用于数据传输;可自动产生SOF
和CRC5/16,简化软件工作量;片内具有根Hub;支持挂起/唤醒工作模式,减少功耗;支持地址自动加1功能,在连续读写过程中,只需设置一次地址,其内部寄存器地址自动增加,这在大容量数据的通讯中是非常必要的。
1.2单片机与SL811HS接口设计
图一所示是AT89C51与SL811HS的硬件连接电路。在本设计中,由于所选用的单片机AT89C51及其外围元件的工作电压为5V,而SL811HS的工作电压为3.3V,所以系统应提供5V电压同时要进行电压转换。虽然SL811HS可以使用12MHz晶振,但在实际使用过程中,如果晶振质量不太好,电路稳定性就会比较差,因此,设计时推荐使用48MHz有源晶振。SL811HS的中断请求输出的是高电平,因此需要用反向器把它变换成低电平以满足AT89C51中断输入要求。此外,应注意SL811HS是低电平复位。为了便于调试,系统扩展了液晶显示器。硬件完成后要进行测试,先向SL811HS寄存器中写入数据,之后读出数据并在液晶显示器上显示,如果和写入的数据相同,说明SL811HS与单片机连接正确。再用示波器观察有源晶振是否起振,一切正常后便进入软件调试。
2 软件设计
㈠. USB枚举过程:
USB总线一般包含四种基本数据传输类型:控制传输、中断传输、批传输以及同步传输,本系统使用的是控制传输和批量传输2。最基本的函数就是对SL811HS寄存器的读写,代码4如下:
xdata BYTE SL811H_ADDR _at_ 0x9800;
xdata BYTE SL811H_DATA _at_ 0x9801;
读单个寄存器:
BYTE SL811Read(BYTE a)
{SL811H_ADDR=a;
return (SL811H_DATA);
}
写单个寄存器:
void SL811Write(BYTE a, BYTE d)
{ SL811H_ADDR=a;
SL811H_DATA= d;
}
连续读SL811HS寄存器:
void SL811BufRead(BYTE addr, BYTE *s, BYTE c)
{
BYTE idata i;
i=c;
SL811H_ADDR = addr;
while (i--)
*s++ =SL811H_DATA;
}
连续写SL811HS寄存器:
void SL811BufWrite(BYTE addr, BYTE *s, BYTE c)
{
BYTE idata i;
i=c;
SL811H_ADDR= addr;
while (i--)
SL811H_DATA = *s++;
}
读写寄存器正常以后,便进入SL811HS底层函数6的编写,具体的函数可参照CYPRESS公司提供的代码修改。调试之后便进入枚举过程。枚举是对USB接口正确配置的过程,包括获取设备描述符、配置描述符、接口描述符、端点描述符,以及对接口、端点的正确配置。
请求设备描述符的setup数据包为 80h 06 00 01 00 00 12 00 ,通过读取设备描述符,可获得设备的子类。请求配置描述符的setup数据包为 80h 06 00 01 00 00 09 00 ,对于请求配置描述符,可以先进行首次请求,要求数据包长为9。接收到设备返回的数据,获得此描述符的总长,然后再发二次请求,获得全部描述符数据。第二次发送的setup数据包内容为 80h 06 00 01 00 00 2Eh 00
此时返回的数据包括了设备配置、接口、端点的全部描述信息2。
在对U盘读写之前需正确配置SL811HS芯片,这部分工作通过枚举来完成。枚举过程代码6如下:
uDev.wPayLoad[0] = 64; // 地址0、端点0的有效负荷为64字节
if(usbaddr =2) // 设定USB的地址为2
USBReset(); // 芯片SL811HS复位
pDev =(pDevDesc)bBUF;
if (!GetDesc(uAddr,DEVICE,0,18,bBUF)) // 通过地址0获取描述符
return FALSE;
uDev.wPayLoad[0]=pDev->bMaxPacketSize0;
if (!SetAddress(usbaddr)) //设定USB地址值,此处为2
return FALSE;
uAddr = usbaddr; //传输采用新地址
if (!GetDesc(uAddr,DEVICE,0,(pDev->bLength),bBUF)) //用新地址获取设备描述符
return FALSE;
pCfg = (pCfgDesc)bBUF;
if (!GetDesc(uAddr,CONFIGURATION,0,8,bBUF)) //获取配置描述符
return FALSE;
if (!GetDesc(uAddr,CONFIGURATION,0,WordSwap(pCfg->wLength),bBUF))//第二次请求配置描述符
return FALSE;
pCfg = (pCfgDesc)bBUF;
pIfc = (pIntfDesc)(bBUF + 9); // 分离出接口信息
uDev.bClass = pIfc->iClass;
uDev.bNumOfEPs = (pIfc->bEndPoints<=MAX_EP) ? pIfc->bEndPoints : MAX_EP;
if (!SetConfiguration(uAddr,DEVICE)) //设定USB的配置信息
return FALSE;
㈡. U盘的读写及FAT16文件系统5:
U盘属于大容量存储设备,当U盘枚举成功后,主机与USB设备通过BULK-ONLY传
输方式传输数据,所有的通讯数据都通过BULK-IN和BULK-OUT端点传输。在这种传输方式下,有三种类型的数据在USB和设备之间传送,CBW、CSW 和普通数据5CBW(Command Block Wrapper,即命令块包)是从USB Host 发送到设备的命令,命令格式遵从接口中bInterfaceSubClass 所指定的命令块,这里为SCSI 传输命令集。USB设备需要将SCSI 命令从CBW 中提取出来,执行相应的命令,完成以后,向Host 发出反映当前命令执行状态的CSW(Command Status Wrapper),Host 根据CSW 来决定是否继续发送下一个CBW 或是数据。Host 要求USB 设备执行的命令可能为发送数据,则此时需要将特定数据传送出去,完毕后发出CSW,以使Host 进行下一步的操作。。
U盘一般支持FAT16文件系统,它可以分成4个部分,即保留区,FAT区,根目录区,数据区。保留区的第一个扇区也叫引导扇区,它含有对文件系统识别的关键信息。根目录区存放目录项,每个目录项为32 个字节,记录一个文件或目录的信息。FAT区即文件分配表,操作系统分配磁盘空间按簇来分配的。同一个文件的数据并不一定完整地存放在磁盘的一个连续的区域内,而往往会分成若干段,像一条链子一样存放。这种存储方式称为文件的链式存储。为了实现文件的链式存储,硬盘上必须准确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后继内容的下一个簇的簇号,对一个文件的最后一簇,则要指明本簇无后继簇。这些都是由FAT 表来保存的,FAT 表的对应表项中记录着它所代表的簇的有关信息:诸如是否空,是否是坏簇,是否已经是某个文件的尾簇等。目录项的所占的最后一个扇区之后,便是真正存放文件数据的位置了。只有清楚的了解FAT16的结构才能对文件正确读写,图4给出写文件的流程图,读文件相对比较简单,在此不再赘述。
3 结束语
本系统已经成功实现了对U盘的读写,经过多次试验测试,读写数据稳定可靠,可兼容市场上绝大多数U盘。作者在单片机系统中可以建立、删除、修改文件,可以把数据存储成多种文件格式,特别指出的是,在单片机系统内建立的BIN文件和HEX文件可以在PC机上利用UltraEdit-32软件直接打开,这为数据的分析提供了很大的方便,而不必花费精力去编写分析软件。
参考文献
1 Cypress semiconductor corporation. SL811HS date sheet[z].2002.
2 许永和. 8051单片机USB接口程序设计.北京:北京航空航天大学出版社.2004.
3 史波,田凯.通用串行总线USB技术概述[J].信息技术.2001(4).
4 马忠梅,籍顺心,张凯,等.单片机的C语言应用程序设计.北京:北京航空航天大学出版社.2003.
5 Microsoft corporation. FAT File System Specification[z].1999.
6 徐爱均,彭秀华.单片机高级语言C51应用程序设计.北京:电子工业出版社.1995.
7 Compaq,Inter,Microsoft,NEC. Universal Serial Bus Specification(Revision1.1).1998.