1.Linux下CAN总线是源码如何使用的?
Linux下CAN总线是如何使用的?
CAN(Controller Area Network 控制器局域网络)是一种工业总线技术,广泛应用于自动控制、源码嵌入式设备和汽车领域。源码它由德国BOSCH公司开发,源码并成为国际标准(ISO -1)。源码CAN总线是源码vitetris 源码分析一种串行通信协议,支持高安全等级的源码分布式实时控制,在汽车电子行业中,源码用于连接发动机控制单元、源码传感器、源码防刹车系统等,源码传输速度可达1Mbps。源码
CAN总线的源码工作原理:节点发送数据时,以报文形式广播给网络中的源码所有节点。所有节点都不使用节点地址等系统配置信息,源码只根据每组报文开头的位标识符解释数据的含义来决定是否接收。这种数据收发方式称为面向内容的编址方案。
当节点要向其他节点发送数据时,源码编辑dll该节点的处理器将数据和自己标识符传送给CAN总线接口控制器,并准备发送。当收到总线分配时,转为发送报文状态。数据根据协议组织成一定的报文格式后发出,此时网络上的其他节点处于接收状态。处于接收状态的每个节点对接收到的报文进行检测,判断这些报文是否是发给自己的以确定是否接收。
CAN总线是一种面向内容的编址方案,因此很容易建立高水准的控制系统并灵活地进行配置。我们可以很容易地在CAN总线上增加一些新节点而无须在硬件或软件上进行修改。当提供的新节点是纯数据接收设备时,数据传输协议不要求独立的部分有物理目的地址。此时允许分布过程同步化。也就是说,当总线上的控制器需要测量数据时,数据可由总线上直接获得,dtc控制源码而无需每个控制器都有自己独立的传感器。
CAN收发器负责逻辑电平和物理信号之间的转换。将逻辑信号转换成物理信号(差分电平),或者将物理信号转换成逻辑电平。
CAN标准有两个,即IOS和IOS,两者差分电平特性不同。
CAN总线的有以下三方面特点:可以多主方式工作,网络上的任意节点均可以在任意时刻主动地向网络上的其他节点发送信息,而不分主从,通信方式灵活。网络上的节点(信息)可分成不同的优先级,可以满足不同的实时要求。采用非破坏性位仲裁总线结构机制,当两个节点同时向网络上传送信息时,优先级低的节点主动停止数据发送,而优先级高的憋七 源码节点可不受影响地继续传输数据。
另外不同于传统的网络(比如USB或者以太网),CAN节点与节点之间不会传输大数据块,一帧CAN消息最多传输8字节用户数据,采用短数据包也可以使得系统获得更好的稳定性。CAN总线具有总线仲裁机制,可以组建多主系统。
CAN是一种复杂逻辑的总线结构。从层次上可以将 CAN 总线划分为三个不同层次:物理层、传输层和对象层。
物理层定义实际信号的传输方法,包括位的编码和解码、位的定时和同步等内容。传输层是CAN总线协议的核心,负责位的定时及同步、报文分帧、仲裁、应答、收录提交源码错误检测和标定、故障界定。对象层中可以为远程数据请求以及数据传输提供服务,确定由实际要使用的传输层接收哪一个报文,并且为恢复管理和过载通知提供手段。
CAN总线发送节点以广播的形式发送,接收节点以id来判断是否是该节点所需要的数据。CAN总线特点:1,稳定性高、实时性好。2,各个节点都可以收发信号。3,通信速率最高1mb/s。4,集成度较好,拥有屏蔽id、排优先级、完善的报错机制等特点。
CAN总线的报文结构包括数据帧、远程帧、错误帧和过载帧。数据帧携带数据从发送器至接收器,由7个不同的位场组成。远程帧用于请求其他节点发送具有同一标识符的数据帧。错误帧由两个不同的场组成,第一个场是由不同站提供的错误标志的叠加(错误标志),第二个场是错误界定符。过载帧用于在先行的和后续的数据帧(或远程帧)之间提供附加延时。
标准CAN只有位标识符,每帧的数据长度为+(0~)=(~)位。扩展CAN具有位标识符,每帧数据长度为+(0~)=(~)位。
Linux操作系统对CAN总线提供良好支持,它为大部分CAN控制器提供了稳定的驱动,而这些驱动都采用的是SocketCAN子系统编写的。SocketCAN是Linux系统为CAN驱动定义的一种网络子系统,使用网络协议栈来实现CAN控制器驱动,并使用了BSD Socket作为编程接口。SocketCAN使用网络协议栈来实现CAN控制器驱动,因此CAN设备驱动成功后会为CAN控制器生成一个网络设备,网络设备采用“can+序号”的形式命名,第一个CAN设备的设备名为can0。
使能和关闭CAN设备:Linux系统启动后,所有的CAN设备默认是关闭状态的,如果要使能CAN设备,使用ifconfig canX up即可。如果要将已使能的CAN设备关闭,需要使用ifconfig canX down命令。
设置CAN波特率:SocketCAN使用/sbin/ip命令来设置CAN总线的bitrate值来配置波特率,配置波特率之前,CAN设备必须处于关闭状态,已使能的设备如需修改波特率则需先关闭,设置波特率命令用法如下:
设置CAN设备为只听模式:SocketCAN使用/sbin/ip命令设置CAN总线listen-only选项来启用CAN的只听模式,CAN总线进入只听模式后,将不再对总线上其他设备CAN报文进行ACK应答,同时该CAN设备也不能发送CAN帧到总线上。
设置CAN设备为回环模式:SocketCAN使用/sbin/ip命令设置CAN总线loopback选项来启用CAN的回环模式,进入回环模式后,经该设备发送的CAN帧会在该设备上回环。
SocketCAN编程:SocketCAN使结构体can_frame来表示CAN帧,它的定义如下:
SocketCAN子系统使用socket套接字来操作CAN设备,基本操作流程与以太网很类似。使用设备前需要调用socket系统调用创建套接字:
当使用SocketCAN时,socket函数参数domain需要设置为PF_CAN,参数type需要设置为SOCK_RAW,protocol可以取以下值,代表不同的传输协议。当不需要的传输协议时可取值为CAN_RAW。
socket套接字创建出来后,需要将套接字绑定到指定的can设备上,这个步骤通过bind系统调用来完成。
对于SocketCAN套接字,bind函数的第二个参数addr要求是struct sockaddr_can类型的变量,并在变量里绑定需要指定的设备,struct sockaddr_can类型定义如下:
其中can_family值需要设为 AF_CAN,can_ifindex需要设置为CAN设备的索引,设备的索引可以通过ioctl的SIOCGIFINDEX来获取,整个打开CAN设备套接字的操作如下所示:
bind函数执行后,CAN设备的套接字也打开完成,接下来就可以接收发送CAN帧了。
发送与接收:SocketCAN的套接字打开后就可以直接调用read/write函数来收发CAN帧,read/wirte函数都通过一个struct can_frame类型的参数用来保存帧数据。发送can帧的代码如下:
write函数发送成功会返回一个CAN帧的长度值,表示帧发送完成;如果发送失败会返回-1。
接收CAN帧的代码如下:
read函数接收成功会返回一个CAN帧的长度值,表示接收到一个完整的帧;如果接收失败会返回-1或者不完整数据包长度。
过滤器:SocketCAN套接字可以使用CAN_RAW_FILTER套接字选项指定的多个过滤规则来过滤接收帧数据。SocketCAN的接收过滤器定义在linux/can.h文件中:
所有满足以下规则的CAN帧才被接收:
&can_mask == can_id &can_mask
要使用接收过滤器前需要先定义好can_filter,然后使用setsockopt函数进行设置,过程如下所示:
以上代码对套接字设置只接收帧ID为0x的标准帧。