第八章嵌入式USB接口设备开发实例8.3USB手写板的设计用MC68HC05JB4Motorola单片机开发USB手写板8.2.1硬件设计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,我们编写的驱动程序接收,最终转给文字识别软件识别。68HC05JB4只支持低速USB外设。它提供了两个端口分别与电缆的D+、D-相连;同时提供了一个3.3V的参考电压与D-相连。典型连接如图。图中电阻电容的参数是我们在USB手写板中采用的数值,其中1.5kΩ的电阻要求较高,阻值范围必须是1.5kΩ±5%。由于电缆长度有限,类似电缆负载之类的工作就不再需要开发者去考虑了。8.2.2系统软件设计USB设备的软件功能主要有两点:一是监视设备的状态,自动产生状态信息和用户命令信息;一是完成主机与设备之间的USB总线通讯,自动处理主机的控制和查询命令。前一功能与设备的具体工作方式有关,与一般非USB设备的实现方法大体一致。唯一的区别是开发者需要预先定义设备所属的类别和使用的协议。开发者还应考虑的是主机的工作平台,比如Windows98/NT、Unix等等,原因是不同的系统对不同的设备的支持程度不同。例如在Windows98下,系统除了提供通用的USB设备的底层驱动以外,还单独提供了少数HID设备(如鼠标)的完整驱动,也就是说,开发者如果想实现一个USB鼠标,是不需要在Windows98下开发自己的驱动程序的,而如果想实现一个USB手写板,就必须在通用的底层驱动基础上开发自己的设备驱动程序。后一个功能的实现较为困难。USB总线上传递的信息有两种:一是由数据线的差分信号传递的三种包(令牌包、数据包和应答包);一是经过定义的特殊的数据线信号,如复位信号、唤醒信号和包结束(EOP)信号等。对于低速设备,USB还定义了两种总线操作方式:控制传输(用于主机设置设备和获取状态)和中断传输(用于工作信息的传输)。MC68HC05JB4中的USB模块提供了3个端点,其中端点0通过控制传输与主机通讯,而端点1和端点2则使用中断传输。对应于3个端点,68HC05JB4提供了3个控制寄存器,2个中断寄存器(端点1和端点2共用1个),同时为端点0提供了8个数据发送/接收寄存器,为端点1和端点2提供了8个共用的数据发送寄存器。其他在USB模块中提供的寄存器还包括一个地址寄存器和一个状态寄存器。软件开发的主要工作是编写USB的中断服务例程,其功能是处理USB发送/接收的不同的通讯信息(如令牌、数据或应答等),再从端点0获得主机的控制信息,或是向端点0发送设备的状态信息,以及向端点1或端点2发送完整的数据报告等。根据设备类型的不同,主机发送的控制信息的种类和数量都会不同。下图是USB手写板的一个典型的程序流图7.2.3设备的测试在设备的软件调试过程中,开发者往往需要观察设备发往主机的数据,包括设备的状态和设置信息,以及正常工作时发送的数据包等等。如果开发者需要捕捉USB总线上的信息,必须使用价格昂贵的专用设备。而如果开发者使用68HC05JB4,就不用再担心总线信号是否正常,只需在主机端观察主机接收的数据即可。USB开发者组织在他们的网点上提供了一个在主机端测试HID(人机接口设备)设备的软件包USBComplianceTestSuite,通过运行其中的程序,开发者可以很方便地向设备发送各种USB和HID的协议命令,并接收设备的数据,从而对设备的工作状态作出判断。开发者同样可以编写自己的主机端驱动程序,对USB设备进行调试和检验。