USB总线信号分析系统的设计与实现
2010-11-25卢宇清
卢宇清,张 巍
LU Yu-qing1,2, ZHANG Wei2
(1.河南师范大学 物理与信息工程学院,新乡 453007;2.河南农业职业学院,郑州 451450)
1 研究背景和意义
Universal Serial Bus(USB)是连接外部设备和主机的一种标准接口。随着微软在操作系统中内置了对USB接口的支持模块,加上USB设备的日渐增多,USB接口逐步走进了实用阶段。
USB是一种灵活的接口技术,可替代计算机中串行口或并行口,支持许多新型的接口。USB的超强性能意味着要比它所替代的老式串行接口和并行接口都复杂。实现USB接口是一个极大的挑战。不管是USB主机一侧的开发,还是USB设备一侧的开发,从技术角度来讲,都有相当的难度。
2 USB总线信号分析系统的组成及功能分析
USB总线信号分析系统其整体功能的实现是一个软硬件协同工作的过程。USB总线信号分析系统由六部分组成:用户USB总线信号采集电路、CPLD硬件与Verilog程序、FIFO存储器、MCU硬件与固件程序、设备驱动程序和信号分析软件。前四部分装配在一块线路板上,构成系统的硬件;后两部分安装在分析主机上,为系统的高层软件。为使系统正常工作,必须把各种设备正确连接起来,还要安装设备驱动程序和信号分析软件。
2.1 用户USB总线信号获取
USB电缆两端各有一个连接器,中间不允许分叉。连接到用户USB总线上需要使用两个USB连接器,通过板上的布线直接相连。一个通过一条电缆连接到用户USB主机,另一个连接器通过另外一条电缆连接到用户设备。在线路板上放置一个USB收发器,与两个USB连接器相连。在信号传输的时候,就能同时接收USB总线上的信号。
2.2 CPLD编码
CPLD是一种用户根据需要而自行构造逻辑功能的数字集成电路。CPLD是整个系统中非常关键的一个部件,它直接决定系统实现的成功与失败。因此,必须认真分析需求,周密设计代码,合理仿真功能,力求最大限度地有效利用CPLD的功能。
2.2.1 CPLD功能
在USB总线信号分析系统中,为了准确地接收USB的数据流,CPLD中设置了去噪声模块,既使接收的数据中混入了噪声,接收器也能正常工作。要正确获得数据,首先要正确恢复时钟。低速USB的发送时钟为1.5MHz,全速USB的发送时钟为12MHz,CPLD也必须生成相应的接收时钟信号,为此,CPLD中设置了一个相位跟踪电路(DPLL)。
2.2.2 相位跟踪电路
DPLL(Digit Phase Lock Loop)是一种使输出信号相位与输入信号相位保持一致的电路,也就是相位跟踪电路。在UPA11中,DPLL根据用户USB总线的速率产生1.5MHz或12MHz数据接收时钟,该电路监视输入信号的变化,一旦发现信号出现了边沿,立即调整接收时钟的相位,确保与发送时钟同步,同时保证了读取数据的准确性。
2.2.3 有限状态机(FSM)
FSM(Finite State Machine)称为有限状态机,是CPLD/FPGA中最常用的部件之一。通常,用FSM实现各种各样的状态转换图。FSM有四个状态,即初始状态、SE0状态、空闲状态和接收状态,用来表示用户USB总线的活动。这四个状态覆盖了所有用户USB总线状态和用户USB总线事件,低速和全速也都支持。
用户USB总线有四种基本状态:SE0状态、空闲状态、J状态和K状态。空闲状态与J状态的差别仅在于驱动器是否驱动,它们对应的DP、DM和RCV都是相同的。为此,把空闲状态与EOP中的J状态合二为一,统称为空闲状态。
用户USB总线传输数据包时,涉及到的状态只有两个,即J状态和K状态。把这两个状态合并为接收状态,为“正在接收用户USB总线上的数据包”之意。接收状态也包括远程唤醒信号,只不过接收到的将是以FE打头,后跟若干个FF的数据包。
用户USB总线的事件有设备插入、设备拔出、设备复位、设备挂起、设备恢复等,对应FSM的一种或几种状态。
综上所述,用户USB总线状态和事件都可以归纳到FSM状态机的一种或几种状态。
根据USB 1.1规范,USB总线的速率是由D+或D-的上拉电阻决定的。识别速率的最准确的位置应该是从SE0状态转换到空闲状态的时刻。如果空闲状态时DP=1,则用户USB总线是全速。否则,如果DM=1,则用户USB总线是低速。
2.2.4 MCU数据包装配
CPLD输入信号是DP,DM和RCV,输出的则是MCU数据包。MCU数据包是对USB数据包的再次封装,其一般格式为:
STX USB数据包 ETX
STX是MCU数据包的开始,其值为0F;ETX是MCU数据包的结束,其值为04。为了避免USB数据包中的STX、ETX被误认为MCU数据包的开始结束,特别增加了“字节插入”。 “字节插入”符为Byte_Stuff,其值为05 。当USB数据包中出现了STX,ETX或Byte_Stuff时,在其前面都要插入一个Byte_Stuff。例如:
USB数据包为:80 C3 03 04 05 06
对应的MCU数据包为:0F 80 C3 03 05 04 05 05 06 04
2.2.5 数据输出
数据输出包括输出队列的管理、输出总线和写入信号管理两部分。输出队列的管理包括取数据和指针移动。
在USB数据包结束处,如果最后一个数据正好是STX、ETX或Byte_Stuff之一,则输出顺序应该是Byte_Stuff、数据、ETX。这三个字节在同一时钟周期出现,但输出一个字节要用两个时钟周期,并且输出时一次只能输出一个字节。这时,把同时出现的数据按照既定的Byte_Stuff、数据、ETX的顺序把标志位存放在输出队列中等待输出。
2.3 MCU固件
MCU(Micro Controller Unit),简称单片机,是指随着大规模集成电路的出现及其发展,将计算机的CPU、RAM、ROM、定时器和多种I/O接口集成在一片芯片上,形成芯片级的计算机。
MCU主要功能有:MCU初始化;中断服务程序;USB标准请求服务程序;读取FIFO数据;向分析主机转发数据。MCU的主要作用是把CPLD生成的数据转发给分析主机。
MCU固件分中断服务程序和主程序,这两部分程序交叉执行,中断可能在主程序的任何地方发生并开始执行中断服务程序。中断服务程序基本上是线性执行的,主程序除了初始化部分以外则是无穷循环执行。
2.4 分析软件的实现
USB总线信号分析系统必须配合适当的分析软件才能发挥作用。分析软件安装在计算机上,由应用程序、动态连接库、设备驱动程序三部分组成,它们相互协调,完成数据控制、传输、分析等工作。
2.4.1 驱动程序
马戴的思乡情结与隐逸情怀也是联系在一起的,他在诗中每次提到回到家乡就是要去过隐居生活,如其《客行》云:
所有USB设备必须有匹配的设备驱动程序才能正常工作,UPA11的设备驱动程序来自Microchip公司的通用USB驱动程序,当前最新版本是Microchip MCHPFSUSB v2.1,可从该公司网站免费下载。
2.4.2 应用程序对UPA11硬件的访问
应用程序对硬件的访问包括开始捕捉、停止捕捉和读取数据。
控制捕捉是通过向OUT1管道发送一个控制位来实现的,如果向OUT1端点发送的第一个字节的最高位为1,就会打开硬件捕捉功能;否则关闭捕捉。捕捉的数据是通过IN1端点传输到应用软件的。一旦开始捕捉,应用软件必须始终读取UPA11的数据,否则可能丢失数据。
2.4.3 快速读取UPA11的数据
一旦启动捕捉,在短时间内,CPLD可能输出大量数据。为了防止数据丢失,唯一的办法就是使用缓存。当FIFO缓存中存有数据以后,MCU必须尽快取出,并存储到IN1端口的数据区,一旦MCU收到主机发来的IN数据包,可以立即发送出去。为了减少时间延迟,MCU内部设置了14个IN1端口的数据区,作为数据缓冲。
对于从FIFO取来的数据,MCU只是简单地放入某一个IN1数据区,当一个数据区放满,则转到下一数据区,除非所有数据区都存满了数据。
2.4.4 USB数据包分离、检测、过滤
从硬件得到的是连续的数据流,首先必须从这些数据流中分离出一个一个的USB数据包,然后才能对它们进行分析和显示。CPLD在发送USB数据包时采用了编码,在应用程序中,必须对这种编码后的数据进行解码,还原出原来的USB数据包。
当一个USB数据包被分离出来后,首先必须进行错误检测,找出其中可能存在的各种错误,包括同步错、PID错、CRC5错、CRC16错等。分析出错误的类型以后,用户可以查找错误的原因。
过滤是UPA11的重要功能,通过使用过滤器,可以仅显示那些感兴趣的数据包,而那些SOF、NAK之类的数据包可以被屏蔽。
2.4.5 USB数据包分析
USB包(Packet)是最小的传输单位,其中的数据不容易被人们理解,但显示这些数据却是必需的。如果把一个USB事务的所有包集中为独立的一项,并根据令牌包恰当命名,便很容易让人们在更高的层次上理解其作用。一个USB传输或USB请求可能有1~n个USB事务组成。如果能在USB传输或USB请求的级别上进行归纳分析,并以树状层次显示出来,将有很大的价值。
为实现这些功能,必须跟踪USB主机和USB设备的所有数据包,确定每一个数据包所处的位置,并根据上下文总结出符合逻辑的功能描述。当收到一个USB数据包以后,应用程序需要做以下处理:根据状态机的当前状态和输入的包,决定下一状态;根据当前状态和下一状态,在显示树的不同层次上建立相应的显示节点;如果条件满足,为更高的层归纳出一个概括性的功能。为此,应用软件内部设置了一个USB数据包状态机,该状态机始终描述USB主机与设备之间数据传输的状态,它支持USB的四种传输类型。
3 结束语
本文在USB1.1规范的基础上,根据国内外USB接口的发展现状,做了一些研究,也得到了一些有意义的结果,完成了USB总线信号分析系统的设计与实现。但是USB总线信号分析研究仍处于初级阶段,后期可以进行硬件、固件的升级和应用软件的扩展。
[1] 蔡军生.USB协议深入分析.[J/OL].
[2] 中国IT实验室.USB设备的调试与测试技巧.[J/OL].
[3] Microchip Technology Inc.PIC18F2550 Data Sheet(Chinese).[J/OL].