MCS51等没有BIOS的单片机,需要开发者控制CPU的每一步运行,程序必须在某一段反复循环,程序结构见图2。SL11R由于有BIOS支持,它的程序结构就与MCS51有所区别。SL11R的主体循环是在BIOS内部,实际上用户程序一般只是BIOS的中断响应子程序。也就是说,开发者所编的SL11R的用户程序可以没有主循环体。SL11R的用户程序结构见图3。值得指出的是,开发者也可以摆脱BIOS的控制,程序不在BIOS内部循环。但该程序设计难度较大,因为这时开发者需要自己直接处理USB接口的底层软件,一般没有特殊要求不要使用这种方式。
3.2.2 SL11R的USB接口编程
SL11R的大部分功能都可以通过BIOS调用实现。USB的编程也是调用BIOS实现。SL11R复位后会自动配置USB接口,与主机建立USB通讯,一般情况下开发者可以不进行干预。
开发者主要使用的与USB有关的BIOS软件中断:
·USB_STAND_INT、USB_CLASS_INT、USB_VENDOR_
INT、USB_FINISH_INT 这些中断主要是为了实现USB通讯,其中USB_VENDOR_INT是接受主机控制指令中断,主机对SL11R的控制基本上都是通过它实现的。
·USB_SEND_INT、USB_RECEIVE_INT这两个中断用于USB发送、接收数据。可以通过配置,分别使用USB的四个端口。
3.3 主机软件设计
要开发SL11R主机软件,一种简单、快捷的方式是借助于SL11R开发工具包(SL11R DVK)。通过学习工具包中附带的例子程序可以在较短的时间内开发出一个应用软件,用户不需自己开发驱动程序。该工具包可以从ScanLogic公司的网站(www.scanlogic.com)下载得到。工具包中包括的内容有:通用驱动程序、例子程序和开发用的文档资料。对于一般的开发工作可以直接使用工具包中的驱动。用于Windows98系统的三个文件分别是: slusbgen.sys、usb2epp.sys和usbdev.inf。
在AppWizard (zip)源代码包中,可以找到用VC写成的主机例子程序(usbtest.exe)的源代码。其中有几个文件对利用ScanLogic公司提供的驱动程序来开发应用程序很有帮助。在头文件slusb.h中含有如下函数原型:
BOOL FAR PASCAL CloseUsbDev(VOID); //关闭USB口
BOOL FAR PASCAL FindUsbDev(WORD wProd); //打开USB口
BOOL UsbVendorCmdRead(BYTE bCmd,WORD wValue,
WORD wIndex, WORD wLen, PVOID pData); //发送读控制指令
BOOL UsbVendorCmdWrite(BYTE bCmd, WORD wValue,
WORD wIndex, WORD wLen, PVOID pData); //发送写控制指令
BOOL UsbDataRead(DWORD n, PVOID pData); //读数据块
BOOL UsbDataWrite(DWORD n, PVOID pData); //写数据块
只要在应用程序中灵活用好以上几个函数,做一些简单的数据采集工作是完全可行的,笔者就是借用这几个函数在实际工作中成功完成了应用系统的开发。
文件devioctl.h包含有slusb.h中需要的常数和宏的定义。在文件usbtest.cpp中定义了控制SL11R操作的指令代码。
SL11R是一种功能强大的USB接口单片机,它的16位总线及DMA传输模式允许进行大容量数据的高速传输,可以进行高速数据采集。而且SL11R的编程简单,无需专用开发装置,开发成本低,初次接触USB的开发人员可以很容易实现应用系统的开发。