首页 > 范文大全 > 正文

Linux下基于MCP2515的CAN总线驱动程序设计

开篇:润墨网以专业的文秘视角,为您筛选了一篇Linux下基于MCP2515的CAN总线驱动程序设计范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:本论文以Samsung公司的S3C2440处理器与CAN总线控制器MCP2515作为开发实例,简单介绍了嵌入式linux操作系统下的基于mcp2515can总线驱动程序的设计方法。并结合飞凌公司的OK2440开发板作为开发平台,设计并完成了基于Linux 2.6.12内核的MCP2515驱动程序的开发。

关键词:MCP2515 嵌入式Linux 驱动 CAN

中图分类号:TP336 文献标识码:A 文章编号:1007-9416(2016)04-0000-00

1系统硬件结构介绍

本系统的硬件平台主要由OK2440开发板、基于MCP2515的CAN总线通信模块和以STC89C52为控制器的CAN节点模块组成。CAN通信模块用来完成OK2440开发板和STC89C52控制的节点模块之间的数据传输。

1.1 MCP2515功能简介

MCP2515是一款独立的CAN总线控制器,完全支持CAN V2.0B 技术规范。MCP2515 拥有六个验收滤波寄存器和两个验收屏蔽寄存器,通过它们可以过滤掉总线上不需要的报文,从而减少MCU关于处理CAN总线上无用数据的开销。MCP2515与MCU 的连接是通过业界标准串行外设接口来实现的。

1.2 TJA1050功能简介

TJA1050 是介于CAN控制器和物理总线之间的一种符合ISO 11898标准的高速CAN收发器。其最高速率可达1Mbit/s,而且它的电磁抗干扰EMI性极高,至少可以连接110个节点。在实际电路中,可为物理总线提供差动发送和为CAN控制器提供差动接收。

2 MCP2515相关驱动程序设计

2.1 Linux设备驱动简介

在Linux系统中,由于对硬件的操作必须处在特权模式下,在用户工作模式下,程序一般不能直接和硬件进行通信。因此,设备驱动程序则承担了用户模式下硬件和用户应用程序之间的通信工作,同时它还为应用程序和内核中其他的部分访问这些设备提供了程序接口。大多数设备驱动程序可以在系统工作时,以动态方式进行加载,在不需要的时候又可以将其卸载掉。

2.2 MCP2515驱动程序设计

2.2.1 MCP2515驱动初始化函数

在MCP2515的驱动初始化函数中首先通过s3c2440_spi_ioremap()函数将S3C2440上的SPI寄存器的物理地址映射到内核空间,这样才可以在驱动程序中访问和配置S3C2440的SPI寄存器。在正确的配置S3C2410的SPI寄存器后,通过s3c2440_spi_init()来完成对S3C2440相关寄存器的赋值。然后通过s3c2440_irq_init()函数来完成中断方面相关的设置。MCP2515_init()和MCP2515_dev_init()两个函数主要是针对于MCP2515控制器进行相关的配置和为MCP2515设备驱动程序申请和初始化内存空间。最后通过MCP2515 _cdev_register(Device0)函数完成MCP2515在内核中的注册。

2.2.2 MCP2515相关中断函数的注册

在CAN总线驱动程序中,CAN通信模块接收和发送数据必须以中断的方式与系统内核之间进行数据的交换,所以在MCP2515的驱动程序中必须用到内核中的相关中断函数。对于MCP2515的中断注册函数request_irq(),如果此中断注册函数返回值为0则表示中断注册成功,返回负数则表示注册失败。

2.2.3 MCP2515的文件操作函数

MCP2515_fops中定义了很多与设备有关的操作函数,内核可以通来它来访问与MCP2515操作有关的函数。在MCP2515的文件操作函数中,read()和write()两个函数是用来完成读写CAN总线上数据的功能的,通过传递不同的参数给驱动程序中的read()和write(),我们可以读取和写入相应的数据。驱动中的CAN总线读函数read()是整个驱动程序设计的难点,其中在函数的设计中采用了Linux内核阻塞机制。read()读取完CAN总线上的数据后,通过验收滤波寄存器和屏蔽滤波寄存器来决定总线上的数据帧是否存入到总线控制器相应的接收缓冲寄存器里。

2.2.4 MCP2515的卸载函数

当我们不需要继续使用某个设备时,我们可以将这个设备从内核中卸载掉。在设备的卸载过程中,必须将其内核中所对应的设备号释放掉。在模块的卸载函数中,我们通过调用int unregister_chrdev_region(unsigned int major,const char *name)函数来完成设备驱动的卸载。此函数的两个参数分别对应设备文件的主设备号和设备名。在卸载模块时,Linux内核会把设备名与内核中已注册的设备名称进行对比,如果两者相等,则完成设备的卸载,反之则卸载失败。MCP2515的驱动卸载函数主要是完成MCP2515驱动在内核中所占用的中断的释放和MCP2515在内核中的注销。

3 结语

本文重点讨论了S3C2440中MCP2515的驱动程序设计方法,并详细介绍了Linux系统下如何开发MCP2515的驱动程序的方法。实验结果表明,本文所设计的Linux下MCP2515驱动程序可以在OK2440开发板上正常运行,基本可以完成CAN总线上数据的正常发送与接收,测试结果符合论文的要求。本文提到的基于Linux下MCP2515驱动程序的开发,对其他Linux驱动程序的开发具有一定的启示作用。

参考文献

[1]宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社,2008.

[2]杨庆华,张景元.单片机和MCP2515的CAN总线通信模块设计[J].单片机与嵌入式系统应用,2007.

[3]刘淼.嵌入式系统接口设计与Linux驱动程序开发[M].北京:北京航空航天大学出版社,2006.

收稿日期:2016-03-04

作者简介:张才军(1990―),男,汉族,湖北武穴人,硕士研究生,研究方向:嵌入式系统与应用 。