引言
构建USB接口的虚拟数据采集仪器常有如下方案:
①采用NI公司的USB数据采集模块。该方案的特点是方便使用,但成本相对高。②采用非NI公司的USB数据采集模块。通过调用厂商提供的二次开发包里面的动态链接库,驱动数据采集。该方案比方案①成本低,但应用相对复杂。③采用数据采集器件+单片机+USB接口器件。
参考文献通过涮用动态链接库模块来实现驱动设计。参考文献通过NI-VISA方案来实现驱动设计,比参考文献采用的方法方便易用。综合比较,方案③从成本和开发速度上都具有很高的性价比。
本文旨在方案③的基础上,搭建一个通用的模板。开发者只要在该模板的基础上就可以快速开发性价比高的基于USB接口的数据采集系统。本文采用了NI-VISA和CH372 USB芯片的方案,并以一个温度信号的虚拟数据采集仪器的实例加以说明。
1 CH372及其外围电路
CH372是南京沁恒生产的一款USB总线芯片,它提供8位数据线及读、写、片选、中断线各一条,内置USB通信底层协议,具有方便、简单的内置固件模式和灵活的外置固件模式。内置固件模式下,芯片自动处理端点0的所有事务,本地单片机只需要负责处理数据交换即可,程序简洁、简单;外置固件模式下,由本地单片机负责处理各种USB请求,可以灵活地实现符合USB规范的设备。
图1是CH372的外围电路。D0~D7为芯片的数据I/O口,与STC89C52RC单片机的P0~P7相连;INT与单片机的P3.2相连;CS与单片机的P3.3相连;RD与单片机的P3.4相连;WR与单片机的P3.5相连;A0与单片机的P3.7相连。单片机采用的是11.059 2 MHz晶振。温度传感器采用DS18B20,它的数据线接单片机的P2.2口。
2 单片机软件设计
CH372芯片专门用于处理USB通信,在接收到数据或者发送完数据后,CH372以中断方式通知单片机进行处理。
单片机通过CH372芯片接收数据的处理步骤如下:
①当CH372接收到USB主机发来的数据后,首先锁定当前USB缓冲区,防止被后续数据覆盖,然后将INT引脚设置为低电平,向单片机请求中断;
②单片机进入中断服务程序,首先执行GET_STATUS命令获取中断状态;
③CH372在GET_STATus命令完成后将INT引脚恢复为高电平,取消中断请求;
④由于通过上述GET_STATUS命令获取的中断状态是“下传成功”,所以单片机执行RD_USB_DATA命令从CH372读取接收到的数据;
⑤CH372在RD_USB_DATA命令完成后释放当前缓冲区,从而可以继续USB通信;
⑥单片机退出中断服务程序。
单片机通过CH372芯片发送数据的处理步骤如下:
①单片机执行WR_USB_DATA命令向CH372写入要发送的数据;
②CH372被动地等待USB主机在需要时取走数据;
③当USB主机取走数据后,CH372首先锁定当前USB缓冲区,防止重复发送数据,然后将INT引脚设置为低电平,向单片机请求中断;
④单片机进入中断服务程序,首先执行GET_STATUS命令获取中断状态;
⑤CH372在GET_STATUS命令完成后将INT引脚恢复为高电平,取消中断请求;
⑥由于通过上述GET_STATUS命令获取的中断状态是“上传成功”,所以单片机执行WR_USB_DATA命令向CH372写入另一组要发送的数据,如果没有后续数据需要发送,那么单片机不必执行WR_USB_DATA命令;
⑦单片机执行UNLOCK_USB命令;
⑧CH372在UNLOCK_USB命令完成后释放当前缓冲区,从而可以继续USB通信;
⑨单片机退出中断服务程序;
⑩如果单片机已经写入了另一组要发送的数据,那么转到步骤②,否则结束。
在内置固件模式的USB设备方式下,单片机只需要处理6种中断状态。为了进一步简化USB通信,在本文的模板中只让CH372处理如表1所列的两种中断状态。
根据表1所列的两种中断状态相关的读写操作指令如表2所列。
本文对CH372的底层驱动进行了高度的封装,只提供一个接口给应用层,接口函数如表3所列。
从通用的角度考虑,本文对应用层的功能模块划分如下:
①USB设备初始化模块。实现设置USB设备的厂商VID和产品PID,工作模式为内置固件模式,具体代码如下:
④中断服务模块。两种中断状态分别是端点2的OUT事务和端点2的IN事务。IN事务中断表示上位机已经完成数据的接收,下一步让单片机做什么就是中断服务的内容。OUT事务中断表示USB设备端已经完成数据的接收,下一步让单片机端做什么就是中断服务的内容。中断服务模块的伪代码如下:
本文给出的实例是当单片机接收到上位机发送过来的“开始温度采集”信号后,开始不断启动温度的采集和往上位机发送温度数据,直到收到上位机发送过来的“停止温度采集”信号。本实例单片机端的主程序伪代码如下:
在“中断服务模块”代码中的端点2的OUT事务部分,读取上位机发送过来的数据,从该数据中获取信息,刷新“开始温度采集”的标志,然后退出中断。在单片机主程序里面可以根据对该标志的判断来决定开始采集温度还是暂停采集温度。
3 上位机软件设计
上位机的USB设备的驱动编写采用的是NI-VISA图形化的方法进行设置,详细步骤见参考文献。驱动编写后,接下来就是采用LabVIEW 2012编写上位机程序,上位机的运行界面如图2所示。
其关键程序代码如下:
①打开USB资源。该部分代码如图3所示。其中关键函数是图3中所示的“VISA打开”函数。
②点击运行界面上的“开始采集温度”按钮。实现上位机往CH372设备发送一个字符“1”。CH372设备接收后,触发单片机中断服务读取该字符。读取该字符后,刷新“开始采集温度”的标志。在单片机的主程序中,根据该标志启动温度采集和往上位机发送温度数据。因此,上位机程序中必须含有往CH372设备写发送数据的操作和读来自CH372设备数据的操作,该部分代码如图4所示。其中的关键函数是图4所示的“VISA写入”函数和“VISA读取”函数。
结语
该模板采用CH372芯片的内置同件模式,屏蔽了USB通信的底层细节,大大降低了USB通信的复杂度。同时对CH372的操作细节进行了封装,提供相应接口给应用层,开发者的设计只局限在应用层,大大降低了开发时间和难度。采用NI-VISA的图形化配置的方法快速开发了USB设备的驱动,采用LabVIEW里面提供的函数方便实现USB设备打开和读写操作。因此,该模板能实现USB接口的虚拟数据采集仪的快速设计。