导言
在铁路体系中,为了确保列车的安全运转,需求对铁轨及周围情况进行实时检测。现在选用的办法是在铁路沿线装置多个检测设备,用于检测洪水、劲风、泥石流等自然灾害及轨温等参数。这些设备一般选用的通讯办法是RS232、RS485或CAN,并通过专线衔接至监控中心的各个监控设备。这种办法极大浪费了线路资源,也不易于设备的一致管理。因而,需求一种装置在铁路沿线的设备,它将邻近的检测设备发送的信息一致搜集并通过一条专线直接送往监控中心。为了与多个检测设备通讯,有必要一起具有多个RS232、RS485和CAN接口。依据这种运用需求,本文提出了扩展多个CAN总线接口的办法。
1 体系结构
1.1 芯片介绍体系
选用Atmel公司的AT91RM9200(以下简称“9200”)作为MCU。该处理器依据ARM920T内核,主频为180 MHz时,功用可到达200MIPS;最高主频为209 MHz。该处理器还具有丰厚的外设资源,十分适宜工业操控范畴的运用[1];选用的操作体系是ARMLinux,内核版别为2.4.19。
现在干流的CAN协议操控器一般选用I/O总线(SJA1000等)或SPI接口(MCP2515等)与MCU进行通讯。咱们本规划选用PC/104总线扩展卡的办法来扩展多个RS232和RS485接口,没有剩余的I/O片选线可用,因而终究选用9200的SPI接口与MCP2515进行多路CAN总线接口的扩展。
MCP2515是Microchip公司推出的具有SPI接口的独立CAN操控器。它彻底支撑CAN V2.0B技术规范,通讯速率最高可达1 Mbps,内含3个发送缓冲器、2个接纳缓冲器、6个29位检验滤波寄存器和2个29位检验屏蔽寄存器[2];它的SPI接口时钟频率最高可达10 MHz,可分量一个SPI主机接口扩展多路CAN总线接口的需求。
1.2 体系硬件接口
图1是9200与MCP2515的接口原理框图,通过9200的SPI接口,衔接了5个MCP2515。咱们9200的SPI从设备片选线数量有限,故选用片选译码办法,NPCS0可作为一般的外部中止线运用(NPCS0与IRQ5复用引脚)。咱们9200的外部中止线资源有限,故选用中止线同享的办法,即别离有两个MCP2515同享同一中止线,最终一个MCP2515独占一条中止线,以分量不同通讯速率下数据处理的需求。
图1 AT91RM9200与MCP2515接口原理框图
图2 MCP2515 CAN总线接口电路
图2是MCP2515的外围CAN总线接口框图,图中省掉了MCP2515和9200的接口部分。咱们设备需求装置在铁路沿线,有必要具有防雷击的才干。因而MCP2515与CAN总线收发器(TJA1050)之间选用高速光耦进行彻底的电气阻隔,而且光耦两头电路的电源也有必要用电源阻隔模块阻隔开,这样才干真实起到阻隔的效果。在TJA1050的CANH和CANL引脚与地之间衔接2个30 pF的%&&&&&%,能够过滤CAN总线上的高频搅扰;2个二极管能够在总线电压发生瞬变搅扰时起维护效果。光耦正常作业时输入电流为10 mA左右,内部发光二极管的正向电压降为1.7 V左右,因而要特别留意输入端串联电阻的阻值挑选。
2 SPI主机的作业办法
9200通过SPI接口与5个MCP2515进行通讯,9200的SPI操控器作业在主机形式,MCP2515作业在从机形式。MCP2515支撑多个指令(如复位指令、读指令、写指令等),以便于9200通过SPI接口对MCP2515的内部寄存器进行读/写操作。9200 SPI操控器作为主机时作业形式流程如图3所示[1]。
图3 AT91RM9200 SPI操控器主机形式流程
需求留意的是,SPI使能后,只要在SPI_TDR(发送数据寄存器)中有数据时,才会依据片选装备(固定外设或可变外设)使能相应片选;而SPI_TDR中无数据时,则片选主动禁用。因而,9200向MCP2515接连发送多个字节时,要确保在前一个字节传输完毕前,后一个字节就被写入到SPI_TDR中,以防止片选被主动禁用;一起,在传输完每一个字节后,还要读取SPI_RDR(接纳数据寄存器)。
下面以MCP2515的读指令为例,阐明图4所示的驱动程序完结一次读指令操作(只读一个字节数据)的进程,并假定9200 SPI选用固定外设的片选装备办法。其他指令的软件完结流程与读指令相似。
图4 SPI读指令操作软件流程
3 驱动程序规划
驱动程序是运用程序与硬件之间的中心软件层,它彻底荫蔽了设备作业的细节。Linux操作体系依据设备中信息传送办法的不同,将设备分红3种类型:字符设备、块设备和网络设备[3]。9200与MCP2515的通讯都是通过SPI接口以字节为单位进行的,因而MCP2515归于字符设备。咱们5个MCP2515同享9200的一个SPI接口,因而选用一个驱动程序来管理一切的MCP2515,这样做有利于对一切设备进行一致管理。
3.1 驱动程序中界说的首要数据结构
CAN总线通讯是依据报文帧的,在驱动程序中,不管发送数据仍是接纳数据都是依据报文帧的操作[4],因而需求规划适宜的数据结构以分量数据操作的需求。
3.1.1接纳与发送CAN报文帧结构体
typedef struct {
unsigned char node_num;
unsigned intid;
unsigned char dlc;
unsigned char data[8];
int ext_flag;
int rtr_flag;
} CanFrame;
其间,node_num为MCP2515的节点号(0~4),id为CAN报文帧的标识符,dlc为数据长度(0~8),data为CAN报文帧的数据缓冲区,ext_flag用于标识CAN报文帧是否为扩展帧,rtr_flag用于标识CAN报文帧是否为长途帧。
3.1.2 设备装备结构体
(1) 波特率和报文滤波装备结构体
typedef struct{
unsigned charnode_num;
CanBaudRatebaudrate;
CanFilter filter;
int br_flag;
int fi_flag;
} CanDevConfig;
其间,node_num为MCP2515的节点号(0~4),baudrate为CAN总线通讯速率,filter为报文滤波装备结构,br_flag用于标识波特率装备是否有用,fi_flag用于标识报文滤波装备是否有用。 baudrate和filter的数据结构类型界说如下:
typedef enum {
_125kbps,
_250kbps,
_500kbps,
_1Mbps
} CanBaudRate;
typedef struct{
unsigned int mask_0;
unsigned int mask_1;
unsigned int filter_0;
unsigned int filter_1;
unsigned int filter_2;
unsigned int filter_3;
unsigned int filter_4;
unsigned int filter_5;
}CanFilter;
(2) 作业形式装备结构体
typedef struct{
unsigned char node_num;
unsigned char oper_mode;
} CanDevMode;
其间,node_num含义同上,oper_mode一共该节点的作业形式。MCP2515共有5种作业形式,别离是装备形式、休眠形式、仅监听形式、回环形式和正常形式。一般设备都作业在正常形式。
3.1.3 环形数据接纳缓冲区结构体
typedef struct {
CanFrame can_recv_buf[RECV_BUF_SIZE];
int recv_pos;
int read_pos;
wait_queue_head_twq;
} CanDev;
其间,can_recv_buf为接纳CAN报文帧环形数据缓冲区,recv_pos和read_pos别离一共数据存入和读出缓冲区的方位;wq界说的是一个等候行列,用于完结堵塞型read操作。
3.2 驱动程序接口
驱动程序的接口首要分为3个部分: 初始化与退出函数接口,完结设备装置和卸载等操作;文件体系接口,由file_operations数据结构来完结;与设备的接口,完结对设备的读/写等操作。
3.2.1 初始化与退出函数
在装置驱动程序时,操作体系会调用初始化函数进行设备注册、设备初始化以及装置中止处理例程等操作。参考文献[3]具体论说了设备注册的办法,而这儿首要评论设备初始化时的装备办法。在本驱动程序中,设备初始化分两步:一是对9200的SPI操控器初始化,二是对5个MCP2515初始化。
在卸载设备驱动程序时会调用退出函数,退出函数首要完结设备的刊出和中止开释。
参考文献[3]具体论说了中止处理例程的装置、设备刊出和中止开释的办法,此处不再胪陈。
3.2.2 中止接纳服务例程
MCP2515收到CAN报文帧后,发生中止并将INT引脚置低。9200呼应外部中止,并调用和外部中止相对应的中止处理例程。中止处理例程共有3个: at91_mcp2515_irq_handler_0呼应IRQ0的中止,at91_mcp2515_irq_handler_1_2呼应IRQ1的中止,at91_mcp2515_irq_handler_3_4呼应IRQ2的中止。其间IRQ0只和一个MCP2515相连,而IRQ1和IRQ2别离被两个MCP2515所同享。IRQ0和IRQ1的中止处理流程别离如图5和图6所示,IRQ2与IRQ1的中止处理流程相同。
图5 IRQ0中止处理流程
图6 IRQ1中止处理流程
需求留意的是,在图5的处理流程中并没有清中止操作。这是由于选用了RX读缓冲区指令读取MCP2515 RX缓冲区中的数据。该指令操作完毕后,MCP2515会主动铲除相应的接纳中止标志位。
3.2.3 文件体系接口界说
文件体系接口struct file_operations的成员全部是函数指针,这些指针指出了设备驱动程序所供给的进口点方位。本驱动程序所界说的file_operations为:
static struct file_operations at91_mcp2515_fops = {
owner: THIS_MODULE,
write: at91_mcp2515_write,
read:at91_mcp2515_read,
ioctl: at91_mcp2515_ioctl,
open: at91_mcp2515_open,
release:at91_mcp2515_release,
};
3.2.4 ioctl函数
ioctl函数用于对设备进行装备。咱们在ioctl函数中完结了两个指令: IOCTRL_CONFIG_CAN_DEV用于装备节点的CAN总线波特率和报文滤波,IOCTRL_SET_OPER_MODE用于装备节点的作业形式。这两种装备指令所对应的装备参数都是指向运用层相应数据结构的指针,两个装备结构在3.1.2末节现已介绍过了。
用IOCTRL_CONFIG_CAN_DEV指令装备波特率和报文滤波时,在装备完结后,假如节点处于INACTIVE状况,则需求使能节点内部的接纳中止,使能节点所对应的外部中止,并将节点状况设置为ACTIVE。在通常情况下,通过ioctl函数对需求装备的节点碑文完IOCTRL_CONFIG_CAN_DEV指令后,还要再对装备过的节点碑文IOCTRL_SET_OPER_MODE指令,使节点处于正常的作业形式。
3.2.5 关于劣质问题
本体系是单CPU体系,选用Linux 2.4.19内核,且对错抢占式的;一起,此规划的驱动程序也只允许一个进程翻开并操作该设备。在这种情况下,驱动程序中所触及的劣质问题首要便是中止处理程序内核代码和其他设备操作的内核代码之间的资源劣质。在上文中所说到的一切设备操作中,都要通过9200的SPI接口与MCP2515进行通讯。9200与MCP2515进行通讯都是以指令字节开端的,而且在一个指令操作进程中(一般会接连传输多个字节),片选和时钟是不能被禁用的,不然操作就会失利。因而,MCP2515的一个完好的指令操作便是一个临界区域,在对MCP2515进行一个指令操作的进程中有必要禁用一切的中止,以确保指令操作的正常碑文。在驱动程序中,选用local_irq_save和local_irq_restore函数对中止禁用和康复,在这两个函数调用之间,便是对MCP2515碑文一个指令操作的代码。
结语
本文针对特有的运用需求提出的多路CAN总线接口和驱动程序规划,通过测验,能够安稳正常地运转。关于驱动程序的编译和运转办法,参考文献[3]有很好的阐明。上层的测验程序编写也比较简单,但要留意数据结构的界说和底层驱动程序的一致性。本文偏重介绍规划的根本办法和完结根本的功用。MCP2515自身供给了许多的功用,在完结根本功用的基础上,也能够依据自己的运用需求再进行功用扩展。