linux系统中CAN驱动的通信方法与原理

简介: linux系统中CAN驱动的通信方法与原理

第一:CAN通信基本简介

      CAN的全称是控制局域网络。CAN最早是由德国博世公司开发的,当前应用最广泛的现场总线之一。以汽车电子为例,汽车上有空调、车门、发动机,大量的传感器,这些部件都是通过CAN总线连在一起的形成一个网络。

     各个单元通过CAN总线连接在一起,每个单元是独立的CAN节点。同一个CAN网络中所有单元的通信速度必须一致,不同的网络之间通信速度可以不同。例如:125Kbps的CAN网络下所有的节点速度都是125Kpbs的,整个网络由一个网关与其他网络进行连接。

第二:CAN通信的主要特点

       1、多主控制

        在总线空闲时,所有单元都可以发送消息,而两个以上的单元同时开始发送消息时,根据标识符(Identifier以下称为ID)决定优先级。ID并不是发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各个消息ID的每个位进行仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失败的单元则立刻停止发送而进行接收工作。

       2、系统的柔软性

        与总线相连接的单元没有类似于“地址”的信息。因此总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。

       3、通信速度快,距离远

       最高1Mbps(距离小于40M),最远可达10KM(速率小于5Kbps)。

      4、具有错误检测,错误通知和错误恢复功能

       所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即通知其他所有单元(错误通知功能),正在发送消息单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送直到发送成功为止(错误恢复功能)。

      5、故障封闭功能

      CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将 引起此故障的单元从总线上隔离出去。

     6、连接节点多

      CAN总线是可同时连接多个单元的总线。可连接的单元数量理论上是没有限制的。但实际上可连接的单元数量受总线上的时间延时及电气负载的限制。降低通信速度,可连接单元数量增加;提高通信速度,则可连接的单元数量减少。

第三:CAN通信协议

      通过CAN总线协议传输数据是需要按照一定协议进行的,CAN协议提供了5种帧格式来传输数据:数据帧、遥控帧、错误帧、过载帧和帧间隔。其中数据帧和遥控帧有标准格式和扩展格 式两种,标准格式有 11 位标识符(ID),扩展格式有 29 个标识符(ID)

第四:程序代码的具体实现

       可以到开发板原厂提供的设备树下进行配置。

1FlexCAN1 引脚节点信息

首先肯定是 CAN1 引脚配置信息,打开 imx6ull-alientek-emmc.dts,找到如下所示内容:

示例代码 66.3.1.1 CAN1 引脚信息

1 pinctrl_flexcan1: flexcan1grp{

2 fsl,pins = <

3MX6UL_PAD_UART3_RTS_B__FLEXCAN1_RX 0x1b020

4MX6UL_PAD_UART3_CTS_B__FLEXCAN1_TX 0x1b020

5>;

6 };

3 和第 4 行将 UART3_RTS UART3_CTS 这两个引脚分别复用为 FlexCAN1 RX

TX,电气属性都设置为 0x1b020

2FlexCAN1 控制器节点信息

打开 imx6ull.dtsi 文件,找到名为“flexcan1”的节点,内容如下:

示例代码 66.3.1.2 imx6ull.dtsi 文件 flexcan1 节点信息

1flexcan1: can@02090000 {

2

compatible = "fsl,imx6ul-flexcan", "fsl,imx6q-flexcan";

3

reg = <0x02090000 0x4000>;

4

interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;

5

clocks = <&clks IMX6UL_CLK_CAN1_IPG>,

6<&clks IMX6UL_CLK_CAN1_SERIAL>;

7

clock-names = "ipg", "per";

8

stop-mode = <&gpr 0x10 1 0x10 17>;

9

status = "disabled";

10 };

注意示例代码 66.3.1.2 中的 flexcan1 节点不需要我们修改,这里只是告诉大家 FlexCAN1

完整节点信息。根据第 2 行的 compatible 属性就可以找到 I.MX6ULL FlexCAN 驱动源文件,

驱动文名为 drivers/net/can/flexcan.c。第 9 行的 status 属性为 disabled,所以 FlexCAN1 默认关闭

的。在 imx6ull-alientek-emmc.dts 中添加使能 FlexCAN1 的相关操作,找到如下所示代码:

1 &flexcan1 {

2

pinctrl-names = "default";

3

pinctrl-0 = <&pinctrl_flexcan1>;

4

xceiver-supply = <&reg_can_3v3>;

5

status = "okay";

6 };

3 行指定 FlexCAN1 所使用的 pinctrl 节点为 pinctrl_flecan1,也就是示例代码 66.3.1.1

pinctrl 节点。

4 xceiver-supply 属性指定 CAN 收发器的电压为 3.3V

5 行将 flexcan1 节点的 status 属性改为“okay”,也就是使能 FlexCAN1

第五:使能Linux内核自带的FlexCAN驱动

   

     我们需要配置Linux内核中集成的FlexCAN驱动,但是没有使能,需要配置Linux内核,打开FlexCAN驱动。

     

-> Networking support 
-> <*> CAN bus subsystem support //打开 CAN 总线子系统

       

      接着Freescale系CPU的FlexCAN外设驱动

-> Networking support 
-> CAN bus subsystem support 
 -> CAN Device Drivers 
 -> Platform CAN drivers with Netlink support 
-> <*> Support for Freescale FLEXCAN based chips //选中

    配置好以后重新编译内核,然后新的内核和设备启动开发板。

目录
相关文章
|
3月前
|
Ubuntu Linux 网络安全
在Linux上安装软件有多种方法
在Linux上安装软件有多种方法
132 64
|
2月前
|
算法 Unix Linux
深入理解Linux内核调度器:原理与优化
本文探讨了Linux操作系统的心脏——内核调度器(Scheduler)的工作原理,以及如何通过参数调整和代码优化来提高系统性能。不同于常规摘要仅概述内容,本摘要旨在激发读者对Linux内核调度机制深层次运作的兴趣,并简要介绍文章将覆盖的关键话题,如调度算法、实时性增强及节能策略等。
|
2月前
|
Linux Shell 数据库
文件查找是Linux用户日常工作的重要技能介绍了几种不常见的文件查找方法
文件查找是Linux用户日常工作的重要技能。本文介绍了几种不常见的文件查找方法,包括使用`find`和`column`组合、`locate`和`mlocate`快速查找、编写Shell脚本、使用现代工具`fd`、结合`grep`搜索文件内容,以及图形界面工具如`Gnome Search Tool`和`Albert`。这些方法能显著提升文件查找的效率和准确性。
58 2
|
3月前
|
运维 Linux
Linux查找占用的端口,并杀死进程的简单方法
通过上述步骤和命令,您能够迅速识别并根据实际情况管理Linux系统中占用特定端口的进程。为了获得更全面的服务器管理技巧和解决方案,提供了丰富的资源和专业服务,是您提升运维技能的理想选择。
99 1
|
3月前
|
运维 安全 Linux
Linux文件清空的五种方法总结分享
每种方法各有优势,选择最合适的一种或几种,可以极大提高您的工作效率。更多有关Linux系统管理的技巧与资源,欢迎访问,持续提升您的运维技能。
97 1
|
3月前
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
62 0
Linux C/C++之TCP / UDP通信
|
3月前
|
Linux 数据安全/隐私保护 索引
linux inode索引节点使用率100% 解决+hustoj忘记密码+最新MDK注册方法
linux inode索引节点使用率100% 解决+hustoj忘记密码+最新MDK注册方法
52 1
|
2月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
133 8
|
2月前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
532 6
|
2月前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
102 3