嵌入式复合型工业总线网关的CAN 口设计

时间:2009-11-13

  摘要:本文提出了一种基于VxWorks 嵌入式操作系统的工业总线协议转换器—TC700。它能够实现RS232/RS485/CAN 与以太网的协议转换,是一种复合型的多协议转换网关。在对TC700 功能原理简单说明的基础上,笔者着重从TC700 的硬件电路结构设计和软件驱动程序开发两个方面,具体分析介绍了该网关CAN 接口驱动设计的过程。通过移植UNIX 系统下u-boot 中的spi.c 程序,完成了CAN 接口驱动程序的设计内容。

  0 引言

  工业现场总线是工厂底层设备之间的通信网络,是计算机数字通信技术在自动化领域的应用,为车间底层设备信息及生产过程信息集成提供了通信技术平台。传统的工业串行总线标准有RS232和RS485,CAN则是目前广泛应用的典型的现代工业现场总线标准。以太网是一种可应用于工业以及办公环境的通用网络标准。这些不同的串行通信标准,由于各种不同原因分别得到不同应用。为了实现这些不同标准节点之间的数据通信,必须有一个实现这些不同标准之间协议转换的网关设备,TC700就是为实现这个目的而设计的。

  RS232、RS485串行总线标准主要是完成物理层之间的协议转换工作,而CAN和以太网之间的协议转换既包括物理层的转换也包括数据链路层的转换,是二层的转换结构。因此,TC700能够实现串口与网口、CAN口与网口之间的协议转换功能,我们将其看作是一种复合型的工业总线网关设备。

  1 TC700 的功能原理与硬件结构

  1.1 TC700 网关设备的功能原理

  TC700网关采用嵌入式系统架构进行设计,包括了RS232、RS485、CAN和以太网几种类型的接口。TC700能够支持简单的路由功能,在把RS232、RS485、CAN接入IP网络的同时,可从IP网络中对每个串口设备进行访问。在数据传输时,TC700中的RS232、RS485与CAN接口均被分配一个IP地址,从串口接收到的负载数据能够各自组成相应格式的数据帧,通过网络接口发送出去,在局域网甚至在广域网进行传输;反之,本地主机或远程主机也可以通过Internet远程访问各个串行接口。TC700的原理框图如图1所示:

  1.2 TC700 协议转换器硬件总体结构

  TC700协议转换器使用了飞思卡尔公 司(原摩托罗拉公司)生产的微处理器 MPC850作为它的CPU,它是TC700总体结 构的中心,对各个模块进行控制。这些模块 分为两部分,一部分是支持模块,主要 包含电源模块,存储器模块(SDRAM与Flash Memory),时钟和复位模块和通用I/O模块。 另一部分为通信模块,包括串口模块,以太 网模块、CAN接口模块等[1]。MPC850集成了 一个高性能的嵌入式PowerPC核和一个包 含特殊设计的32位RISC处理器的通信处理 器(CPM)。它的 CPM 支持6个串行通道: 一个串行通信控制器(SCC)、一个通用串 行总线通道(USB)、两个串行管理控制器 (SMC)、一个I?C(Inter-Integrated Circuit) 接口和一个串行外围接口电路(SPI)。本 文中,笔者着重介绍了TC700协议转换器的 CAN接口驱动开发过程中的硬件设计和软 件设计两个部分。

  2 CAN 接口硬件电路设计

  CAN总线是一种串行数据通信协议, 在CAN总线通信接口中集成了CAN协议的 物理层和数据链路层功能,可以完成对通信 数据成帧处理[2]。CAN总线接口的设计有硬 件设计和软件设计两种方式。软件设计方式 需要开发人员编写相应的程序来实现数据 的成帧、解帧和完成数据帧的收发功能。这 就增加了开发人员的负担,延长开发周期。 重要的是软件程序会增大系统运行开销, 使CPU利用率降低等,因此本文采用硬件开 发方式完成对CAN接口的设计。在CAN控制器的选择上,由于TC700的CPU与CAN控制 器之间的通信是通过SPI接口来实现的,因 此除了选有带有SPI接口的CPU芯片之外, CAN控制器也须选择带有SPI接口的芯片。 美国微芯科技有限公司生产的MCP2510是 一款带有SPI 接口的CAN 控制器,它通过 SPI 接口与CPU进行数据传输。MCP2510支 持CAN 技术规范V2.0A和 V2.0B,并能够 发送和接收标准的和扩展的信息帧, 同时具 有接收滤波和信息管理的功能,还具有灵活 的中断管理能力。这些特点使得CPU 对 CAN 总线的操作变得非常简便[3]。另外, 笔者还选择了PHILIP生产的PCA82C250芯 片作为TC700网关设备的CAN的收发器。 PCA82C250具有放大MCP2510与CAN总线 之间传输信号的功能,可以使CAN总线有充 分的负载能力与总线上其他设备进行数据 交换。


  (a) MCP2510接口电路图


  (b) PCA82C250 接口电路


  图 2 CAN 总线的接口电路

  图2是CAN总线的接口电路原理图, MCP2510通过SPI接口的四个管脚SPIMISO、 SPIMOSI 、SPICLK 、SPI_SEL 分别与CPU 的 PB[28]、PB[29]、PB[30]、PD[7]管脚相连, 即实现了MCP2510与CPU双方SPI接口的互 连。SPI接口间的通信协议也是可以采用软 件算法的方式来实现的;CAN控制器MCP2510 与CAN 收发器PCA82C250 通过CAN_TX 和 CAN_RX管脚进行相连,这里的PCA82C250作 为MCP2510与物理总线的接口。为了提高系 统的抗干扰能力,在MCP2510和PCA82C250之 间加了双通道数字隔离器ADuM1201 , ADuM1201有诸多优于光电隔离器件性能的 地方,可以很好的满足CAN总线上电气隔离 的要求。

  3 基于VxWorks 的CAN 接口驱动程序设计

  3.1 基于VxWorks 的嵌入系统的工作原理

  本网关所采用的嵌入式操作系统 VxWorks是美国“风河”(Wind River)公司 开发研制的一种嵌入式实时操作系统 (RTOS)。在众多的嵌入式操作系统中, VxWorks以良好的可靠性和卓越的实时性, 在军事、航空航海、通信、医疗等高科技技 术领域都有着广泛的应用与发展,在嵌入式 领域中占有极其重要的地位。VxWorks具有 小巧的内核、可被裁剪、广泛的硬件支持和 第三方软件开发商支持等优点,极大地提高 了程序员的开发效率[4]。

  加电后,TC700首先启动VxWorks操作 系统,包括了两个映像的启动过程。一是 BootRom 映像; 另一是VxWorks 映像。 BootRom映像是一个化、专用的系统映 像,又称为启动映像,它保存在固定位置(如 FlashROM或ROM),主要负责加载和运行 终使用的VxWorks映像。即在VxWorks操作系统正式启动之前,首先需要定制和建立 BootRom,然后通过它配置可加载的 VxWorks映像到RAM中运行。VxWorks映像 加载完毕后,系统就启动内核创建根任务 usrRoot,通过调用iosInit()函数初始化I/O 文件系统,初始化各个串口并安装驱动程 序。初始化工作完成之后,VxWorks操作系 统正式加载,网关开始工作。

  3.2 SPI 接口驱动程序的开发

  SPI接口驱动程序是为了完成TC700协 议转换器的CAN通信而设计的,在本系统 中,笔者通过移植u-boot中的spi.c文件使该 驱动能够在VxWorks操作系统下顺利运行。 在SPI接口的驱动程序spi.c中有三个主要的 功能函数:sysSpiHwInit()、spi_write()和 spi_read()。

  (1) sysSpiHwInit(),使SPI能够正常工 作;初始化参数RAM;设置参数RAM和双 口RAM的基址等。

  (2) spi_write(),该函数为SPI接口的写 函数,定义接收缓冲区和发送缓冲区指针变 量,并为其分配存储空间;写入写数据使能 控制字。

  (3) spi_read(),该函数为SPI接口的读函 数,同样也需定义接收、发送缓冲区的指针 变量和分配存储空间;并写入读数据使能控 制字。

  4 CAN 接口驱动程序流程

  VxWorks 操作系统中的I/O 系统中有 两种基本设备类型[5]:字符设备和块存取设 备,本文中所研究的CAN 口设备属于字符 设备。I/O 系统为所有的字符设备提供统一 的访问接口[6],其基本作用就是,把用户请 求分配到与设备对应的驱动例程中去。

  在 CAN 接口驱动程序的开发过程中, 我们对VxWorks 的虚拟设备ttyDrv 进行封 装,使其向上将TTY 设备安装到标准的I/O 系统中去,从而完成上层程序对硬件设备的 操作;向下为实际的硬件设备提供底层的设 备驱动程序。

  4.1 CAN 设备初始化过程

  ①网关设备加电后,操作系统启动, 创建根任务UsrRoot,并通过该任务调用iosInit ( )函数对VxWorks 的I/O系统进行初 始化;

  ②调用设备驱动初始化函数ttyDrv( ), 该函数先初始化CAN设备驱动程序,然后调 用iosLib 库中的函数iosDrvInstall( ),为该设 备的相关I/O驱动程序分配一个驱动号 (ttyDrvNum = iosDrvInstall (ttyOpen, (FUNCPTR) NULL, ttyOpen, ttyClose, tyRead, tyWrite, ttyIoctl);),并将其对应的 函数入口地址增加到驱动程序表中 (drvTable);

  ③ttyDevCreate ( )函数用来创建设备 驱动。首先将已经定义并初始化的结构体 TYCO_DEV传递给ttyDevCreate ( )函数,然 后调用iosDevAdd ( )将设备名(该设备名称 为tyCo/4)和驱动号(ttyDrvNum)加入设 备链表(iosDvList)中。

  CAN设备驱动的初始化工作主要包括 为读写缓冲区分配存储空间、创建读写同步 信号量和互斥信号量以及初始化等待任务 列表等。

  4.2 CAN 设备驱动程序的访问过程

  系统在对设备进行初始化完毕之后, 应用程序可以通过I/O系统对设备进行访 问。但在VxWorks中,应用程序是通过打开 命名文件来访问I/O设备的。对每个设备的 访问都会看成是对一个文件的操作,每个被 打开的文件都会作为一个条目存储在文件 描述符表(fdTable)中[2]。

  ①调用open()函数打开要访问的设备 tyCo/4;

  ②I/O系统根据设备名(tyCo/4)在设 备链表(iosDvList)中进行查找匹配,返回 设备数据结构指针( TYCO_DEV * pTyCoDev);

  ③被打开的设备作为文件设备在文件 描述符表中被分配到一个空的文件条目 ( FD_ENTRY); ④I/O系统根据查找到的设备驱动号 (ttyDrvNum)在设备驱动程序表(drvTable) 中查找该设备对应的ttyOpen (TYCO_DEVpTyCoDev, char * name, int flags, intmode)驱动例程。如果成功,则通过该驱动例程将设备驱动描述符指针

  (pTyCoDev)、设备文件名和驱动返回值 存放在空的文件条目中,并返回一个文件描 述符(fd);

  ⑤应用程序通过调用ioLib中的read或 write函数对设备文件进行访问。首先,这两 个函数通过文件描述符(fd)找到对应的设 备描述符。然后根据设备描述符找到对应的 drvTable表,在DRVTABLE表中调用TTY设 备的例程函数tyWrite ()、tyRead (),通过这 两个例程函数调用驱动程序spi.c 中的 spi_write和spi_read函数与实际的CAN接口 硬件设备进行数据传输,从而实现CAN报文 的发送和接收。

  5 结束语

  本文的创新点是作者将UNIX系统下 的SPI接口程序移植到VxWorks系统下,使 其能在VxWorks系统下正常运行,从而完成 了TC700网关的CAN驱动程序的开发。另 外,本文提出的TC700CAN接口驱动程序的 设计,是VxWorks的驱动机制在X86平台上 的实现,其开发思路也能够为基于其他平台 的CAN接口驱动开发提供一些经验。传统的 硬件驱动程序开发,需要开发人员使用汇编 语言编写软件程序。而在嵌入式系统中, TC700的驱动开发过程是在上层进行的,即 软件驱动程序的开发,通过语言进行程 序编写即可。实践调试结果表明:本文所设 计的网关实现了CAN接口驱动的功能,能可 靠的运行并能与CAN总线上的设备进行正 常的数据交换,充分体现了CAN总线高性 能、高可靠性的特点。


  
上一篇:基于SBC+DSP 的嵌入式系统设计与应用
下一篇:基于PowerPC的单板计算机的设计

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料