can在linux?can编程
这篇文章给大家聊聊关于can在linux,以及can编程对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
linux can 怎么设置波特率
CAN位时间特性寄存器(CAN_BTR)
地址偏移量: 0x1C
复位值: 0x0123 0000
注:当CAN处于初始化模式时,该寄存器只能由软件访问。
图2
位31 SILM:静默模式(用于调试)
0:正常状态;
1:静默模式。
位30 LBKM:环回模式(用于调试)
0:禁止环回模式;
1:允许环回模式。
位29:26保留位,硬件强制为0。
位25:24 SJW[1:0]:重新同步跳跃宽度
为了重新同步,该位域定义了CAN硬件在每位中可以延长或缩短多少个时间单元的上限。
tRJW= tCAN x(SJW[1:0]+ 1)。
位23保留位,硬件强制为0。
位22:20 TS2[2:0]:时间段2
该位域定义了时间段2占用了多少个时间单元
tBS2= tCAN x(TS2[2:0]+ 1)。
位19:16 TS1[3:0]:时间段1
该位域定义了时间段1占用了多少个时间单元
tBS1= tCAN x(TS1[3:0]+ 1)
位15:10保留位,硬件强制其值为0。
位9:0 BRP[9:0]:波特率分频器
该位域定义了时间单元(tq)的时间长度
tq=(BRP[9:0]+1) x tPCLK
3如何在代码中配置波特率
配置波特率是在CAN模块初始化时配置,代码示例如下:
//CAN1 register init
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
//CAN cell init
CAN_InitStructure.CAN_TTCM= DISABLE;
CAN_InitStructure.CAN_ABOM= DISABLE;
CAN_InitStructure.CAN_AWUM= DISABLE;
CAN_InitStructure.CAN_NART= DISABLE;
CAN_InitStructure.CAN_RFLM= DISABLE;
CAN_InitStructure.CAN_TXFP= ENABLE;
CAN_InitStructure.CAN_Mode= CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW= CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1= CAN_BS1_6tq;//tBS1=6个tCAN时钟周期
CAN_InitStructure.CAN_BS2= CAN_BS2_8tq;//tBS2=8个tCAN时钟周期
CAN_InitStructure.CAN_Prescaler= 4;//ABP总线时钟时钟4分频
//CANbps= Fpclk/((BRP+1)*((Tseg1+1)+(Tseg2+1)+1)
//所以这里CANbps=30000000/4/(8+6+1))=500k bps
//总体配置方向: Tseg1>=Tseg2 Tseg2>=tq; Tseg2>=2TSJW
if(CAN_Init(CAN1,&CAN_InitStructure)== CANINITFAILED)
{
return _ERROR;
}
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);//打开FMP0中断
总体配置保持tBS1>=tBS2 tBS2>=1个CAN时钟周期 tBS2>=2tSJW
CDlinux里启动提示can't find out where cdlinux is installed
好像是放在隐藏分区里是启动不了的,,给你个解决办法吧,,,这种办法可以解决
1、U盘一个
2、CDlinux光盘镜像一个
3、软碟通软件
4、下载个GRUB4DOS需要里面的两个文件grldr和menu.lst
5、bootice软件
我们就开始了
a、先将你的U盘格式化(FAT格式)
b、用软碟通将CDlinux镜像写入到U盘上写的时候选择USB-HDD+
c、打开GRUB4DOS文件夹找到里面的两个文件grldr和menu.lst复制到U盘根目录
d、打开bootice选择主引导记录。
引导方式选择GRUB4DOS方式(第二个)
然后点击安装配置前三项勾选上禁止搜索软盘上的GRLDR。禁止按C无条件进入命令行控制台。禁止引导分区表无效的原主引导记录。然后点击写入磁盘。
e、用记事本打开menu.lst在里面加入下面这行:
title CDlinux
find--set-root/CDlinux/bzImage
kernel/CDlinux/bzImage CDL_DEV=hd0 CDL_LANG=zh_CN.UTF-8
initrd/CDlinux/initrd
boot
Linux下CAN总线是如何使用的
CAN(Controller Area Network控制器局域网络)是一种工业总线技术,广泛应用于自动控制、嵌入式设备和汽车领域。它由德国BOSCH公司开发,并成为国际标准(ISO 11898-1)。CAN总线是一种串行通信协议,支持高安全等级的分布式实时控制,在汽车电子行业中,用于连接发动机控制单元、传感器、防刹车系统等,传输速度可达1Mbps。
CAN总线的工作原理:节点发送数据时,以报文形式广播给网络中的所有节点。所有节点都不使用节点地址等系统配置信息,只根据每组报文开头的11位标识符解释数据的含义来决定是否接收。这种数据收发方式称为面向内容的编址方案。
当节点要向其他节点发送数据时,该节点的处理器将数据和自己标识符传送给CAN总线接口控制器,并准备发送。当收到总线分配时,转为发送报文状态。数据根据协议组织成一定的报文格式后发出,此时网络上的其他节点处于接收状态。处于接收状态的每个节点对接收到的报文进行检测,判断这些报文是否是发给自己的以确定是否接收。
CAN总线是一种面向内容的编址方案,因此很容易建立高水准的控制系统并灵活地进行配置。我们可以很容易地在CAN总线上增加一些新节点而无须在硬件或软件上进行修改。当提供的新节点是纯数据接收设备时,数据传输协议不要求独立的部分有物理目的地址。此时允许分布过程同步化。也就是说,当总线上的控制器需要测量数据时,数据可由总线上直接获得,而无需每个控制器都有自己独立的传感器。
CAN收发器负责逻辑电平和物理信号之间的转换。将逻辑信号转换成物理信号(差分电平),或者将物理信号转换成逻辑电平。
CAN标准有两个,即IOS11898和IOS11519,两者差分电平特性不同。
CAN总线的有以下三方面特点:可以多主方式工作,网络上的任意节点均可以在任意时刻主动地向网络上的其他节点发送信息,而不分主从,通信方式灵活。网络上的节点(信息)可分成不同的优先级,可以满足不同的实时要求。采用非破坏性位仲裁总线结构机制,当两个节点同时向网络上传送信息时,优先级低的节点主动停止数据发送,而优先级高的节点可不受影响地继续传输数据。
另外不同于传统的网络(比如USB或者以太网),CAN节点与节点之间不会传输大数据块,一帧CAN消息最多传输8字节用户数据,采用短数据包也可以使得系统获得更好的稳定性。CAN总线具有总线仲裁机制,可以组建多主系统。
CAN是一种复杂逻辑的总线结构。从层次上可以将 CAN总线划分为三个不同层次:物理层、传输层和对象层。
物理层定义实际信号的传输方法,包括位的编码和解码、位的定时和同步等内容。传输层是CAN总线协议的核心,负责位的定时及同步、报文分帧、仲裁、应答、错误检测和标定、故障界定。对象层中可以为远程数据请求以及数据传输提供服务,确定由实际要使用的传输层接收哪一个报文,并且为恢复管理和过载通知提供手段。
CAN总线发送节点以广播的形式发送,接收节点以id来判断是否是该节点所需要的数据。CAN总线特点:1,稳定性高、实时性好。2,各个节点都可以收发信号。3,通信速率最高1mb/s。4,集成度较好,拥有屏蔽id、排优先级、完善的报错机制等特点。
CAN总线的报文结构包括数据帧、远程帧、错误帧和过载帧。数据帧携带数据从发送器至接收器,由7个不同的位场组成。远程帧用于请求其他节点发送具有同一标识符的数据帧。错误帧由两个不同的场组成,第一个场是由不同站提供的错误标志的叠加(错误标志),第二个场是错误界定符。过载帧用于在先行的和后续的数据帧(或远程帧)之间提供附加延时。
标准CAN只有11位标识符,每帧的数据长度为51+(0~64)=(51~117)位。扩展CAN具有29位标识符,每帧数据长度为71+(0~64)=(71~135)位。
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为0x123的标准帧。