用MC68HC05JB4开发USB外设
扫描二维码
随时随地手机看文章
当今的计算机外部设备,都在追求高速度和高通用性。为了满足用户的需求,以Intel为首的七家公司于1994年推出了USB(Universal Serial Bus,通用串行总线)总线协议,专用于低、中速的计算机外设。目前,USB端口已成为微机主板的标准端口;而在不久的将来,所有的微机外设,包括键盘、鼠标、显示器、打印机、数字相机、扫描仪和游戏柄等等,都将通过USB与主机相连。
作为一个硬件厂商或是开发者,最关心的便是如何去开发USB外设。MOTOROLA公司从1996年开始,陆续推出了一系列支持USB总线协议的单片机,如最早的用于显示器的68HC05BD9A,用于鼠标的68HC05JB2,以及用于集线器(HUB)的MC141555等等。这些芯片共同的特点是都内含一个USB模块,通过这个模块,用户可以很方便地实现USB总线上的数据通讯。68HC05JB4最初是用于开发USB游戏杆的,后来也常被用于其他一些USB外设的开发,比如USB手写板等等。它除了含有USB接口以外,还有6路8位A/D变换输入端,4路键盘中断扫描用输入端,并可最多同时开启19个I/O端口。
我们设计的USB汉字手写板,采用国内汉王公司的传感器获得笔画信息,传给MC68HC05JB4,经过整理后通过USB总线发送到PC,再由我们编写的驱动程序接收,最终转给汉王的文字识别软件识别。
1 USB总线系统硬件连接
USB通过一个四线电缆来传输信号与电源,如图1所示。
其中D+和D-是一对差模的信号线,而VBus和GND则提供了+5V的电源,它可以给一些设备(包括Hub)供电。USB提供了两种数据传输率:一种是12Mb的高速(full speed)模式,另一种是1.5Mb的低速模式,这两种模式可以同时存在于一个USB系统中(注:在新发布的2.0协议版本中,高速模式被定义为120~240M)。USB信号线在高速模式下必须使用带有屏蔽的双绞线,而且最长不能超过5m;而在低速模式时可以使用非屏蔽电缆,甚至是非双绞线,但最长不能超过3m。为了与电缆阻抗匹配,在电缆的每一端都使用了非平衡终端匹配电阻。该电阻也保证了能够检测外设与端口的连接或分离,并且可以区分高速与低速设备。
68HC05JB4只支持低速USB外设。它提供了两个端口分别与电缆的D+、D-相连;同时提供了一个3.3V的参考电压与D-相连。典型连接如图2。图中电阻电容的参数是我们在USB手写板中采用的数值,其中1.5kΩ的电阻要求较高,阻值范围必须是1.5kΩ±5%。由于电缆长度有限,类似电缆负载之类的工作就不再需要开发者去考虑了。
2 USB总线系统软件设计
USB设备的软件功能主要有两点:一是监视设备的状态,自动产生状态信息和用户命令信息;一是完成主机与设备之间的USB总线通讯,自动处理主机的控制和查询命令。
前一功能与设备的具体工作方式有关,与一般非USB设备的实现方法大体一致。唯一的区别是开发者需要预先定义设备所属的类别和使用的协议。原因是,USB协议将设备分为不同的类型,每个设备类型都定义了类似功能设备的共同行为和协议。例如HID(Human Interface Device)人机接口设备主要指用于人控制计算机系统操作的器件,而电源设备(Power Device)则被定位为HID的子系统之一。对设备进行分类是为了消除不同硬件厂商之间的差异,以便于主机(PC)对设备进行方便、统一的管理。相同类型的设备都由一组标准定义的功能模块组成。这样主机与USB设备之间的通信就可以通过一些标准格式的数据包来完成。USB开发者论坛发布了一系列USB设备的类型定义,并配以相应的使用说明。如果开发者需要了解HID及其子类设备,可以查阅参考文献[2][3]。
开发者还应考虑的是主机的工作平台,比如Windows 98/NT、Unix等等,原因是不同的系统对不同的设备的支持程度不同。例如在Windows 98下,系统除了提供通用的USB设备的底层驱动以外,还单独提供了少数HID设备(如鼠标)的完整驱动,也就是说,开发者如果想实现一个USB鼠标,是不需要在Windows 98下开发自己的驱动程序的,而如果想实现一个USB手写板,就必须在通用的底层驱动基础上开发自己的设备驱动程序。所以设备类型的定义也直接影响开发的难度和时间。
后一个功能的实现较为困难。USB总线上传递的信息有两种:一是由数据线的差分信号传递的三种包(令牌包、数据包和应答包);一是经过定义的特殊的数据线信号,如复位信号、唤醒信号和包结束(EOP)信号等。对于低速设备,USB还定义了两种总线操作方式:控制传输(用于主机设置设备和获取状态)和中断传输(用于工作信息的传输)。
MC68HC05JB4中的USB模块提供了3个端点,其中端点0通过控制传输与主机通讯,而端点1和端点2则使用中断传输。用户可以近似地把端点0看作是设备的控制和状态寄存器,而端点1和端点2则是设备的两个数据缓冲区。对应于3个端点,68HC05JB4提供了3个控制寄存器,2个中断寄存器(端点1和端点2共用1个),同时为端点0提供了8个数据发送/接收寄存器,为端点1和端点2提供了8个共用的数据发送寄存器。其他在USB模块中提供的寄存器还包括一个地址寄存器和一个状态寄存器。
软件开发的主要工作是编写USB的中断服务例程,其功能是处理USB发送/接收的不同的通讯信息(如令牌、数据或应答等),再从端点0获得主机的控制信息,或是向端点0发送设备的状态信息,以及向端点1或端点2发送完整的数据报告等。根据设备类型的不同,主机发送的控制信息的种类和数量都会不同。例如,USB手写板属于HID设备,在响应主机命令的时候,除了需要处理普通的USB命令(如Set Address、Set/Get/Clear Feature和Get Status等等)以外,还需要处理HID设备特定的一些命令,如Set/Get Report、Set/Get Idle和Set/Get Protocol等等。关于USB模块的各个寄存器的使用方法,MOTOROLA也提供了一些范例,开发者可以参照学习。
开发者还应注意的是设备的挂起(休眠)和唤醒功能。USB协议规定,当总线处于空闲状态超过3ms时,设备必须进入挂起状态,而挂起的设备从总线上吸收的电流必须小于500μA。68HC05JB4的挂起可以通过设置USB端点0的中断寄存器中的挂起标志位来实现。
但设备的挂起对设备的工作往往有不利的影响。协议规定的500μA包括了主机端的电缆终端匹配电阻的电流(通常为220μA),所以对于使用总线电源的设备而言,进入挂起状态通常便意味着总电流消耗不能超过280mA,这实际上是要求68HC05JB4进入STOP模式。开发者如果需要设备不进入挂起状态,通常有两种方法。一种是通过主机周期性地向设备发送包结束(EOP)信号,间隔时间小于3ms,这样设备将永远处于正常状态;另一种方法是在设备挂起时唤醒它,既可以由主机发送唤醒或复位信号,也可以由设备自行远程唤醒,具体的实现方法是由设备向主机发出远程唤醒信号,在主机认可后设备即结束挂起状态。开发者可以在68HC05JB4的外中断端口上连接RC电路,在设备进入挂起状态时利用电路的充放电时间产生滞后的外中断信号,再在中断发生时向主机发送远程唤醒信号,就可以自动恢复到正常的状态。
图3是根据我们编写的USB手写板的程序精简出来的一个典型的程序流图,开发者可以参考编写不同设备的代码。正如上文所述,最关键、也是最困难的,还是中断处理程序的编写,开发者需要格外重视。
3 USB设备的测试
在设备的软件调试过程中,开发者往往需要观察设备发往主机的数据,包括设备的状态和设置信息,以及正常工作时发送的数据包等等。如果开发者需要捕捉USB总线上的信息,必须使用价格昂贵的专用设备。而如果开发者使用68HC05JB4,就不用再担心总线信号是否正常,只需在主机端观察主机接收的数据即可。USB开发者组织在他们的互联网站点[1]上提供了一个在主机端测试HID设备的软件包——USB Compliance Test Suite,通过运行其中的程序,开发者可以很方便地向设备发送各种USB和HID的协议命令,并接收设备的数据,从而对设备的工作状态作出判断。
开发者同样可以编写自己的主机端驱动程序,对USB设备进行调试和检验。有关主机端驱动程序的编写方法,请参阅近期相关文章“WINDOWS 98 下USB设备驱动程序的开发”。
总之,USB总线及设备是计算机技术高速发展的必然产物,是微机外设的发展趋势。国外市场上的USB产品已经很多了,但大都局限在少数几类设备上。国内在1999年初才陆续出现了USB摄像头等少数几样产品,且都是从台湾引进的。相对于其他计算机设备而言,国外产品在USB设备方面的市场竞争优势并不明显,USB设备应该是国内硬件产品发展的重要方向之一。