关键词:现场总线; USB; CAN总线
引 言:
随着信息技术的飞速发展,各种数据的实时采集和处理在现代工业控制中已成为必不可少的部分。这要求我们设计的接口简单灵活且具有较高的数据传输率。现场总线是连接智能现场设备和自动化系统的数字式、双向传输、多分支结构的通信网络。如何将其与PC机安全可靠低成本的互连,是一个亟待解决的问题。传统的外设与主机的通信接口难以满足上述要求。这些接口一般采用PCI总线或RS-232串行总线。PCI总线虽然有很高的传输率(可达132Mbps),但是它们的扩充槽相当有限,且设计复杂。RS-232串行总线连接方便,可是它的带宽非常有限,传输速度慢。USB技术正是顺应这一要求提出的一种快速的,双向的,同步传输的,廉价的并可以进行热插拔的通用串行总线。它还提供了内置电源,可向低压设备提供5伏的电源。正是由于USB的这些特点,使其获得了广泛的应用。CAN总线是现场总线的一种有效支持分布式控制或实时控制的串行通信网络,具有卓越的特性和极高的可靠性,特别适合工业过程监控设备的互连,被公认为几种最有前途的现场设备总线之一。
整个系统设计目的就是设计一个适配器,可以将CAN总线数据通过USB接口迅速转送到PC机进行处理分析,也可以通过它向CAN节点传送数据或命令,以实现计算机与现场设备的通讯。
一、硬件电路的设计
该系统主要由AT89C52控制电路、USB 接口电路、CAN总线电路、挂起复位电路、光电隔离电路等组成,本设计系统主要部件结构图如下:
图1 硬件电路结构图
1.1 AT89C52控制电路
AT89C52 是一个低电压,高性能CMOS 8位单片机,片内置8k bytes的可反复擦写的Flash存储单元和256 bytes的随机存取数据存储器(RAM),功能强大。89C52是该接口电路的控制核心,其中P0,P2口用做16位数据I/O口,P1,P3口用做控制。
1.2 CAN总线
在本系统中,CAN控制器采用Philips公司生产的SJA1000,它作为一个发送、接受缓冲器,实现主控制器和总线之间的数据传输;CAN收发器采用TJA1050芯片,它是CAN控制器和物理总线的接口,主要可以提供对总线的差动发送能力和对CAN控制器的差动接受能力。 在CAN总线结构中,总线的两端还要配置两个120Ω的电阻,其作用是总线匹配阻抗,可以增加总线传输的稳定性和抗干扰能力,减少数据传输中的出错率。为了增强CAN总线节点的抗干扰能力,SJA1000的TXO和RX0可通过高速光耦6N137与TJA1050相连,这样就很好的实现了总线上各节点的电气隔离。光耦部分电源与CAN_V必须用小功率电源隔离模块进行隔离,这样就提高了节点的稳定性和安全性。
1.3 USB接口
本设计中的PDIUSBD12是一个性能优化的USB器件,通常用于基于微控制器的系统并与微控制器通过高速通用并行接口进行通信。
PDIUSBD12与MCU的接口有2种方式:多路地址/数据总线方式、单地址/数据总线方式。在这个系统中,我们采用的是前一种方式:使用了AT89C52的INT0、ALE、WR、RD和P0口,A0 脚接地,当PDIUSBD12接收到主机的有效信息时,会产生一个中断通知89C52进行处理。若单片机的输出地址为奇数,则表示对PDIUSBD12发送指令;若输出地址为偶数,则表示对PDIUSBD12进行数据传输。AT89C52将数据经PDIUSBD12的并行接口送入FIFO存储器。对一个单片机而言,PDIUSBD12看起来就像1个带8位数据总线和1个地址位的存储器件。控制CLKOUT 时钟输出为SJA1000提供时钟输入。由于在USB的信号传递过程中会掺杂进瞬间的高压噪声,这些噪声对USB口的收发电路将产生致命的危害,因此需要对这些噪声电压进行抑制。在USB接口电路中使用了SN75240,它可以对USB接口中的不正常电压进行有效的抑制,以保证硬件设备的安全。
二、微控制器的固件编程
2.1 CAN总线的软件设计
CAN总线的三层结构模型为:物理层、数据链路层和应用层。其中物理层和数据链路层的功能由SJA1000完成,系统的开发主要在应用层软件的设计上,它主要由三个子程序:初始化子程序、发送数据和接收数据程序。同时,还包括一些数据溢出中断以及帧出错的处理。
SJA1000在上电硬件复位之后,必须对其进行软件初始化之后才可以进行数据通讯,初始化过程主要包括对其复位模式下配置时钟分频寄存器CDR、总线定时寄存器BTR0和BTR1、验收代码寄存器ACR、验收屏蔽寄存器AMR及输出控制寄存器OCR等,实现对总线的速率、验收屏蔽码、输出引脚驱动方式、总线模式及时钟分频进行定义。下面为SJA1000发送和接收数据的流程,基本过程为主控制器将数据保存到SJA1000发送缓冲器,然后对命令寄存器的发送请求TR标志位进行置位开始发送;接收过程为SJA1000将从总线上接收到的数据存入接收缓冲器,通过其中断标志位通知主控制器来处理接收到的信息,接收完毕之后清空缓冲器,等待下次接收[3]。
图 2 CAN的发送数据流程
图 3 CAN接收数据的流程
2.2 USB总线的软件设计
PDIUSBD12 是一款带有并行总线和局部DMA传输能力的高速USB 接口器件,它支持USB1.1协议的所有传输方式,在本设计中用到了控制传输,中断传输和批量传输。控制传输处理主机到USB设备的控制信息,固定使用端点0。中断传输用来传送数据量很小,但需要及时处理,以达到实时效果的数据,使用端点1。批量传输用来实现CAN节点与主机之间大数据快传送,使用主端点(端点2),一次最大可发送64字节。PDIUSBD12 的固件设计成完全的中断驱动,当MCU 处理前台任务时USB 的传输可在后台进行。这就确保了最佳的传输速率和更好的软件结构,同时简化了编程和调试。后台ISR 中断服务程序和前台主程序循环之间的数据交换通过事件标志和数据缓冲区来实现,当PDIUSBD12 从USB 收到一个数据包那么就对MCU 产生一个中断请求,MCU立即响应中断,在ISR中固件将数据包从PDIUSBD12 内部缓冲区移到数据缓冲区,并在随后清零PDIUSBD12 的内部缓冲区,以使能接收新的数据包。MCU 可以继续它当前的前台任务,返回到主循环检查循环缓冲区内是否有新的数据[1]。
图4 PDIUSBD12固件编程结构图
这部分程序结构可包括[4]:
1) 请求处理程序
对USB的标准设备请求进行处理和对用户添加的厂商请求进行处理;USB设备接入主机后要进入复杂的设备列举过程,并安装正确的驱动程序。
2)硬件提取层
对单片机的I/O口、数据总线等硬件接口进行操作,该层包含最底层的函数,这些函数在不同的MCU 平台上需要进行改变,
void outportb(unsigned char port,unsigned char val);
void inportb(unsigned char port);
对PDIUSBD12 所有的I/O 访问都可由它们实现;
3)PDIUSBD12 命令接口
对PDIUSBD12器件进行操作的模块子程序集,以简化器件的编程;
4)中断服务程序
当PDIUSBD12向单片机发出中断请求时,读取PDIUSBD12的中断传输来的数据,并设定事件标志和Setup包数据缓冲区,传输给主循环。
5)主循环
发送USB请求,处理USB总线事件和用户功能处理等。MCU 一旦上电就需要初始化其所有端口存储区,中断服务程序。在主循环程序中MCU 对事件进行轮询,如有CAN总线发来的数据,则送往PDIUSBD12进行发送,如有USB总线数据,则启动CAN发送程序,它们在接口的接收工作分别由各自的中断程序完成。要注意的是,我们在用了PDIUSBD12的端口最大一次可发送64字节,SJA1000一次最多能发8字节, 如果端口1传输的长度大于8 字节,MCU 在传输阶段就必须根据数据大小,分数次完成CAN数据的发送工作。
三、USB驱动程序的编写
在WINDOWS平台下,与USB外设的任何通信必须通过USB设备驱动,这个驱动知道如何与系统的USB驱动接口和访问设备的应用程序通信。设备驱动是保证应用程序访问硬件设备的软件组件,使得应用程序不必知道物理连接、信号和与一个设备通信需要的协议等的细节,可以保证应用程序代码只通过外设名字访问外设或端口目的地。USB驱动程序(USBD)的功能可以概括为:配置管理、总线管理、数据传输管理、提供客户服务。USBD把I/O请求分组(IRP)划分为USB和设备需要大小的块,确保每一个设备能分配到它所要求的USB资源,这样它就可以支持USB设备配置。USB是使用标准Windows系统USB类驱动程序来访问USB驱动程序接口(USBDI),USBD.sys就是USB类驱动程序,它使用通用主控制器驱动程序(UHCD)或开发主控制器接口(openHCI)来访问通用主程序控制器接口设备。USBHUB.sys就是根集线器和外部集线器的USB驱动程序。在PCI枚举器发现USB主控制器后,它会自动装入相关驱动程序。
图5 USB的WDM接口框图
大量的客户服务是由USB的驱动程序提供的,它帮助USB的客户控制和访问它们的功能单元。编写USB设备驱动需要使用Visual C++,此外还需要Windows 98或2000驱动设备开发包(98DDK/NTDDK) [5]。
四 、应用程序设计
微处理器固件程序和USB设备驱动程序的设计是USB设备开发者的工作,对于广大用户而言,与系统的交互是通过应用程序实现,而且整个实时采集系统的主要数据处理都是在这里完成的。因此,运行效率高、界面友好、具有强大数据分析和处理的应用程序的设计,也是系统设计上一个不容忽视的关键因素。其关键是实现从USB 外设读取或发送特定数量的数据,应用程序的主要功能有:启动/关闭USB设备,检测USB设备,设置USB数据传输管道/端口,显示接收数据,发送数据。这里,我们采用Visual C++6.0作为程序的开发环境,
可以把USB设备当成文件来操作,利用Windows API:当设备成功插入USB总线,USBD被自动载入,CreateFile()就会返回一个句柄给驱动。用DeviceIoControl()来进行控制传输,用ReadFile()、WriteFile()进行数据传输。CloseHandle()用来结束与USB设备的通信,此时对于此设备驱动的句柄也就通过它释放出来。使用上述API函数可编制USB数据收发的主机软件[6]。
五、结 语
基于USB技术的CAN现场总线适配器系统的设计,从硬件和软件两方面看是可行的, 实验结果较好的完成了通讯任务,这为在工业现场传送的数据接收与处理方式提供了新的方案。随着现场总线技术的发展,探索其与计算机的接口技术是很有实践意义的。
参考文献
[1] Philips Corp. PDIUSBD12 Users Manual
[2] Philips Corp. SJA1000 Users Manual
[3] 饶运涛 等 现场总线CAN原理与应用技术 北京航空航天大学出版社 2003.6
[4] 周立功 PDIUSBD12 USB固件编程与驱动开发 北京航空航天大学出版社 2003.2