最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Linux系统下CAN 总线通信的设计及实现

IT圈 admin 18浏览 0评论

2024年3月17日发(作者:马星爵)

Linux系统下CAN总线通信的设计及实现

冯军,王耀南,刘宏立

(湖南大学 电气与信息工程学院,湖南 长沙410082)

项目颁发部门:国家自然科学基金委

项目名称 :大规模环境下移动机器人自主探索与高精度地图创建模式

项目编号:60775047

项目申请人: 王耀南

摘要:本设计为光电稳定跟踪平台开发CAN驱动,以实现CAN总线上设备间的通信。分析了

linux下标准设备驱动机制和CAN总线通信模型,给出了光电稳定跟踪平台中CAN总线通信的

硬件设计,实现了带SPI接口的CAN控制器MCP2510的驱动。

关键词: Linux;CAN总线;光电稳定跟踪平台;设备驱动;SPI接口

中图法分类号:TP316. 2 文献标识码:A

Design and Implementation of CAN Driver in linux

Feng Jun,Wang Yao-nan ,LIU Hong-li

College of Electrical and Information Engineering

Hunan University

Changsha Hunan 410082

China

Abstract: CAN driver is implemented for optical-electronic stabilization and tracking platform, to

advance the communication between devices on CAN bus. The mechanism of standard device driver

and the model of CAN bus communication in Linux was analyzed firstly. Then the hardware design for

CAN bus communication was presented in optical-electronic stabilization and tracking platform. Lastly,

the driver for CAN controller MCP2510 with SPI was implemented.

Key words:Linux; CAN bus; O-E stabilization and tracking platform; device driver; serial peripheral

interface

0.引言

控制器局部网(CAN-CONTROLLER AREA NETWORK)是BOSCH公司为现代汽车应用领先推出的

一种多主机局部网,以其卓越性能现已广泛应用于工业自动化、多种控制设备、交通工具、医疗

仪器以及建筑、环境控制等众多部门。Linux是由LinusBenedictTorvalds和许多自由软件开发

者,通过Internet共同努力而形成的一种能运行于多种硬件平台之上,源代码公开、功能强大、

运行稳定高效、遵守POSIX标准、与UNIX兼容的免费操作系统。本设计为光电稳定跟踪平台CAN

总线通信模块设计基于linux的CAN驱动程序,使linux支持现场总线通信。

1 .linux下CAN总线通信模型

1.1 linux标准设备驱动机制

设备驱动程序是内核的一部分,是操作系统内核和机器硬件之间的接口,它由一组函数和一些私

有数据组成,是连接应用程序与具体硬件的桥梁。Linux的一个基本特点是它对硬件设备的管理抽象

化,系统中的每一个设备都用一个特殊的文件来表示。所有的硬件设备都像普通的文件一样看待,使

用与操作系统相同的标准系统来进行打开、读写和关闭。这就必须定义核心数据结构file

operations,

file_operations定义如下:

struct file_operations{ int( * lseek) ( struct inode * , struct file * , off_t , int) ; int( *release) ( struct inode * , struct file * ) ;

int( * read) ( struct inode * , struct file * , char * , int) ; int( * fsync) ( struct inode *, struct file * ) ;

int( *write) ( struct inode * , struct file * , const char *, int) ; int( * fasync) ( struct inode * , struct file *, int) ;

int( * readdir) ( struct inode , struct file , void * , dilldir) ; int( *check_media_change) ( kdev_t dev) ;

PDF 文件使用 "pdfFactory Pro" 试用版本创建

int(*select) ( struct inode *, struct file * , int, select_table * ) ; int( * revalidate) ( kdev_t dev) ;

int ( * ioctl) ( struct inode * , struct file *, unsigned int, unsigned long) ; int( * open) ( struct inode *, struct file *) ;

int( *mmap) ( struct inode * , struct file * , struct vm_area_struct * ) ; }

在这些函数指针中, open、release用于设备的打开和关闭,是每个驱动程序都要实现的函数,其它

函数根据实际设备的作用不同而实现相应的函数。这些操作函数将被注册到内核。当应用程序对该

设备相应的设备文件进行操作时,内核会找到相应的操作函数并进行调用。

1.2 CAN总线通信模型

本设计正是将CAN驱动当作Linux下一标准的设备驱动,利用I/O系统标准接口的来使用CAN

驱动程序,如图1所示。

由以上分析知:在核心数据基础上,系统只是简单地将用户应用程序中基本I/O函数调用引导

给正确的驱动程序完成,所有的处理逻辑都设计在驱动程序中去完成,所以针对具体的开发

平台和具体的CAN控制器,实现CAN总线通信的主要任务是底层硬件设计和CAN控制器的驱动程

序开发。

应用层

应用函数open,close,ioctl等

驱动层

硬件层

canopen,canclose,canioctl等

核心数据结构file_operations

图1 CAN层次关系 图2 CAN总线通信物理连接

2 . CAN总线通信硬件设计

本设计中,光电稳定跟踪平台采用ATMEL公司的AT91RM9200嵌入式微处理器和MICROCHIP的

MCP2510来实现CAN总线通信,整个电路的示意框图如图2所示。

AT91RM9200处理器是ARM920T内核的16/32位RISC CPU,带有外围接口SPI,提供一条与外

设交互的同步串行数据链路。SPI对外提供两条数据线和两条控制线:MOSI(Master Out Slave In),

MISO(Master In Slave Out),SPCK(Serial Clock),NSS(Slave Select)。

MCP2510是一款带SPI接口的独立CAN控制器,完全支持CAN总线V2.0A和V2.0B技术规范,

其主要功能参数有:(1)0-8字节报文长度;(2)标准和扩展数据帧;(3)可编程位速率达1Mb/s;

(3)支持远程帧;(4)两个接收缓冲区,可优先存储报文;(5)六个完全验收滤波器;(6)两个

完全验收屏蔽滤波器;(7)三个发送缓冲器,具有优先级设定及发送中止功能;(8)用于自检模

式的环回模式。

CAN控制器收到数据后通过MCP2510中断脚通知CPU,CPU对接收的数据做相应处理。本设计

中MCP2510中断输出脚连接到AT91RM9200的PIO (Parallel I/O Controller),将相应PIO设

置成“输入变化中断”功能。当MCP2510产生数据接收中断时,中断输出引脚上的电平变化被PIO

相应引脚检测到,通知CPU准备接收数据。

CAN收发器(transceiver)82C251的主要作用是收发CAN总线上的信号: 一方面将总线信号

转换为CAN控制器所需的信号;另一方面,将CAN控制器的输出信号转化为CAN总线信号。

3 .linux下CAN驱动实现

3.1 主要数据结构

(1)

CAN设备file_operations结构

PDF 文件使用 "pdfFactory Pro" 试用版本创建

static struct file_operations candev_fops = {

};

(2)CAN数据帧结构

owner:

read:

write:

ioctl:

open:

THIS_MODULE,

no_llseek,

canread,

canwrite,

canioctl,

canopen,

llseek:

release: canclose,

(3)DMA数据传输链表结构

(4)SPI状态结构

3.2驱动程序实现

(1) CanOpen()返回一个指向CAN设备的指针,主要完成CAN控制器MCP2510的初始化工作:

CPU 与MCP2510之间是通过SPI接口以指令方式完成交互的,主要包括复位指令、读指令、写指

令、请求发送指令、状态读指令、位修改指令。CPU借助SPI接口通过复位指令使MCP2510完成

复位动作,之后通过写MCP2510控制器存器使之进入配置模式下,在配置模式下完成位定时配置

寄存器的设置(包括波特率设置)、验收滤波器和验收滤波器屏蔽寄存器清零等,配置完成后回到

正常工作模式下。此外,还要完成AT91RM9200 SPI接口的初始化:通过SPI 片选寄存器(SPI_CSR)

进行片选和传输过程相关时延的配置,通过SPI模式寄存器选择SPI主模式,通过SPI 外设DMA

控制器DMA进行初始化,通过中断控制器对CAN控制器中断类型及中断优先级进行设,并调用

intConnect()函数挂载中断服务程序。

(2) CanWrite()和CanRead()应用程序通过I/O系统标准接口open()打开CAN设备后,

会返回一文件描述符fd,read()和write()函数通过fd找到相应的设备描述符,然后找到驱

动程序表,并调用其中的函数,即CanWrite()和CanRead()。

PDF 文件使用 "pdfFactory Pro" 试用版本创建

MCP2510按照CAN2.0B技术规范所定义的标准数据帧、扩展数据帧及远程帧数据格式发送和

接收数据。本设计中采用的是标准数据帧格式。数据帧仲裁字段和数据字段首先存入缓存区,再

通过MCP2510 SPI接口的写命令写入MCP2510寄存器中,并使能相应的发送缓冲器发送数据;

MCP2510产生数据接收中断后被PIO检测到,使CPU产生CAN数据接收中断,中断服务程序

CanRcvInt()通过MCP2510的 SPI接口的读命令读出MCP2510数据接收寄存器的内容, 交给任

务级处理函数对数据进行处理。数据传输由SPI的PDC(Peripheral DMA Controller)实现,当

CPU写PDC数据发送寄存器前,用cachFlush()刷新高速缓存以保证数据一致,当CPU读DMA

上的数据接收寄存器后,用cacheInvalidate()屏蔽高速缓存,保证DMA内存中的数据与高速

缓存中的数据一致。

(3)CanIoctl()根据用户的I/O请求控制CAN设备的操作,主要包括: CAN报文帧数据

格式选择、波特率设置、接收/发送缓冲器选择、CAN状态寄存器的读取、位修改指令的执行及状

态读指令的执行和状态显示。

4. 结论

本设计实现了Linux下CAN总线通信的稳定性,数据接收和发送正常,无错误和丢失现象。

在光电稳定跟踪平台上实现基于Linux的CAN总线通信,高效的实现了工业控制过程中主从设备

间的数据交互。

参考文献:

[1]周立功, 陈明记, 陈渝. ARM嵌入式linux系统构建与驱动开发[M]. 北京:北京航空航天大学出

版社 2006年1月第1版 384页

[2]魏忠,蔡勇,雷红卫.嵌入式开发详解[M].北京:电子工业出版社,2003.

[3]毛德操,胡希明.Linux内核源代码情景分析[M].杭州:浙江大学出版社,2001

[4]王飞雪,王平, 谢昊飞 .IEEE1588时间同步协议在linux下的分析与实现[J] .微计算机信息,

2006,12-2;283-285

[5]ATMAL. Data sheet of ARM920T-based Microcontroller AT91RM9200 [EB/OL]. 2006.

.

[6]MICROCHIP. Data sheet of MCP2510 [EB/OL]. 1999. hip. com.

作者 冯军 (1979-),男,湖南人,湖南大学硕士研究生,研究方向: 嵌入式系统及应用

导师 刘宏立(1963-),男,湖南常德人,博士,湖南大学教授 ,研究方向:现代网络与通信

技术 ,嵌入式系统及应用

About the author: Feng Jun (1979- ), Male, Hengyang of Hunan,the master of Hunan University,

major in Modern Network and Communication Technology.

About the tutor:Liu Hongli (1963-),Male, ChangDe of Hunan,PHD, Professor of Hunan

University, major in Modern Network and Communication Technology.

本文作者创新点:在嵌入式linux系统下,采用高性能微处理器芯片AT91RM9200 ,使CAN总

线通信更稳定更高效。

本项目主要用于的军工光电稳定跟踪平台,有比较好的市场前景,预期效益300万/年,

本项目研究方法为实践研究。

联系人:冯军 E-mail :speedfjkang@

通信地址:湖南大学14舍217室 邮编:410082

PDF 文件使用 "pdfFactory Pro" 试用版本创建

2024年3月17日发(作者:马星爵)

Linux系统下CAN总线通信的设计及实现

冯军,王耀南,刘宏立

(湖南大学 电气与信息工程学院,湖南 长沙410082)

项目颁发部门:国家自然科学基金委

项目名称 :大规模环境下移动机器人自主探索与高精度地图创建模式

项目编号:60775047

项目申请人: 王耀南

摘要:本设计为光电稳定跟踪平台开发CAN驱动,以实现CAN总线上设备间的通信。分析了

linux下标准设备驱动机制和CAN总线通信模型,给出了光电稳定跟踪平台中CAN总线通信的

硬件设计,实现了带SPI接口的CAN控制器MCP2510的驱动。

关键词: Linux;CAN总线;光电稳定跟踪平台;设备驱动;SPI接口

中图法分类号:TP316. 2 文献标识码:A

Design and Implementation of CAN Driver in linux

Feng Jun,Wang Yao-nan ,LIU Hong-li

College of Electrical and Information Engineering

Hunan University

Changsha Hunan 410082

China

Abstract: CAN driver is implemented for optical-electronic stabilization and tracking platform, to

advance the communication between devices on CAN bus. The mechanism of standard device driver

and the model of CAN bus communication in Linux was analyzed firstly. Then the hardware design for

CAN bus communication was presented in optical-electronic stabilization and tracking platform. Lastly,

the driver for CAN controller MCP2510 with SPI was implemented.

Key words:Linux; CAN bus; O-E stabilization and tracking platform; device driver; serial peripheral

interface

0.引言

控制器局部网(CAN-CONTROLLER AREA NETWORK)是BOSCH公司为现代汽车应用领先推出的

一种多主机局部网,以其卓越性能现已广泛应用于工业自动化、多种控制设备、交通工具、医疗

仪器以及建筑、环境控制等众多部门。Linux是由LinusBenedictTorvalds和许多自由软件开发

者,通过Internet共同努力而形成的一种能运行于多种硬件平台之上,源代码公开、功能强大、

运行稳定高效、遵守POSIX标准、与UNIX兼容的免费操作系统。本设计为光电稳定跟踪平台CAN

总线通信模块设计基于linux的CAN驱动程序,使linux支持现场总线通信。

1 .linux下CAN总线通信模型

1.1 linux标准设备驱动机制

设备驱动程序是内核的一部分,是操作系统内核和机器硬件之间的接口,它由一组函数和一些私

有数据组成,是连接应用程序与具体硬件的桥梁。Linux的一个基本特点是它对硬件设备的管理抽象

化,系统中的每一个设备都用一个特殊的文件来表示。所有的硬件设备都像普通的文件一样看待,使

用与操作系统相同的标准系统来进行打开、读写和关闭。这就必须定义核心数据结构file

operations,

file_operations定义如下:

struct file_operations{ int( * lseek) ( struct inode * , struct file * , off_t , int) ; int( *release) ( struct inode * , struct file * ) ;

int( * read) ( struct inode * , struct file * , char * , int) ; int( * fsync) ( struct inode *, struct file * ) ;

int( *write) ( struct inode * , struct file * , const char *, int) ; int( * fasync) ( struct inode * , struct file *, int) ;

int( * readdir) ( struct inode , struct file , void * , dilldir) ; int( *check_media_change) ( kdev_t dev) ;

PDF 文件使用 "pdfFactory Pro" 试用版本创建

int(*select) ( struct inode *, struct file * , int, select_table * ) ; int( * revalidate) ( kdev_t dev) ;

int ( * ioctl) ( struct inode * , struct file *, unsigned int, unsigned long) ; int( * open) ( struct inode *, struct file *) ;

int( *mmap) ( struct inode * , struct file * , struct vm_area_struct * ) ; }

在这些函数指针中, open、release用于设备的打开和关闭,是每个驱动程序都要实现的函数,其它

函数根据实际设备的作用不同而实现相应的函数。这些操作函数将被注册到内核。当应用程序对该

设备相应的设备文件进行操作时,内核会找到相应的操作函数并进行调用。

1.2 CAN总线通信模型

本设计正是将CAN驱动当作Linux下一标准的设备驱动,利用I/O系统标准接口的来使用CAN

驱动程序,如图1所示。

由以上分析知:在核心数据基础上,系统只是简单地将用户应用程序中基本I/O函数调用引导

给正确的驱动程序完成,所有的处理逻辑都设计在驱动程序中去完成,所以针对具体的开发

平台和具体的CAN控制器,实现CAN总线通信的主要任务是底层硬件设计和CAN控制器的驱动程

序开发。

应用层

应用函数open,close,ioctl等

驱动层

硬件层

canopen,canclose,canioctl等

核心数据结构file_operations

图1 CAN层次关系 图2 CAN总线通信物理连接

2 . CAN总线通信硬件设计

本设计中,光电稳定跟踪平台采用ATMEL公司的AT91RM9200嵌入式微处理器和MICROCHIP的

MCP2510来实现CAN总线通信,整个电路的示意框图如图2所示。

AT91RM9200处理器是ARM920T内核的16/32位RISC CPU,带有外围接口SPI,提供一条与外

设交互的同步串行数据链路。SPI对外提供两条数据线和两条控制线:MOSI(Master Out Slave In),

MISO(Master In Slave Out),SPCK(Serial Clock),NSS(Slave Select)。

MCP2510是一款带SPI接口的独立CAN控制器,完全支持CAN总线V2.0A和V2.0B技术规范,

其主要功能参数有:(1)0-8字节报文长度;(2)标准和扩展数据帧;(3)可编程位速率达1Mb/s;

(3)支持远程帧;(4)两个接收缓冲区,可优先存储报文;(5)六个完全验收滤波器;(6)两个

完全验收屏蔽滤波器;(7)三个发送缓冲器,具有优先级设定及发送中止功能;(8)用于自检模

式的环回模式。

CAN控制器收到数据后通过MCP2510中断脚通知CPU,CPU对接收的数据做相应处理。本设计

中MCP2510中断输出脚连接到AT91RM9200的PIO (Parallel I/O Controller),将相应PIO设

置成“输入变化中断”功能。当MCP2510产生数据接收中断时,中断输出引脚上的电平变化被PIO

相应引脚检测到,通知CPU准备接收数据。

CAN收发器(transceiver)82C251的主要作用是收发CAN总线上的信号: 一方面将总线信号

转换为CAN控制器所需的信号;另一方面,将CAN控制器的输出信号转化为CAN总线信号。

3 .linux下CAN驱动实现

3.1 主要数据结构

(1)

CAN设备file_operations结构

PDF 文件使用 "pdfFactory Pro" 试用版本创建

static struct file_operations candev_fops = {

};

(2)CAN数据帧结构

owner:

read:

write:

ioctl:

open:

THIS_MODULE,

no_llseek,

canread,

canwrite,

canioctl,

canopen,

llseek:

release: canclose,

(3)DMA数据传输链表结构

(4)SPI状态结构

3.2驱动程序实现

(1) CanOpen()返回一个指向CAN设备的指针,主要完成CAN控制器MCP2510的初始化工作:

CPU 与MCP2510之间是通过SPI接口以指令方式完成交互的,主要包括复位指令、读指令、写指

令、请求发送指令、状态读指令、位修改指令。CPU借助SPI接口通过复位指令使MCP2510完成

复位动作,之后通过写MCP2510控制器存器使之进入配置模式下,在配置模式下完成位定时配置

寄存器的设置(包括波特率设置)、验收滤波器和验收滤波器屏蔽寄存器清零等,配置完成后回到

正常工作模式下。此外,还要完成AT91RM9200 SPI接口的初始化:通过SPI 片选寄存器(SPI_CSR)

进行片选和传输过程相关时延的配置,通过SPI模式寄存器选择SPI主模式,通过SPI 外设DMA

控制器DMA进行初始化,通过中断控制器对CAN控制器中断类型及中断优先级进行设,并调用

intConnect()函数挂载中断服务程序。

(2) CanWrite()和CanRead()应用程序通过I/O系统标准接口open()打开CAN设备后,

会返回一文件描述符fd,read()和write()函数通过fd找到相应的设备描述符,然后找到驱

动程序表,并调用其中的函数,即CanWrite()和CanRead()。

PDF 文件使用 "pdfFactory Pro" 试用版本创建

MCP2510按照CAN2.0B技术规范所定义的标准数据帧、扩展数据帧及远程帧数据格式发送和

接收数据。本设计中采用的是标准数据帧格式。数据帧仲裁字段和数据字段首先存入缓存区,再

通过MCP2510 SPI接口的写命令写入MCP2510寄存器中,并使能相应的发送缓冲器发送数据;

MCP2510产生数据接收中断后被PIO检测到,使CPU产生CAN数据接收中断,中断服务程序

CanRcvInt()通过MCP2510的 SPI接口的读命令读出MCP2510数据接收寄存器的内容, 交给任

务级处理函数对数据进行处理。数据传输由SPI的PDC(Peripheral DMA Controller)实现,当

CPU写PDC数据发送寄存器前,用cachFlush()刷新高速缓存以保证数据一致,当CPU读DMA

上的数据接收寄存器后,用cacheInvalidate()屏蔽高速缓存,保证DMA内存中的数据与高速

缓存中的数据一致。

(3)CanIoctl()根据用户的I/O请求控制CAN设备的操作,主要包括: CAN报文帧数据

格式选择、波特率设置、接收/发送缓冲器选择、CAN状态寄存器的读取、位修改指令的执行及状

态读指令的执行和状态显示。

4. 结论

本设计实现了Linux下CAN总线通信的稳定性,数据接收和发送正常,无错误和丢失现象。

在光电稳定跟踪平台上实现基于Linux的CAN总线通信,高效的实现了工业控制过程中主从设备

间的数据交互。

参考文献:

[1]周立功, 陈明记, 陈渝. ARM嵌入式linux系统构建与驱动开发[M]. 北京:北京航空航天大学出

版社 2006年1月第1版 384页

[2]魏忠,蔡勇,雷红卫.嵌入式开发详解[M].北京:电子工业出版社,2003.

[3]毛德操,胡希明.Linux内核源代码情景分析[M].杭州:浙江大学出版社,2001

[4]王飞雪,王平, 谢昊飞 .IEEE1588时间同步协议在linux下的分析与实现[J] .微计算机信息,

2006,12-2;283-285

[5]ATMAL. Data sheet of ARM920T-based Microcontroller AT91RM9200 [EB/OL]. 2006.

.

[6]MICROCHIP. Data sheet of MCP2510 [EB/OL]. 1999. hip. com.

作者 冯军 (1979-),男,湖南人,湖南大学硕士研究生,研究方向: 嵌入式系统及应用

导师 刘宏立(1963-),男,湖南常德人,博士,湖南大学教授 ,研究方向:现代网络与通信

技术 ,嵌入式系统及应用

About the author: Feng Jun (1979- ), Male, Hengyang of Hunan,the master of Hunan University,

major in Modern Network and Communication Technology.

About the tutor:Liu Hongli (1963-),Male, ChangDe of Hunan,PHD, Professor of Hunan

University, major in Modern Network and Communication Technology.

本文作者创新点:在嵌入式linux系统下,采用高性能微处理器芯片AT91RM9200 ,使CAN总

线通信更稳定更高效。

本项目主要用于的军工光电稳定跟踪平台,有比较好的市场前景,预期效益300万/年,

本项目研究方法为实践研究。

联系人:冯军 E-mail :speedfjkang@

通信地址:湖南大学14舍217室 邮编:410082

PDF 文件使用 "pdfFactory Pro" 试用版本创建

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论