C8051F320 固件分为两个部分:前台主程序和后台中断服务程序(ISR)。在USB 固件程序中,最重要的工作就是USB 描述符的定义和USB 传输中断的处理。 USB 描述符是USB 协议定义的一套描述设备功能和属性的固定结构的描述语言。USB2.0 中的描述符包括设备描述符、配置描述符、接口描述符、端点描述符等8 种标准描述符和其它一些非标准描述符。USB 主机通过USB 描述符完成设备类型的识别和配置,客 户端驱动程序通过这些信息来正确访问设备并与其通信。本文在对C8051F320 的配置中除了端点0 外还用到了端点1 和端点2。
USB 传输中断的处理也是一个重要的部分。传输中断的处理由ISR 和前台主程序共同完成。这两部分的数据交换通过事件标志和数据缓冲区来实现[6]。当C8051F320 的USB 引擎从主机收到一个数据包时,就会产生一个中断请求,C8051F320 立即响应中断,通过读取 USB 功能控制器的三个中断寄存器CMINT、IN1INT 和OUT1INT 来判断中断来源(USB 复位中断、端点0 中断、端点1 输入中断、端点2 输出中断),然后根据不同的中断来源跳 入相应的处理模块以进行不同的中断处理,并在处理完毕后返回。其中,端点0 是每个USB 设备都必须支持的默认控制传输端点,主要用于主机对USB 设备的配置、状态信息的获取和设备错误的纠正等,它的中断处理模块由控制输出和控制输入两部分组成。每次传输首先由设置事务开始,然后根据设置事务数据不同的中断来源跳入相应的处理模块以进行不同的 中断处理,并在处理完毕后返回。同时在ISR 中,固件将数据包从C8051F320 的USB 引擎内部缓冲区移到一个定义的数据缓冲区,并在随后请求清零其内部缓冲区,以使其能够继续接收新的数据包。然后返回到主循环,检查自定义缓冲区内是否有新的数据并开始其它的 任务。由于这种结构,主循环只用检查自定义缓冲区内需要处理的新数据,专注于新数据的 处理,而ISR 也能够以最大速度进行数据的传输。这样,程序对USB 的操作更加简单,也便于程序的维护。主程序和端点0 的控制传输程序流程分别如图3、图4 所示。端点1 和端点2 的程序流程与之类似。
4 数据的接收和显示
在主机中安装基于 C8051F320 USB 设备的驱动程序(可以在新华龙网站上下载)之后,该设备就会被默认成该主机的一个串口,因此在主机的处理中可以将它当作一个虚拟的串口进行处理,读取其数据就如读串口数据一样方便,很快就能够建立快速通信平台。主机软件采用 VC++开发的,串行通信部分采用API 函数直接进行编写。它为应用程序提供了通过串行接口收发数据的方法。主机软件使用API 文件函数进行串口通信的控制。具体函数以及使用,可以查阅MSDN。将基于 C8051F320 的USB 接口电路应用到仓库视频监控系统中,其系统结构框图如图5 所示。