已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于AT91RM9200 的多路CAN总线接口及驱动程序设计 北京交通大学 徐晓东 路红英 张宁摘 要本文结合实际需求,提出了一种多路CAN总线接口的设计方法。系统硬件主体采用AT91RM9200和MCP2515,操作系统采用arm-linux。详细介绍了硬件的接口设计,并针对该硬件接口设计分析了arm-linux下的驱动程序各接口的设计方法,并对驱动程序实现过程中需要注意的问题进行了深入分析。经过测试,该设计方案可以满足应用的要求。关键词AT91RM9200 MCP2515 arm-Linux CAN SPI 驱动程序70 引言在铁路系统中,为了保证列车的安全运行,需要对铁轨及周围状况进行实时检测。目前采用的方法是在铁路沿线安装多个检测设备,用于检测洪水、大风、泥石流等自然灾害及轨温等参数。这些设备一般采用的通信方式是RS-232、RS485或CAN,并通过专线连接至监控中心的各个监控设备。这种方式极大浪费了线路资源,也不易于设备的统一管理。因此,需要一种安装在铁路沿线的设备,它将附近的检测设备发送的信息统一收集并通过一条专线直接送往监控中心。为了和多个检测设备通信,我们的设备必须同时具有多个RS-232、RS-485和CAN接口。本文即是出于这种应用需要,提出了扩展多个CAN总线接口的方法。1 系统结构1.1 芯片介绍本系统采用ATMEL公司的AT91RM9200(以下简称9200)作为MCU,该处理器基于ARM920T内核,主频为180MHz时,性能可达到200MIPS,最高主频为209MHz。同时该处理器还具有丰富的外设资源,非常适合工业控制领域的应用1。采用的操作系统是Arm-Linux,内核版本为2.4.19。目前主流的CAN协议控制器一般采用I/O总线(SJA1000等)或SPI接口(MCP2515等)与MCU进行通信。由于我们采用PC/104总线扩展卡的方式来扩展多个RS-232和RS-485接口,没有多余的I/O片选线可用,因此我们最终选用9200的SPI接口与MCP2515进行多路CAN总线接口的扩展。MCP2515是具有SPI接口的独立CAN控制器,它完全支持CAN V2.0B技术规范,通讯速率最高可达1Mb/s,内含3个发送缓冲器、2个接收缓冲器、6个29位验收滤波寄存器和2个29位验收屏蔽寄存器2。它的SPI接口时钟频率最高可达10MHz,可满足一个SPI主机接口扩展多路CAN总线接口的需要。1.2 系统硬件接口系统硬件接口的原理框图如图1和2所示。图1是9200与MCP2515的接口框图,通过9200的SPI接口,连接了5个MCP2515。由于9200的SPI从设备片选线数量有限,故采用片选译码方式,NPCS0可作为普通的外部中断线使用(NPCS0与IRQ5复用引脚)。由于9200的外部中断线资源有限,我们采用中断线共享的方式,即分别有两个MCP2515共享同一中断线,最后一个MCP2515独占一条中断线,以满足不同通信速率下数据处理的需要。图 1 AT91RM9200与MCP2515接口框图图2 是MCP2515的外围CAN总线接口框图,图中省略了MCP2515和9200的接口部分。由于设备需要安装在铁路沿线,必须具有防雷击的能力。因此MCP2515 与CAN总线收发器(TJA1050)之间采用高速光耦进行完全的电气隔离,并且光耦两端电路的电源也必须用电源隔离模块隔离开,这样才能真正起到隔离的作用。在TJA1050的CANH和CANL引脚与地之间连接两个30pF的电容可以过滤CAN总线上的高频干扰,两个二极管可以在总线电压发生瞬变干扰时起保护作用。光耦正常工作时输入电流为10mA左右,内部发光二极管的正向电压降为1.7V左右,因此要特别注意输入端串联电阻的阻值选择。图2 MCP2515 CAN总线接口电路2 SPI主机的工作方式9200通过SPI接口与五个MCP2515进行通信,9200的SPI控制器工作在主机模式,MCP2515工作在从机模式。MCP2515支持多个指令(如复位指令、读指令、写指令等),以便于9200通过SPI接口对MCP2515的内部寄存器进行读写操作。9200 SPI控制器作为主机时工作模式流程如图3所示1。图3 9200 SPI控制器主机模式流程图需要注意的是,SPI使能后,只有在SPI_TDR(发送数据寄存器)中有数据时,才会根据片选配置(固定外设或可变外设)使能相应片选,而SPI_TDR中无数据时,则片选自动禁用。因此,9200向MCP2515连续发送多个字节时,要保证在前一个字节传输完毕前,后一个字节就被写入到SPI_TDR中,以避免片选被自动禁用。同时,在传输完每一个字节后,还要读取SPI_RDR(接收数据寄存器)。以MCP2515的读指令为例,如图4所示为驱动程序完成一次读指令操作(只读一个字节数据)的过程,图中假设9200 SPI采用固定外设的片选配置方式。其他指令的软件实现流程与读指令类似。图4 SPI读指令操作软件流程图3 驱动程序设计驱动程序是应用程序与硬件之间的中间软件层,它完全隐蔽了设备工作的细节。用户通过一组标准化的系统调用来完成相关的硬件操作,而驱动程序就是把这些标准化的系统调用映射到具体的设备操作上。嵌入式linux和PC平台下的linux设备驱动程序的设计方法基本一样。Linux操作系统根据设备中信息传送方式的不同,将设备分成三种类型:字符设备、块设备和网络设备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 int id;unsigned char dlc;unsigned char data8;int ext_flag;int rtr_flag; CanFrame;其中,node_num为MCP2515的节点号(04),id为CAN报文帧的标识符,dlc为数据长度(08),data为CAN报文帧的数据缓冲区,ext_flag用于标识CAN报文帧是否为扩展帧,rtr_flag用于标识CAN报文帧是否为远程帧。3.1.2 设备配置结构体(1)波特率和报文滤波配置结构体typedef structunsigned char node_num;CanBaudRate baudrate;CanFilter filter;int br_flag;int fi_flag; CanDevConfig;其中,node_num为MCP2515的节点号(04),baudrate为CAN总线通信速率,filter为报文滤波配置结构,br_flag用于标识波特率配置是否有效,fi_flag用于标识报文滤波配置是否有效。 baudrate和filter的数据结构结构类型定义如下所示:typedef enum _125kbps,_250kbps,_500kbps,_1Mbps CanBaudRate;typedef structunsigned 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 structunsigned char node_num;unsigned char oper_mode; CanDevMode;其中,node_num意义同上,oper_mode表示该节点的工作模式,MCP2515共有五种工作模式分别是:配置模式、休眠模式、仅监听模式、回环模式和正常模式,一般设备都工作在正常模式。3.1.3 环形数据接收缓冲区结构体typedef struct CanFrame can_recv_bufRECV_BUF_SIZE;int recv_pos;int read_pos;wait_queue_head_t wq; CanDev;其中,can_recv_buf为接收CAN报文帧环形数据缓冲区,recv_pos和read_pos分别表示数据存入和读出缓冲区的位置。wq定义的是一个等待队列,用于实现阻塞型read操作。3.2 驱动程序接口驱动程序的接口主要分为3个部分:(1)初始化与退出函数接口,完成设备安装和卸载等操作;(2)文件系统接口,由file_operations数据结构来完成;(3)与设备的接口,完成对设备的读写等操作。 3.2.1 初始化与退出函数在安装驱动程序时,操作系统会调用初始化函数进行设备注册、设备初始化以及安装中断处理例程等操作。参考文献3详细论述了设备注册的方法,而在这个部分我们主要讨论设备初始化时的配置方法。在本驱动程序中设备初始化分两步,一是对9200的SPI控制器初始化,二是对5个MCP2515初始化。9200 SPI控制器的初始化配置方式是: 将相应的I/O口线配置给SPI控制器,使能SPI控制器时钟; 配置SPI模式寄存器(SPI_MR),使SPI控制器工作在主机模式,固定外设选择,片选译码使能,SPI时钟为MCK,片选延迟为6个MCK周期; 配置SPI片选寄存器(SPI_CSR0SPI_CSR3),配置方式为:SPI 为0,0模式(CPOL=0,NCPHA=1)或1,1模式(CPOL1,NCPHA=0),传输位为8位,SPCK波特率为10MHz(SCBR=3),SPCK前延迟为5个MCK周期,连续传输间延迟为0; 配置SPI控制寄存器(SPI_CR),使能SPI。MCK是系统主时钟,它是9200处理器时钟的3倍分频,MCK60MHz。MCP2515的初始化配置方式是: 向MCP2515发送复位指令; 配置默认的CAN总线波特率; 配置默认的报文滤波方式为无报文滤波并接收所有的报文; 使MCP2515进入回环模式。5个MCP2515在初始化函数中都要进行初始化配置。接下来是在初始化函数中安装中断处理例程。根据硬件设计,一共需要安装三个中断处理例程以对应三个外部中断IRQ0、IRQ1和IRQ2。需要注意的是,申请的中断号就是外部中断的外设ID。我们在3.2.2节将对这三个中断处理例程进行分析。在卸载设备驱动程序时会调用退出函数,退出函数主要完成设备的注销和中断释放。参考文献3详细论述了中断处理例程的安装、设备注销和中断释放的方法,在此不再详述。3.2.2 中断接收服务例程MCP2515收到CAN报文帧后,产生中断并将引脚置低。9200响应外部中断,并调用和外部中断相对应的中断处理例程。我们一共有三个中断处理例程,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的中断处理流程如图5所示。IRQ1的中断处理流程如图6所示。IRQ2和IRQ1的中断处理流程相同。图5 IRQ0的中断处理流程需要注意的是在图5的处理流程中并没有清中断操作,这是因为我们采用RX读缓冲区指令读取MCP2515 RX缓冲区中的数据,该指令操作结束后,MCP2515会自动清除相应的接收中断标志位。图6 IRQ1的中断处理流程3.2.3 文件系统接口定义文件系统接口struct file_operations的成员全都是函数指针,这些指针指出了设备驱动程序所提供的入口点位置,对于程序员来说,编写驱动程序的任务之一就是实现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 open和release函数上层的应用程序要对设备进行操作之前,必须先调用open函数打开设备。为了避免资源竞争,驱动程序只允许一个进程调用open函数打开设备并对设备进行操作。在open函数中完成的操作是:初始化环形数据缓冲区,初始化等待队列。由于同时只能有一个进程打开设备,因此当该进程调用close函数关闭设备后,内核就会调用release函数关闭设备。release函数完成的操作是:禁用所有处于活动状态的节点的内部中断,将节点工作模式设置为回环模式,同时将活动节点对应的外部中断禁用,最后将活动节点的状态设置为非活动状态。需要说明的是,在驱动程序中用一个全局静态数组node_status5来维护各个节点的状态(ACTIVE和INACTIVE),状态为ACTIVE的活动节点表示该节点已经接入了CAN总线,可正常工作。3.2.5 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.6 read函数上层的应用程序通过调用read函数来读取存储在内核空间环形缓冲区中的CAN报文帧数据。通过比较recv_pos和read_pos的值来判断接收缓冲区中是否有数据。当在接收缓冲区中没有数据时,如果进程是以普通读写的方式打开该设备,则要调用interruptible_sleep_on函数使进程休眠,直到中断发生后再唤醒进程继续进行读缓冲区操作,这样便实现了阻塞型读操作。如果在打开设备时加入了O_NONBLOCK标志,则在无数据可读时直接返回。当接收缓冲区中有数据时,则通过copy_to_user函数将缓冲区中的数据从内核空间拷贝到用户空间,并更新read_pos。3.2.7 write函数上层的应用程序通过调用write函数向设备写入数据,即通过某个MCP2515节点发送CAN报文帧。在驱动程序中并没有实现发送缓冲区,MCP2515本身具有三个发送缓冲器,我们可以利用它自身的发送缓冲器来构造环形缓冲区,用全局静态数组TXB_curr_num5来维护每个节点的当前发送缓冲器编号(TXB0、TXB1或TXB2)。通过copy_from_user函数将要发送的报文帧数据从用户空间拷贝到内核空间,然后再根据发送节点的当前发送缓冲器编号将数据写入节点的发送缓冲器中,并使能节点开始发送数据。发送完毕后要对该节点的当前发送缓冲器编号进行更新。3.2.8 关于竞争问题我们的系统是单CPU系统,并采用Linux 2.4.19内核,它是非抢占的。同时,我
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年咏柳教案目标
- 2025-2026学年信息技术英语课教学设计
- 2025-2026学年人教版《咏柳》教学设计
- 2025-2026学年椭圆世界教学设计
- 门诊护理人员培训计划2篇
- 自动喷水灭火系统安装工程施工方案及技术措施
- 2026年4月中级经济师资格考试工商管理专业知识与实务试题与答案
- 跆拳道馆灯光系统施工方案及技术措施
- 智慧灯杆转速传感器安装施工方案及技术措施
- 企业员工组织公平感对建言行为影响追踪与中介分析
- 2026年河北省中考物理试卷(含答案及解析)
- 2026届贵州省遵义市凤冈县四年级数学下学期期末综合测试试题含解析
- 2026广东深圳市公安局第十四批招聘警务辅助人员考试参考题库及答案详解
- 2026天津市面向甘南籍未就业高校毕业生招聘事业单位40人笔试参考题库及答案详解
- 2026年小学心理专题活动设计方案
- 肩袖损伤规范化诊治临床指南 (2026 版)
- 中国咽炎防治指南2025版
- 2026年省级行业企业职业技能竞赛(家畜(猪)繁殖员)练习题及答案
- 2026年湖北省孝感市幼儿园教师招聘笔试参考题库及答案解析
- 胫腓骨骨折手术后功能锻炼指南
- 产业园消防安全管理制度
评论
0/150
提交评论