首页 > 系统相关 >在Linux上使用CAN

在Linux上使用CAN

时间:2024-05-07 21:24:06浏览次数:29  
标签:-- make Linux 总线 电平 PWD install 使用

1、相关背景知识

  • CAN

控制器局域网络(Controller Area Network),一种串行数据通信协议。CAN是一种异步通讯,只有CAN_high和CAN_low两条信号线(实际上还需要共地,GND),共同构成一组差分信号线,以差分信号的形式进行通讯。CAN通讯节点由一个CAN控制器及CAN收发器,CAN 控制器用于实现实现CAN总线的协议底层以及数据链路层,用于生成CAN帧并以二进制码流的方式发送,在此过程中进行位填充、添加CRC校验、应答检测等操作;将接收到的二进制码流进行解析并接收,在此过程中进行收发比对、去位填充、执行CRC校验等操作。此外还需要进行冲突判断、错误处理等诸多任务。CAN收发器(有时也叫做驱动器),用于将二进制码流转换为差分信号发送,将差分信号转换为二进制码流接收。

  • CAN电平
  • CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平(逻辑0):CAN_H电压为3.5V、CAN_L为1.5V,压差为2V; 隐性电平(逻辑1):CAN_H和CAN_L电压均为2.5V,电压差为0V。发送方通过使总线电平发生变化,将消息发送给接收方。在总线上显性电平具有优先权,只要有一个单元(也就是节点)输出显性电平,总线上即为显性电平。而隐性电平则具有包容的含义,只有所有的单元都输出隐性电平,总线上才为隐性电平。那么可以知道,CAN通讯是半双工的,收发数据需要分开来进行,由于是公用总线,在整个网络中,同一时刻只能由一个通讯节点发送信号,其余的节点在该时刻只能接收。
  • CAN总线进行端接:一条总线至少2个端接,2端接个120Ω的电阻(消除总线终端处的信号反射、确保总线得到正确的电平)。
  • CAN与CAN-FD
  • 主要区别:
  1. CAN-FD:可以理解成CAN协议的升级版,只升级了协议物理层未改变
  2. CAN与CAN-FD主要区别:传输速率不同、数据长度不同、帧格式不同、ID长度不同。
  3. 由传统CAN转移到CANFD比较方便。
  • 传输速率
  1. CAN:最大传输速率1Mbps。
  2. CAN-FD:速率可变,仲裁比特率最高1Mbps(与CAN相同),数据比特率最高8Mbps。
  • 数据长度
  1. CAN:一帧数据最长8字节
  2. CAN-FD:一帧数据最长64字节。
  • CAN与CANOpen的关系

CAN的物理层分了三层分别是MDI,PMA和PLS,数据链路层分了两层:MAC与LLC。这五层就是最原始的CAN协议,标准是ISO11898。也就是说CAN协议一开始是没有应用层的。后来有一种叫CANOpen的基于CAN的应用层协议被开发出来,标准是CiA301。
CAN协议框架

2、移植canfestival

## 解压
tar jxvf canfestival-de1fc3261f21.tar.bz2
  • 编译源代码

首先执行python --version确认python是2.x的版本。若不是,修改环境变量,让默认的python指令是使用python2的。

./configure --cc=aarch64-none-linux-gnu-gcc --arch=arm64 --os=unix --kerneldir=../../kernel/ --prefix=$PWD/tmp --target=unix --can=socket --timers=unix --debug=WAR,MSG
 
 
--cc:配置开发板交叉编译器
--arch:开发板架构
--os:使用系统
--kerneldir:使用的内核实际目录
--prefix:在源码首页创建一个安装文件夹
--can:Linux下使用的是socket
--timers:定时器也是Linux自带的
--debug:返回执行信息
# 执行下列操作编译
make clean
make all
make install

......

# 输出产物
$ ls _install/
bin  include  lib  objdictgen

3、移植iproute2

can驱动使能需要使用到ip指令,但busybox中的ip指令功能不全,需要重新移植完整的iproute2。

iproute2需要依赖libmnl和libbsd,先移植这两个库。

tar -jxvf libmnl-1.0.4.tar.bz2
cd libmnl-1.0.4
./configure --prefix=${PWD}/_install --host=aarch64-none-linux
make && make install
ls _install # 查看编译产物
tar -xvf libbsd-0.8.7.tar.xz
cd libbsd-0.8.7
./autogen
./configure --prefix=${PWD}/_install --host=aarch64-none-linux
make && make install
ls _install # 查看编译产物
tar -xzvf iproute2-5.9.0.tar.gz
cd iproute2-5.9.0
mkdir _install
PKG_CONFIG_PATH=${PWD}/../libmnl-1.0.4/_install/lib/pkgconfig:${PWD}/../libbsd-0.8.7/_install/lib/pkgconfig CC=aarch64-none-linux-gcc AR=aarch64-none-linux-ar ./configure
make
DESTDIR=${PWD}/_install make install
ls _install # 查看编译产物

将完整的ip指令移植到开发板后就可以用ip来配置can了。

  • CAN FD常用命令
# 查询当前网络设备
ifconfig -a

# 关闭CAN
ip link set can0 down

# 设置仲裁段500k波特率,数据段500k波特率
ip link set can0 type can bitrate 500000 dbitrate 500000 fd on

# 打印can0信息
ip -details link show can0

# 启动CAN
ip link set can0 up

4、移植canutils

canutils可以用于测试物理层和链路层的CAN协议,其需要依赖libsocketcan。

canutils源码下载地址
libsocketcan源码下载地址

libsocketcan正常编译移植即可,但canutils是很老的一个项目了,在编译64位版本的时候可能会出现问题。在配置工具链的时候可能无法通过aarch64工具链的检测,这时候可以在其他项目中找一个config.sub,将这个文件替换到canutils的config/autoconf/config.sub。我这里将libmnl-1.0.4/build-aux/config.sub拷了过去,这样就能支持64位的编译工具了。

./configure --prefix="$PWD/_install" --host=aarch64-none-linux --enable-debug libsocketcan_LIBS="-L$PWD/../libsocketcan/_install/lib -lsocketcan" libsocketcan_CFLAGS="-I$PWD/../libsocketcan/_install/include" CFLAGS=-I$PWD/../libsocketcan/_install/include

标签:--,make,Linux,总线,电平,PWD,install,使用
From: https://www.cnblogs.com/wormarz/p/18178291

相关文章

  • ###什么是Linux内核###什么是MMU
    什么是Linux内核Linux内核简介Linux®内核是Linux操作系统(OS)的主要组件,也是计算机硬件与其进程之间的核心接口。它负责两者之间的通信,还要尽可能高效地管理资源。之所以称为内核,是因为在操作系统中就像果实硬壳中的种子一样,控制着硬件(无论是电话、笔记本电脑、服务器,还是任......
  • Linux系统目录和文件夹的区别
    V1.02024年5月7日发布于博客园目录Linux系统目录和文件夹的区别?目录文件(DirectoryFile)文件夹(Folder)技术区别结论参考资料Linux系统目录和文件夹的区别?在Linux系统中,目录是指目录文件!Linux中的目录并不是一种容器,而仅仅是一个文件索引表。其内容是其他文件和目录的索引......
  • Git使用经验总结5-修改提交信息
    还是先说说这个这样做的目的为什么。除了正常的进行代码变更说明修改,更重要的是Git提交的时候能够触发一些操作,例如在Github上提交close#24这样的关键字可以将提交关联到具体的issue上,这样可以让变更关联到具体的需求或者讨论上。但是很多时候我们很容易忘记进行这种关联,就需要修......
  • Linux内核的作用
    Linux内核是操作系统的核心组件,它负责管理计算机的硬件资源,并提供访问这些资源的接口,以便其他软件程序可以在计算机上运行。它的主要作用为:硬件抽象层:Linux内核提供了一个抽象层,将不同类型的硬件资源(如处理器、内存、存储设备、网络接口等)统一起来,使软件开发人员不需要直接与硬......
  • npm 使用
    安装cnpmnpminstall-gcnpm--registry=https://registry.npmmirror.com使用淘宝镜像安装npminstallXXX--registry=https://registry.npmmirror.com修改默认安装镜像npmconfigsetregistryhttps://registry.npmmirror.com查看npm当前镜像npmconfigge......
  • 使用 docker-compose 部署 nexus
    本篇博客主要介绍如何通过docker-compose快速搭建nexus服务,毕竟目前采用容器化部署是一件更加快速轻松的方案。之前的博客已经介绍过nexus的搭建,以及为IDEA和VisualStudio提供代理服务,这里就不详细介绍了,提供出之前博客的链接。nexus在windows上的搭建:https://www......
  • Git使用经验总结4-撤回上一次本地提交
    这个问题的意义在于,Git提交代码是先提交到本地,然后再推送到远端。一些比较严格的Git仓库会有一些代码提交检查,一旦检查到问题就会禁止提交。那么这个时候就尴尬了,本地已经提交了,但是远端又推送不上去。基于当前版本作修改再提交也不一定能推送成功,因为只要提交了,提交记录就会被检......
  • Linux系统内核的作用
      Linux系统内核在操作系统中扮演着至关重要的角色,其作用主要体现在以下几个方面:进程管理:内核负责创建和销毁进程,这是操作系统对计算机上正在运行的程序进行管理的核心部分。内核通过调度器对进程进行调度,确保每个进程都能得到合理的CPU时间片,实现多任务处理。内存管理:Linux......
  • 如何有趣地进行C编程 ——记一次宏使用技巧
    导语自换城市生活后,我很久没有正儿八经地写一个技术类的博客和总结之类的了。我在南京时总是有相当多的事项想记录整理成文下来,但是却没有这么多的时间,毕竟逐项验证和整理是很费时间的,而我的时间一直都不算多。回到武汉后,我开始从各种方面开始思考我的生活和我的职业:我到底想要......
  • FAT32和NTFS 、Linux内核、Linux系统目录和文件目录、MMU
    了解FAT32和NTFSFAT32文件系统用4个字节(32位)空间来表示每个扇区配置文件的情形,所以叫FAT32。兼容性较好,但对但缺点是对文件大小有限制,不支持超过4GB的文件。NTFS文件系统是windowsNT文件系统。NTFS系统比FAT32的可靠性更高,可以支持更大的分区和更大的文件,此外还有不少FAT32没......