Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长
CAN 是目前应用非常广泛的现场总线之一,主要应用于汽车电子和工业领域,尤其是汽车
领域,汽车上大量的传感器与模块都是通过 CAN 总线连接起来的。 CAN 总线目前是自动化领
域发展的热点技术之一,由于其高可靠性, CAN 总线目前广泛的应用于工业自动化、船舶、汽
车、医疗和工业设备等方面。
本次笔记需要学习CAN总线相关内容,主要包括CAN总线相关的基础理论知识、硬件原理图分析说明以及驱动开发、测试。重点内容为驱动开发及测试相关内容。
本章节的思维导图如下:
一、CAN协议简析
1、何为CAN?
汽车网络的标准协议。
特点:多主控制、柔软性、速度快、距离远、错误检测、错误通知和错误恢复、故障封闭、连接节点多。
2、CAN电气属性
显性电平:0 3.5V-1.5V=2V
隐形电平:1 2.5V-2.5V=0V 空闲状态
CAN 总线传输速度可达 1Mbps/S。
3、CAN协议
5 种帧格式:数据:数据帧、遥控帧、错误帧、过载帧和帧间隔。
1)、数据帧
2)、遥控帧
3)、错误帧
4)、过载帧
5)、帧间隔
4、CAN速率
CAN2.0 最高速度为1Mbps/S。1个位分为4段:
①、同步段(SS)
②、传播时间段(PTS)
③、相位缓冲段 1(PBS1)
④、相位缓冲段 2(PBS2)
段由 Tq(Time Quantum)组成, Tq 是 CAN 总线的最小时间单位。
在总线空闲态,最先开始发送消息的单元获得发送权。
当多个单元同时开始发送时,各发送单元从仲裁段的++第一位开始进行仲裁++ 。连续输出显性
电平最多的单元可继续发送。
5、I.MX6ULL FlexCAN简介
FlexCAN 支持四种模式:正常模式(Normal)、冻结模式(Freeze)、仅监听模式(Listen-Only)和
回环模式(Loop-Back),另外还有两种低功耗模式:禁止模式(Disable)和停止模式(Stop)。
𝐶𝐴𝑁波特率 = 𝑓𝑇𝑞/总 Tq
二、硬件原理图分析
三、实验程序编写
1、修改设备树
1)、FlexCAN1引脚节点信息
cpp
1 pinctrl_flexcan1: flexcan1grp{
2 fsl,pins = <
3 MX6UL_PAD_UART3_RTS_B__FLEXCAN1_RX 0x1b020
4 MX6UL_PAD_UART3_CTS_B__FLEXCAN1_TX 0x1b020
5 >;
6 };
2)、FlexCAN1 控制器节点信息
cpp
1 &flexcan1 {
2 pinctrl-names = "default";
3 pinctrl-0 = <&pinctrl_flexcan1>;
4 xceiver-supply = <®_can_3v3>;
5 status = "okay";
6 };
3)、关闭 FlexCAN2 相关节点
在 imx6ull-alientek-emmc.dts 文件中找到名为" flexcan2"的节点,然后将其屏蔽掉即可。
重新编译设备树,还需要配置 Linux 内核,使能内核里面的 FlexCAN 驱动。
2、使能Linux内核自带的FlexCAN驱动
1)、使能 CAN总线
-> Networking support
-> <*> CAN bus subsystem support //打开 CAN 总线子系统
2)、使能 Freescale 系 CPU 的 FlexCAN外设驱动
-> Networking support
-> CAN bus subsystem support
-> CAN Device Drivers
-> Platform CAN drivers with Netlink support
-> <*> Support for Freescale FLEXCAN based chips //选中
四、FlexCAN测试
1、检查CAN网卡设置是否存在
ifconfig -a //查看所有网卡
2、移植iproute2
在移植 ip 命令的时候必须先对根文件系统做个备份!
busybox 自带的 ip 命令并不支持对 can 的操作,因此我们需要重新移植 ip 命令,也就是
iproute2。
cpp
CC:=arm-linux-gnueabihf-gcc
1) 、将交叉编译得到的 ip拷贝到开发板中
首先将交叉编译到的 ip 命令拷贝到开发板中,先不要替换开发板根文件系统中原有的 ip 命
令!
2) 、在开发板根文件系统中用新的 ip命令替换原来的
cpp
cd lib/modules/4.1.15/
cp ip /sbin/ip -f
3)、 替换 ip命令以后系统启动失败怎么办?
ip 命令替换错误导致的!
3、移植can-utils工具
使用 can-utils 这个工具来对 can0 网卡进行测试
cpp
cd can-utils-2020.02.04 //进入 can-utils 源码目录
./autogen.sh //先执行 autogen.sh,生成配置文件 configure
./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf --
prefix=/home/zuozhongkai/linux/IMX6ULL/tool/can-utils --disable-static --enable-shared //配置
make //编译
make install
4、CAN通信测试
1) 、两块 ALPHA开发板连接测试
将两个开发板的 CAN 接口连接起来,注意, CAN_H 接 CAN_H, CAN_L 接 CAN_L!
①、收发测试
cpp
ip link set can0 type can bitrate 500000
/*设置 can0 速度为 500Kbit/S,两个 CAN 设备的速度要设置为一样的!*/
ifconfig can0 up //打开 can0
/*can0 打开以后就可以使用 can-utils 里面的小工具进行数据收发测试了。一个开发板用来接
收数据,一个用来发送数据,接收数据的开发板使用 candump 命令,输入如下命令:*/
candump can0 //接收数据
/*发送数据的开发板使用 cansend 命令向接收单元发送 8 个字节的数据: 0X11、0X22、0X33、
0X44、 0X55、 0X66、 0X77、 0X88。输入如下命令:*/
cansend can0 5A1#11.22.33.44.55.66.77.88
/*
cansend 命令用于发送 can 数据," 5A1"是帧 ID," #"号后面的" 11.22.33.44.55.66.77.88"
就是要发送的数据,十六进制。 CAN2.0 一次最多发送 8 个字节的数据, 8 个字节的数据之间用
" ."隔开。
*/
关闭CAN0:
cpp
ifconfig can0 down
②、回环测试
cpp
ifconfig can0 down //如果 can0 已经打开了,先关闭
ip link set can0 type can bitrate 500000 loopback on //开启回环测试
ifconfig can0 up //重新打开 can0
candump can0 & //candump 后台接收数据
cansend can0 5A1#11.22.33.44.55.66.77.88 //cansend 发送数据
2) 、 USB 转 CAN 卡测试
cpp
ip link set can0 type can bitrate 500000 //设置 can0,速率 500Kbit
ifconfig can0 up //打开 can0
candump can0 & //candump 后台接收数据
通过开发板向 USBCAN 发送数据,输入如下命令发送数据:
cansend can0 5A1#11.22.33.44.55.66.77.88
本笔记为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,不得用于商业用途。