引言
通用串行总线USB(Universal Serial Dus)是近年来应用在PC领域的新型接口技术;是一些大PC厂商,如Microsoft、Intel等,为了解决日益增加的PC外设与有限的主插槽和端口之前的矛盾,而制定的一种串行通信的标准。USB以其高速、易于安装配置、使用灵活和可靠性高日益受到人们的欢迎。现在已广泛使用于计算机和周边设备的连接,如键盘、鼠标、打印机、存储设备等。
USB控制器一般有两种类型:一种是MCU集成在芯片里面;另一种是纯粹的USB接口芯片,仅处理USB通信。前者由于开发时需要单独的开发系统,因此开发成本较高;后者只是一个芯片与MCU接口,实现USB通信功能,因此成本较低、可靠性较高。本文主要介绍Philips公司的ISP1581器件的使用方法,它属于后者。
图1
1 硬件设计
1.1 ISP1581芯片特点
ISP1581 是一个高速USB器件控制器。它实现了USB2.0/1.1物理层和数据协议层的任务,并且实现了连同端点EP0(设置用于访问设置缓冲器)在内的16个 USB端点的共同协作;用于基于微控制器的系统,与微控制器/微处理器的通信是通过一个高速的通用并行接口实现的,接口速度可达12.5M字节/s或 12.5M字/s;支持DMA传输,可很好地实现与大容量存储设备的接口;通过ATA/ATAPI接口,可以直接与ATA/ATAPI设备相连。 ISP1581能适应大多数设备类规范的设计,非常适合做很多外围设备,如打印机、扫描仪、外部大容量存储器和数码相机等的外部接口。(注: ATA/ATAPI,Advanced Technology Attachment/Advanced Technology Attachment Peripheral Interface.中文名称为高级技术附国装置/高级技术附加装置外围接口。ATA是一种硬盘接口标准,ATA标准的接口类型其实就是IDE接口类型。)

ISP1581内集成了多个模块,各自完成不同功能,如图1所示。
①USB2.0收发器。模拟收发器通过集成的终端电阻直接与USB电费相连。
②Philips 串行接口引擎(SIE,Serial Interface Engine)。完成所有USB协议层的功能,主要完成以下的功能:同步方式的识别、并行/串行的转换,位填充/解除填充、CRC校验/产生、包标识(PID)校验/产生、地址识别和握手评估/产生。考虑到速度,它是全硬件的,不需要软硬件介入。
③存储器管理单元(MMU)和集成RAM。MMU和集成RAM实现了USB总线和微控制器管理器或DMA管理器之间的速度转换。
④微控制器/处理器接口和微控制器/处理器的管理器。可以直接与大部分的微控制器相连。
⑤DMA接口和DMA管理器。DMA管理器接收到DMA命令后,可直接把数据从内部RAM传送到外部DMA设备或从外部DMA设备传送给内部RAM。

2 硬件连接
ISP1581有一个快速通用接口,利
用它可以实现与大部分类型的微控制器/处理器的通信。上电时,由引脚BUS_CONF、MODE1和MODE0共同设置。由于MMC2107的外部地址、数据总线是分开的,因此在本开发平台上ISP1581只能工作在通用处理器工作模式下。
ISP1581提供微控制器接口与微控制器进行数据传输,也支持DMA传输。在微控制器速度较高时,两者的读写访问速度均可达12.5Mb/s,采用DMA方式会增加电路设计的复杂度。经过综合比较,采用微控制器接口方式。USB模块硬件连接原理如图2所示。
注: ①ISP1581提供两种复位方式:a.ISP1581集成有上电复位电路(POR),RESET引脚接电源,实现上电复位功能。b.RESET引脚接 MMC2107的一个数字I/O引脚,将该引脚置低800μs后置高,实现复位。②ISP1581的供电电压为3.3V或5.0V,I/O引脚最大能承受 5.0V的电压。根据I/O口的电压,从3.3V和5.0V中选择一个作为供电电压。
3 ISP1581固件(FIREWARE)程序设计
由于所有的通信都是由主机发起,设备只能能来自主机的命令。在这种结构下,ISP1581的固件采取中断驱动。这样一方面保证了快速的数据传输和较好的软件结构,另一方面简化了编程和测试。
固件程序由5部分组成,如图3所示。
(1)主循环流程
上电后,初始化MMC2107和ISP1581。然后,主循环程序轮询检查事件标志,进入相应的子程序进行进一步的处理。图4是主循环的流程。
(2)中断服务程序(ISR)流程
图5所示的中断服务流程,用来处理由ISP1581产生的中断。通过访问ISP1581的中断寄存器,建立正确的事件标志,以通知主循环程序进行处理。
(3)USB标准请求处理
进行应用通信以前,主机必须枚举设备。该过程是通过给端点0发送包含标准设备请求(CHAP_9)的控制传输实现的。USB标准请求流程(见图6)译码设备请求类型,转到相应的处理子流程。枚举过程如下:
①主机使用默认地址(地址0)读取设备描述符GetDeviceDescriptor;
②SetAddress;
③连续3次GetDeviceDescriptor,读取全部设备描述符;
④GetConfigDescriptor;
⑤GetStringDescriptor(可能没有);
⑥读取全部ConfigDescriptor后,主机将找到新设备,提示安装驱动程序。
⑦在设备能通信前,主机给出SetConfiguration请求,设备收到后调整有关信息,使设备能被客户软件利用。
(4)厂商请求处理(VENDOR)
厂商请求和USB标准请求一样,都根据控制传输的内容进行相应处理。本开发平台的固件程序中定义了两个厂商请求,分别为取得固件版本和将批量数据写入设备或从设备中读出数据。
取得固件版本流程如图7所示。主机发送批量数据读写请求时,在控制传输的数据阶段,主机给出需要传输的数据字节数、数据传输方向、页索引和数据定位。控制传输结束后,主机和设备就可以根据双方约定,启动批量传输。批量传输流程如图8所示。
图6

4 调试
4.1 调试步骤
USB的调试可分为以下几个步骤:
①若USB芯片正常工作,可实现软连接,将设备插入主机后,主机上出现“未知设备类型”的USB设备;
②提供描述符,提供正确的VID和PID后,主机能够识别设备,但要求提供设备的驱动程序;
③安装驱动程序后,调试各端点,使其均可传输数据,用主机端的测试程序对其进行测试,验证硬件及因条件限制的正确性。
4.2 调试工具
因为每一次USB的传输过程,都有时效要求,等待时间过长,通信过程也就中止了,因此不适合用硬件仿真器来设断点调试。可采用串口辅助调试过程,即在固件代码中加入类似于Printf的语句,向串口输出一些信息。借此,可以知道程序是否运行到此外,以及运行到此处时相应的变量或寄存器值。
设备完成配置后,在Bus Hound中可以看到该设备(bus Hound是一种应用软件)。选择该设备,就可以对主机与此设备间的通信数据进行分析和监视。Bus Hound工作在主机端,串口工作在微控制器端。将串口调试和Bus Hound两种手段配合使用,可以使USB通讯过程的调试更加容易。
