华 金, 郭建国
(1.中海船研科技股份有限公司研究开发部,上海200135;2.中海船研科技股份有限公司民船产品事业部,上海200135)
目前,控制器局域网(Controller Area Network,CAN)现场总线技术日渐成熟,被广泛应用于船舶控制领域,如主机遥控、电站监控以及火灾延伸报警系统中。同时随着互联网技术与船舶自动化技术的深入结合,使现场设备能“无缝”连接至以太网。CAN-Ethernet网关的设计方案,有效解决了控制系统中下层现场总线控制网和上层信息管理网的互联问题,同时采用了双冗余技术,提高系统运行的可靠性及故障的可诊断性。
中央处理器(Central Processing Unit,CPU)芯片选用NXP公司的LPC2378微控制器,其功能强大、成本低、效率高,支持10/100M Ethernet,提供2路CAN 2.0B接口、多个串行接口,具有系统编程(In-System Programming,ISP)功能;片内集成了512 kB 的 Flash、58 kB 的 SRAM(Static Random Access Memory)、8路10位A/D、1路10位D/A转换器和1个4 MHz的IRC(Internet Relay Chat)振荡器,并带有存储卡(Secure Digital Card,SD)接口可供选择。此外LPC2378还提供4个32位定时器、实时时钟和看门狗定时器等。综合考虑,该芯片可以满足嵌入式网关的设计要求。
LPC2378芯片内部集成2路CAN控制器,CAN总线物理驱动芯片采用新一代TJA1040高速CAN总线收发芯片(见图1)。此外,在舰船综合平台环境下,采用6N137光耦作为系统内、外部隔离,抑制外部干扰。6N137光耦为高速逻辑门光耦芯片,可提供10Mbit/s数据传输速率,前后级采用2个相互隔离的DC5V电源模块。
图1 CAN硬件原理图
LPC2378芯片内部集成1路10/100M Ethernet MAC接口,并带有直接内存存取(Direct Memory Access,DMA)控制器,外围电路需要连接物理层(Physical Layer,PHY)芯片,通过使用RMII(Reduced Uedia Independant Interface)接口与其进行通信,从而实现以太网通讯功能。设计选用物理层芯片DP83848I,通过HX1188型网络变压器与带有指示灯的RJ45接口连接。
同时为满足双冗余以太网设计,LPC2378芯片又具备外部总线接口MiniBus。外围电路选择以太网控制芯片KSZ8851-16MLLI,其整合以太网MAC/PHY,通过8位外部总线接口与其进行通信,同样再连接HX1188型网络变压器和带有指示灯的RJ45接口。
网关功能实现需要CAN节点通信的CAN驱动、服务器通信时的Ethernet驱动(见图2)及TCP/IP协议和两种通信标准的数据转换。
图2 Ethernet硬件原理图
CPU内嵌2路CAN控制器,通过读写寄存器对CAN进行初始化,设置CAN总线波特率,发送和接收缓冲,设置中断使能。具体步骤包括:
(1)使能PCONP寄存器中PCAN1、PCAN2电源/时钟控制位;
(2)设置PINSEL寄存器管脚为TD、RD;
(3)在控制器复位模式上,发送和接收错误计数值清零后进入工作模式,设置默认波特率为125 k/b;
(4)使能CAN控制器接受中断,并安装中断函数;
(5)设置滤波方式为全通模式;
(6)创建接收环形缓冲区用来存放中断响应数据。
发送程序采用查询方式,接收程序采用中断方式。图3描述CAN收发数据的流程。
CPU 内嵌一路MAC控制器,通过读写寄存器对Ethernet进行初始化;同时又通过MiniBus总线扩展了一路以太网控制芯片,中断信号反馈至CPU的外部中断信号脚(EINT3),然后分配发送和接收描述符、状态的内存,设置中断使能。内嵌以太网控制芯片的具体步骤:
图3 CAN软件流程图
(1)使能PCONP寄存器中PCENET电源/时钟控制位;
(2)设置 PINSEL寄存器管脚为 RMII接口,包括数据接口 TXD[0]、TXD[1]、TXEN、RXD[0]、RXD[1]、RXEN、RXCLK、CRS和管理接口 MDC、MDIO;
(3)复位以太网控制器,包括发送、接收功能复位和软复位;
(4)设置寄存器,使能每帧循环冗余(Cyclic Redundancy Check,CRC)校验、短帧自动填充、设置帧最大长度等;
(5)选择RMII接口模式;
(6)复位物理层芯片后,再检查内部固化身份识别号码(IDentity,ID)是否正确;
(7)配置物理层芯片自适应,设置控制器全双工/半双工模式和100Mb/10Mb模式;
(8)设置MAC地址,初始化传送(Transmit,TX)和接收(Receive,RX)的描述符;
(9)设置接受帧滤波模式,使能接受中断并安装中断函数,并清除所有中断。
发送程序采用查询方式,接收程序采用中断方式。图4描述Ethernet收发数据的流程。
完成Ethernet驱动程序的编写后,需移植高性能的嵌入式TCP/IP协议栈。LwIP(Lightweight TCP/IP stack)是用于嵌入式系统的开放源代码轻量级的TCP/IP协议栈,包括了IP(Internet Protocol)、ICMP(Internet Control Message Protocol)、TCP(Transmission Control Protocol)、UDP(User Datagram Protocol)、DHCP(Dynamic Host Configuration Protocol)和ARP(Address Resolution Protocol)等常用协议功能,而且提供了TCP/IP的API函数,完全可以满足网关的需求。设计以UDP通信为例,利用UDP接口函数编程(见图5)。
uC/OS-II操作系统中,在系统应用任务层上,实现网关功能主要涉及3个任务。
void ETH_SETUPTask(void*pdata)
void CAN2ETHTask(void*pdata)
void ETH2CANTask(void*pdata)
图4 Ethernet软件流程图
图5 移植LwIP协议流程图
在CAN2ETHTask任务中,调用CANRead()函数读取CAN中断存放在RAM缓冲区数据。报文结构:
typedef struct
{
UNS8 rtr; /* 远程帧还是数据帧:0表示数据帧,1表示远程帧*/
UNS8 ff; /* 扩展帧还是标准帧:0表示标准帧,1表示扩展帧*/
UNS8 len;/* 数据长度(0-8)*/
UNS32 cob_id;/*帧ID*/
t8BYTESdata;/*数据内容*/
}sCANMsg;
在数据转换过程中,规定CAN报文结构大小为16个Bytes,在Ethernet数据段格式见表1。
表1 Ethernet数据段格式
为了提高Ethernet网络利用率,单帧发送的数据越多越好。同时为了信息传递和处理的方便设置CAN数据帧的数据长度都为8个Bytes,不足部分填充0即可。将CAN总线数据打包成1个Ethernet帧然后通过调用LwIP的API函数udp_send()发送。转发机制采用定时和定量原则,当接收CAN报文达到规定数量后转发或者在规定时间内转发不到规定数量的CAN报文,这样能有效提高系统的实时性。
在ETH2CANTask任务中,调用LwIP回调函数UDP_R()读取Ethernet中断存放在RAM缓冲区的数据。数据段格式与表1如同,最大能容纳1 536个Bytes。转发机制为读取网络报文立即解析后,封装成CAN报文帧格式发送至总线上。
设计在以ARM7处理器为核心的平台上开发了双冗余CAN-Ethernet网关,能够实现船舶控制系统中CAN总线与Ethernet之间的数据交换,同时又保证了系统可靠性。
[1] 孙 亮清.船舶集成平台管理系统与嵌入式CAN/Ethernet网关的实现[D].上海:上海海事大学,2004.
[2] A dam Dunkels.Design and Implementation of the LwIP TCP/IP Stack[EB/OL].[2001-02-20].http://www.docim.com/P-241782196.html.
[3] N XPSemiconductors.LPC2378 User manual[EB/OL].[2009-02-11].http://www.keil.com/dd/chip/4153.htm.