引言
CAN总线是德国BOSCH公司在20世纪80年代初为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种串行数据通信总线,是一种多主总线系统,通信介质可以是双绞线、同轴电缆或光导纤维,其通信速率可达1Mbps。在CAN总线通信控制器中集成了CAN协议的物理层和数据链路层功能,可完成对通信数据的成帧处理,包括零位的插入/删除、数据块编码、循环冗余检验、优先级判别等项工作。CAN协议的一个最大特点是废除了传统的站地址编码,而代之以对数据块进行编码。采用这种方法的优点是可使网络内的节点个数在理论上不受限制,数据块的标识码可由11位(按CAN技术规范2.0A)或29位(按CAN技术规范2.0B)二进制数组成,因此可以定义211或229个不同的数据块。这种按数据块编码的方式,还可使不同的节点同时接收到相同的数据,这一点在分布式控制系统中非常有用。数据段长度最多为8个字节,可满足通常工业领域中控制命令、工作状态及测试数据的一般要求。同时,8个字节不会占用总线时间过长、从而保证了通信的实时性。CAN协议采用CRC检验并可提供相应的错误处理功能,保证了数据通信的可靠性。
随着USB1.1、USB2.0规范的相继制定,为外设与计算机的接口提出了新的发展方向。USB的主要特点有:外设安装简单,可实现热插拨;通讯速率高,USB1.1全速传送速率为12Mbps,与标准串行端口相比,大约快100倍;支持多设备连接;提供内置电源。
通用串行总线(Universal Serial Bus)是国外几家公司为了解决日益增加的PC外设与有限的主板插槽和端口之间的矛盾而制定的一种串行通信的标准。USB作为一种新型的计算机接口技术,具有传输速度高、实时性强、易于扩展、使用灵活、能够进行错误侦测等特点,可以在很大范围内取代RS-232、并行端口,进行短距离高速数据传输,因而应用普遍。
适配器硬件接口
适配器硬件电路由微控制器、CAN总线接口、USB总线接口和DC-DC隔离电源模块等组成。原理框图如图1所示。
图1 适配器硬件接口原理框图(略)
传感器从现场采集来的模拟信号经电路转换成相应的数字量,AT89S52对该数字量做相应的处理后,在现场进行显示监控,同时写入SJA1000发送到CAN总线上供其他设备使用或做进一步的处理。
AT89S52单片机的ALE,WR,RD端分别控制SJA1000的ALE/AS,WR,RD端,P2.0控制片选CS,地址和数据总线由P0口分时复用实现。CAN接口电路使用PHILIPS的PCA82C250芯片实现电平的转换,以满足CAN总线通信要求,并可调整转换速度和防止大的干扰。
USB设备在正常使用以前,必须由主机配置设备。主机一般会从USB设备获取配置信息后再确定此设备有哪些功能。在发出连接USB命令后,主机先读取设备描述符,然后发出设置USB地址SETUP包,设置USB地址后,进行主机客户驱动与设备初始化。其余端点(ENDPOINT)依此类推。USB器件在经历了枚举、定地址、设定接口、端点等步骤以后,进入正常的工作状态。
在其头文件里需定义USB规范中的各种描述符格式,包括设备描述表、配置描述表、接口描述表、端点描述表、字符串描述表以及描述表类型。这样,在发送配置[接口(1),端点(1),接口(2),端点(2),…,类,厂商等]联合描述表时,主机USBD可以根据描述类型标识区分各种分描述表。
软件编程
软件编程包括微控制器的固件和计算机端USB驱动程序两部分。软件编程主要分为三部分:初始化单片机及其外围电路(包括中断控制器);可以执行中断的主循环;读写中断服务程序并马上执行。
微控制器固件编程
USB 实验系统可使用PDIUSBD12 在USB 上传输数据,这些设备的CPU 要忙于处理前台任务,PDIUSBD12 的固件往往设计成基于中断查询和响应的层次式结构。这种完全的中断驱动,使得当CPU
处理前台任务时,USB 的传输可在后台进行,这就确保了最佳的传输速率和更好的软件结构,同时简化了编程和调试,也易于实现固件的维护和移植。
PDIUSBD12的功能框图
PDIUSBD12是一款性价比很高的USB器件。它通常用作微控制器系统中实现与微控制器进行通信的高速通用并行接口。该器件采用模块化的方法实现一个USB接口,使现存的体系结构使固件投资减到最小。它还支持本地的DMA传输。这种实现USB接口的标准组件使得设计者可以在各种不同类型微控制器中选择出最合适的微控制器。这种灵活性减小了开发的时间、风险以及费用(通过使用已有的结构和减少固件上的投资),从而用最快捷的方法实现最经济的USB外设的解决方案。PDIUSBD12完全符合USB1.1版的规范。图2
为PDIUSBD12的功能框图。
图2 PDIUSBD12的功能框图(略)
USB 设备接到HUB 的某个端口上,该HUB 就会通知主机发生了设备接入事件,主机确认设备的接入事件和接入端口,设备处于连接状态(Attached)。主机向该端口送一个持续100ms的复位命令(RESET)信号,当RESET
信号结束时,端口被使能并打开,复位后所有的寄存器和状态被复位,并能响应默认地址。这时HUB 能够提供100mA 电流给USB 设备,USB
设备进入上电状态(Powered)。主机通过该默认地址读取设备的描述器来获得此地址相应的默认管道的最大数据传输量。这时设备处于地址默认状态(Default);主机给设备分发一个唯一的地址,设备进入地址状态(Addressed)。主机读取设备的配置信息,主机以配置信息向设备分发一个配置值,该端点准备就绪可以开始工作,设备可以使用,这时设备处于配置状态。若设备在上电状态后,未获得总线的访问权,则进入挂起状态(Suspended
),直到总线激活以后重进入原状态。设备在挂起状态吸入电流可以很小,必须小于500 A 。当设备从HUB 端口移走时,HUB 通知主机,主机确认后使该端口进入无能状态,端口关闭。
主循环MAINLOOP.C
主循环是固件的前台。设备上电后,主机要通过设备的上拉电阻产生的信号变化来检测新的设备连接,因此,MCU 一旦上电就要初始化其所有端口、存储区、定时器和中断服务程序。为了确保在MCU
准备好服务PDIUSBD12 之前PDIUSBD12 不会进行操作,MCU 将重新连接USB ,包括将Soft_Connect寄存器设置为ON
。PDIUSBD12芯片内置1.5K Soft_Connect上拉电阻,默认时不与VCC相连,这就允许MCU来决定与USB 建立连接的时间。
主循环的流程如图3所示:主循环检查事件标志并进入对应的子程序进行进一步的处理。MCU一上电就需要初始化其所有的端口、存储区、定时器和中断服务程序。之后MCU将重新连接USB,包括将Soft_Connect寄存器设置为ON。主循环的职能有:
图3 主循环流程图
1)初始化MCU所有I/O端口、存储区、定时器和中断寄存器等;
2)解除片选和片选PDIUSBD12;
3)清除事件标志寄存器;
4)重新连接USB;
5)恢复到未配置状态、设置配置状态;
6)在具体的USB应用系统中,主循环要做其他的前台工作。
中断服务程序
后台ISR (中断服务程序)和前台主程序循环之间的数据交换通过事件标志和一个公共的数据缓冲区来实现。例如PDIUSBD12 的普通端点和主端点可以使用循环的数据缓冲区。当PDIUSBD12
从USB 收到一个数据包,它就对CPU 产生一个中断请求,CPU 立即响应中断。在ISR 中,固件将数据包从PDIUSBD12
内部缓冲区移到循环数据缓冲区并在随后清零PDIUSBD12 的内部缓冲区以使其能接收新的数据包。CPU 可以继续它当前的前台任务直到完成,然后返回到主循环检查循环缓冲区内是否有新的数据并开始新的前台任务。中断服务程序流程如图4所示。
图4 中断服务流程图(略)
固件编程是USB数据传输系统中终端设备程序设计的一个重要概念。微控制器通过固件程序与计算机进行数据交换。固件设计的目的是:使PDIUSBD12在USB上达到最大的传输速率;增加系统的可扩展性和硬件无关性。
固件要实现的内容:一是对SJA1000初始化,接收CAN总线送来的数据,收集CAN网络状态信息,并将主机的数据下发到CAN网络;二是对PDIUSBD12初始化,完成USB总线连接过程,并组织CAN网络和主机之间的数据传送。设计中采用KeilC51软件编译环境。
USB设备驱动程序和应用程序设计
实时数据采集程序的书写离不开中断的使用。为了在可视化编程中使用中断,必须选择适当的工具来书写底层驱动程序。目前,市场上存在多种开发WDM
设备驱动程序的工具。其中DDK 是最基本的,也是最原始的驱动开发工具。用户可以根据自己的需要更改inf文件,然后在DDK中重新编译连接生成新的驱动程序,用来满足实际应用的需要。我们也可以使用WinDriver
来开发设备驱动程序。利用它开发设备驱动程序不需要熟悉操作系统的内核,用户编写的驱动程序工作在用户模式下,通过与WinDriver
的.Vxd 或.Sys 文件交互来达到驱动硬件的目的,只需要启动Driver Wizard,检测连接的USB设备,读取USB设备中的端点及配置信息,并自动生成操作USB设备的管道读写函数代码及inf文件。
结论与展望
研究工作总结
由于USB 具有使用简单、即插即用、热插拔、开放性、高速、稳定、可靠性高等优点,它特别适用于仪器仪表、虚拟仪器、数据采集设备、监控设备和加密设备等等场合。基于USB技术的CAN总线适配器的实物照片如图5所示。
图5 基于USB接口技术的CAN总线适配器(略)
本论文得到主要结论如下:
1 ) 系统采用CAN 总线取代传统的分布式数据采集系统常用的485 总线,在数据传输速度、传输距离、抗干扰和故障检测方面的性能得到了很大的提高。
2) 本设计采用的WinDriver 是一种简单的驱动程序设计软件,它使开发者摆脱了核心态驱动开发的难点,可以在用户态开发简单的驱动程序,而不需对操作系统和底层驱动的原理了解太多,这有利于快速开发外设驱动。
3)各个节点通过CAN 现场总线连成通讯网络,再通过USB 连接到主机、笔记本、现场监控机。该系统用USB 作为节点连接到计算机的接口具有快速、即插即用、支持热插拔的特点,使连接更加高效、便利。
展望
本设计在USB 接口的硬件、固件、驱动程序以及用户软件访问驱动程序的方法做了一些探索性的工作。虽然该系统的硬件设计、单片机程序和驱动程序及应用软件的编码调试都已基本完成,但设计中仍有需要进一步改进的地方,而且,针对不同的需求,也需要做适当的改动。建议今后在以下几个方面开展进一步的工作:
1)由于开发板使用89S52作为D12 的控制器,这就从根本上限制了适配器数据传输速度的提高。在实验过程中,使用89S52 芯片和仿真器作为主控制器,而它们的工作频率比较低,它们变成了设备提高传输速率的瓶颈。如果换用工作频率更高的处理器,此开发板的传输速率会成倍的增加。
2) 随着USB 主控制器芯片的推出,USB 外设可以脱离笨重的PC ,直接进行通讯。例如在数据采集系统中,如果系统本身USB
主控能力,采集到的数据在现场可以直接存入优盘,采集完毕再由优盘导入计算机进行处理。这样,将大大减小系统体积,方便携带。利用主控芯片设计带主控制器的外设,以实现点对点通讯,是目前USB
设计的重点。很多公司推出了自己的主控制器芯片,如ISP1160 ( Philips 全速USB 主控制器)。
3) WinDriver虽然降低了驱动程序的编写难度,但也降低了程序的执行效率。在实际应用中如果效率不够,可以考虑将速率要求高的部分插入到核心态运行,这样可提高效率。适配器中的固件编程使用了C语言编写,程序中有许多函数的调用,虽然程序的可读性相对较好,但它的执行效率却不如汇编语言的执行效率高。因此,选择编程语言也是提高设备传输率的方法之一。
5)虽然USB接口的设备已经在市场上比比皆是,然而不难发现,相比与传统的串口、PS/2 等廉价接口,USB设备的价格还是相对较高。
6)USB想要真正统一外设接口,必须要在与IEEE 1394 的竞争中获胜。1394 只用一根线来传送信号,使之不单在PC 外设,在通信领域也有很好的应用。但是1394
的一个致命的缺点是价格太高,一直无法有广泛的应用。随着1394 芯片价格的回落,它与USB 的竞争将越来越激烈。
|