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
- 主要区别:
- CAN-FD:可以理解成CAN协议的升级版,只升级了协议,物理层未改变。
- CAN与CAN-FD主要区别:传输速率不同、数据长度不同、帧格式不同、ID长度不同。
- 由传统CAN转移到CANFD比较方便。
- 传输速率
- CAN:最大传输速率1Mbps。
- CAN-FD:速率可变,仲裁比特率最高1Mbps(与CAN相同),数据比特率最高8Mbps。
- 数据长度
- CAN:一帧数据最长8字节
- CAN-FD:一帧数据最长64字节。
- CAN与CANOpen的关系
CAN的物理层分了三层分别是MDI,PMA和PLS,数据链路层分了两层:MAC与LLC。这五层就是最原始的CAN协议,标准是ISO11898。也就是说CAN协议一开始是没有应用层的。后来有一种叫CANOpen的基于CAN的应用层协议被开发出来,标准是CiA301。
2、移植canfestival
- 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,先移植这两个库。
- 移植libmnl
libmnl源码下载地址 。
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 # 查看编译产物
- 移植libbsd
libbsd源码下载地址 。
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 # 查看编译产物
- 移植iproute2
iproute2源码下载地址 。
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。
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