我们已经知道,传统的串行口、并行口通过握手信号进行通信,这些接口通常通过握手信号来联络主机和外设。我们也已经知道,通信双方可以同步或异步两种方式进行通信,两者最大的区别是,同步通信接口中有时钟信号线。
USB接口应用很广。可是,USB接口中既没有握手信号,也没有时钟信号,它是怎样在主机与外设之间建立联系的呢?又是如何交换数据的呢?为了深入理解USB接口的通信过程,先介绍USB的硬件和软件结构。
从物理结构上,USB系统是一个星形结构。USB系统包含三类硬件设备: USB主机(USB HOST)、 USB设备(USB DEVICE)和USB集线器(USB HUB)。USB总线上的物理连接是一个分层的星形拓扑,处于每个星形拓扑中央的是HUB集线器,在主机与HUB之间,HUB与HUB之间,HUB与设备之间都是点对点的连接。
图5 USB拓扑结构
USB HOST对USB系统进行管理、每毫秒产生一帧数据、发送配置请求对USB设备进行配置、管理和恢复总线上的错误。 USB HUB用于设备扩展连接,所有USB DEVICE都连接在USB HUB的端口上。USB DEVICE接收USB总线上的所有数据包,通过数据包的地址域来判断是不是发给自己的数据包:若地址不符,则简单地丢弃该数据包;若地址相符,则通过响应USB HOST的数据包与USB HOST进行数据传输。
从逻辑结构上看,每个USB逻辑设备都直接与USB HOST进行数据传输。与传统接口以硬件手段实现握手的方法不同,USB接口使用“软握手”方法。
USB 的软握手机制是透过三个层次的驱动程序实现的,在这中间起到关键作用的是设备驱动程序,该程序在主机与设备之间建立起至少一个管道。管道有两种类型:流管道和消息管道。其中有一个最重要的消息管道是“缺省控制管道”,这个管道在设备一加电的时候就存在了,它提供设备的配置和状态等信息。主机与设备之间的联络就是通过消息管道实现的。
图6 USB软件结构
协议栈驱动程序的主要作用是将设备与相应的设备驱动程序连接起来。因为USB支持的设备很多,而每个具体的设备都有自己对应的设备驱动程序。对于某一具体设备来说,使用哪个驱动来管理,就要由协议栈驱动程序通过读取设备描述符进行挑选。选择好驱动程序之后,协议栈驱动程序还要给USB设备分配地址。
管道建立起来之后,数据的传输控制则由USB接口驱动程序负责完成了。在这里,主机占有绝对主导权,设备只能是“听命令行事”。设备发生事件时通过消息管道报告给主机,主机伺机向设备发送命令,开通流管道,发送或接收数据包。主机与设备之间以数据数据包的形式进行传送,显然这与网络上数据传输的方式相同,是一种异步数据传输模式。