嵌入式驱动开发详解17(CAN驱动开发)

文章目录

  • 前言
  • CAN简介
  • CAN收发器
  • CAN协议讲解
    • 电气特性
    • 传输协议
      • 数据帧
      • 遥控帧
      • 错误帧
      • 过载帧
      • 帧间隔
    • 同步矫正
  • CAN控制器
    • CAN控制器模式
    • CAN接收器
    • CAN波特率
  • CAN设备树分析
  • CAN测试
  • 后续
  • 参考文献

前言

该专栏主要是讲解嵌入式相关的驱动开发,但是由于部分模块的驱动框架过于复杂,其内容量不是一个人能完成的,我们驱动开发人员主要是对其进行理解即可,所以本专栏对部分驱动代码相关内容不进行讲解,包括ALSA,Codec,CAN,USB,WIFI,4G模块等,这些只讲解相关的协议等基础知识

CAN简介

CAN 是目前应用非常广泛的现场总线之一,主要应用于汽车电子和工业领域,尤其是汽车 领域,汽车上大量的传感器与模块都是通过 CAN 总线连接起来的。CAN 总线目前是自动化领 域发展的热点技术之一,由于其高可靠性,CAN 总线目前广泛的应用于工业自动化、船舶、汽 车、医疗和工业设备等方面。

在这里插入图片描述
低速CAN是开环的,而高速CAN是闭环的,如下所示:
在这里插入图片描述

CAN 的全称为 Controller Area Network,也就是控制局域网络,简称为 CAN。CAN 最早是 由德国 BOSCH(博世)开发的,目前已经是国际标准(ISO 11898),是当前应用最广泛的现场总线 之一。BOSCH 主要是做汽车电子的,因此 CAN 一开始主要是为汽车电子准备的,事实也是如 此,CAN 协议目前已经是汽车网络的标准协议。目前除了汽车电子以外 也广泛应用于工业自动化、医疗、工业和船舶等领域。
在这里插入图片描述
同一 个 CAN 网络中所有单元的通信速度必须一致,不同的网络之间通信速度可以不同。图中 125Kbps 的 CAN 网络下所有的节点速度都是 125Kbps 的,整个网络由一个网关与其他的网络连接。

CAN 的特点:

  • 多主控制:所有单元都可以发送消息(多主控制),而两个以上的单元同时开始发送消 息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而 是表示访问总线的消息的优先级。
  • 系统的柔软性:与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
  • 通信速度快,距离远:最高 1Mbps(距离小于 40M),最远可达 10KM(速率低于 5Kbps),最新的 CAN-FD 最高速度可达 5Mbps/S,甚至更高。
  • 具有错误检测、错误通知和错误恢复功能:所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单 元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束 发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
  • 故障封闭功能:CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错 误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将 引起此故障的单元从总线上隔离出去。
  • 连接节点多:CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增 加;提高通信速度,则可连接的单元数减少。

CAN收发器

CAN模块并不是直接通过控制器就能使用,还需要经过一个CAN收发器才能正常运行,如下所示没是SIT1050T芯片,芯片的一端连接控制器的CAN_TX和CAN_RX,另外一端连接CAN总线CAN_H和CAN_L:
在这里插入图片描述

CAN协议讲解

电气特性

CAN 总线使用两根线来连接各个单元:CAN_H 和 CAN_L,CAN 控制器通过判断这两根线上的电位差来得到总线电平,CAN 总线电平分为显性电平和隐性电平两种。显性电平表示逻辑“0”,隐形电平表示 逻辑“1”。
在这里插入图片描述CAN 总线上没有节点传输数据的时候一直处于隐性状态,也就是说总线空闲状态的时候一 直处于隐性。

传输协议

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

数据帧

接下来以数据帧为例进行讲解,数据帧包括以下内容:
①、帧起始,表示数据帧开始的段。
②、仲裁段,表示该帧优先级的段。
③、控制段,表示数据的字节数及保留位的段。
④、数据段,数据的内容,一帧可发送 0~8 个字节的数据。
⑤、CRC段,检查帧的传输错误的段。
⑥、ACK段,表示确认正常接收的段。
⑦、帧结束,表示数据帧结束的段。
在这里插入图片描述①、帧起始:帧起始很简单,标准格式和扩展格式都是由一个位的显性电平 0 来表示帧起始。
②、仲裁段:仲裁段表示帧优先级,仲裁段结构如下图所示,标准格式的 ID 为 11 位,发送顺序是从 ID10 到 ID0,最高 7 位 ID10~ID4 不能全为隐性(1),也就是禁止0X1111111XXXXX这样的 ID。扩展格式的 ID 为 29 位,基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0,基本 ID 与标准格式一样,禁止最高 7 位都为隐性。
在这里插入图片描述

  • CAN总线处于空闲状态,最先开始发送消息的单元获得发送权。
  • 多个单元同时开始发送时,从仲裁段(报文ID)的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送,即首先出现隐性电平的单元失去对总线的占有权变为接收。如下图所示:
    在这里插入图片描述
    ③、控制段:控制段由 6 个位构成,表示数据段的字节数,标准格式和扩展格式的控制段略有不同,RTR是远程发送请求位,显性电平0表示数据帧,隐性电平1表示扩展帧,在扩展帧中用SRR代替RTR,后面的RTR可以不用管;IDE是扩展标识符位,此位用于判断是标准帧还是扩展帧; r0 为保留位,保留位必须以显性电平发送。DLC 为数据长度,高位在前,DLC 段有效值范围为 0~8。
    ④、数据段:数据段也就是帧的有效数据,标准格式和扩展格式相同,可以包含 0~8 个字节的数据,从最高位(MSB)开始发送。
    ⑤、CRC段: CRC 段保存 CRC 校准值,用于检查帧传输错误,标准格式和扩展格式相同,CRC 段由 15 位的 CRC 值与 1 位的 CRC 界定符组成。CRC 值的计算范围包括:帧起始、仲裁段、控制段、数据段,接收方以同样的算法进行计算,然后用计 算得到的 CRC 值与此 CRC 段进行比较,如果不一致的话就会报错。
    ⑥、ACK段: ACK 段用来确认接收是否正常,标准格式和扩展格式相同,ACK 段由 ACK 槽(ACK Slot)和 ACK 界定符两部分组成。发送单元的 ACK,发送 2 个隐性位,而接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位, 通知发送单元正常接收结束,这个过程叫发送 ACK/返回 ACK。发送 ACK 的是所有接收单元 中接收到正常消息的单元,所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息,这 些接收单元既不处于总线关闭态也不处于休眠态的所有接收单元中。
    ⑦、帧结束:最后就是帧结束段,标准格式和扩展格式相同,帧结束段很简单,由 7 位隐性位构成。

遥控帧

接收单元向发送单元请求数据的时候就用遥控帧,遥控帧由 6 个段组成:
①、帧起始,表示数据帧开始的段。
②、仲裁段,表示该帧优先级的段。
③、控制段,表示数据的字节数及保留位的段。
④、CRC 段,检查帧的传输错误的段。
⑤、ACK 段,表示确认正常接收的段。
⑥、帧结束,表示数据帧结束的段。
在这里插入图片描述
遥控帧结构基本和数据帧一样,最主要的区别就是遥控帧没有数据段。遥控帧的 RTR 位为隐性的,数据帧的 RTR 位为显性,因此可以通过 RTR 位来区分遥控帧和没有数据的数据帧。遥控帧没有数据,因此 DLC 表示的是所请求的数据帧数据长度,遥控帧的其他段参考数据帧的描述即可。

错误帧

当接收或发送消息出错的时候使用错误帧来通知,错误帧由错误标志和错误界定符两部分 组成,错误帧结构如图所示:
在这里插入图片描述
错误标志有主动错误标志和被动错误标志两种,主动错误标志是 6 个显性位,被动错误标 志是 6 个隐性位,错误界定符由 8 个隐性位组成。

过载帧

接收单元尚未完成接收准备的话就会发送过载帧,过载帧由过载标志和过载界定符构成, 过载帧结构如图所示:
在这里插入图片描述
过载标志由 6 个显性位组成,与主动错误标志相同,过载界定符由 8 个隐性位组成,与错 误帧中的错误界定符构成相同。

帧间隔

帧间隔用于分隔数据帧和遥控帧,数据帧和遥控帧可以通过插入帧间隔来将本帧与前面的 任何帧隔开,过载帧和错误帧前不能插入帧间隔,帧间隔结构如图所示:
在这里插入图片描述
间隔由 3 个隐性位构成,总线空闲为隐性电平,长度没有限制,本状态下表 示总线空闲,发送单元可以访问总线。延迟发送由 8 个隐性位构成,处于被动错误状态的单元 发送一个消息后的帧间隔中才会有延迟发送。

同步矫正

在这里插入图片描述
这些段由 Tq(Time Quantum)组成,Tq 是 CAN 总线的最小时间单位。帧由位构成,一个位由4个段构成,每个段又由若干个 Tq 组成,这个就是位时序。1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。各段的作用和 Tq 数如图所示:
在这里插入图片描述
CAN为了实现对总线电平信号的正确采样,数据同步分为硬件同步和再同步,首先是硬件同步,硬件同步是由控制器内部实现的,具体实现原理不详,但是总体调整方式如下:
在这里插入图片描述
接下来是软同步,即再同步,再同步是通过调整SJW值来补偿PBS1或者PBS2的值,使SS到达正确的位置,再同步时,不能增加限定长度的SJW值。SJW值较大时,吸收误差
能力更强,但是通讯速度会下降。

CAN控制器

这里I.MX6ULL以为例进行讲解,其实STM32等芯片也是一样的逻辑,包含的功能和结构都是类似的,I.MX6ULL 带有 CAN 控制器外设,叫做 FlexCAN,FlexCAN 符合 CAN2.0B 协议。FlexCAN 完全符合 CAN 协议,支持标准格式和扩展格式,支持 64 个消息缓冲(STM32F407只有三级深度的两个接收FIFO和三级发送邮箱),I.MX6ULL 的CAN 模块特性如下:
①、支持 CAN2.0B 协议,数据帧和遥控帧支持标准和扩展两种格式,数据长度支持 0~8 字 节,可编程速度,最高 1Mbit/S。
②、灵活的消息邮箱,最高支持 8 个字节。
③、每个消息邮箱可以配置为接收或发送,都支持标准和扩展这两种格式的消息。
④、每个消息邮箱都有独立的接收掩码寄存器。
⑤、强大的接收 FIFO ID 过滤。
⑥、未使用的空间可以用作通用 RAM。
⑦、可编程的回测模式,用于进行自测。
⑧、可编程的优先级组合。

CAN控制器模式

在这里插入图片描述

CAN接收器

当总线上报文数据量很大时,总线上的设备会频繁获取报文,占用CPU。过滤器的存在,选择
性接收有效报文,减轻系统负担。这里以stm32F407的过滤器为例,每个过滤器组都有两个32位寄存器CAN_FxR1和CAN_FxR2。一共有28个过滤器组,根据过滤器组的工作模式不同,寄存器的作用不尽相同。位宽可设置32位或16位,寄存器存储的内容就有所区别,具体内容见下面三张图,第一副图说明了存在屏蔽模式和标识符列表模式,第二副图说明了如何过滤出符合条件的报文,最后一个图说明了屏蔽模式是如何工作的。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

CAN波特率

最后就是CAN 波特率的计算了,这个地方的计算与前面的同步矫正内容关联性比较大,这里还是以stm32为例进行讲解,如下所示,tq是CAN 总线的最小时间单位,即时钟频率,通过1除以传输一个字节所需要的时间就可以算出波特率。通信双方波特率需要一致才能通信成功。
在这里插入图片描述

CAN设备树分析

一般芯片原厂都会给用户写好CAN驱动并配置CAN节点,打开 Documentation/devicetree/bindings/net/can/ fsl-flexcan.txt,此文档描述了I.MX6ULLFlexCAN 节点下的相关属性信息。跟之前一样在设备树里面配置好pinctl和完整节点信息即可,随后在linux内核的图形化配置界面打开CAN总线子系统(在linux下CAN总线是作为网络子系统的)和使能 Freescale 系 CPU 的 FlexCAN 外设驱动。

-------------------------------打开CAN总线子系统-----------------------------
-> 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 //选中

CAN测试

CAN的驱动可以通过ifconfig -a查看,因为Linux 系统中把 CAN 总线接口设备作为网络设备进行统一管理。如果需要对CAN进行通信,可以使用can-utils工具进行测试,但是我们的根文件系统是通过 busybox 搭建,busybox自带的 ip 命令并不支持对 can 的操作,因此我们需要重新移植 ip 命令,也就是 iproute2,这两个安装完成之后就可以进行测试了。一般情况下小工具和库的移植过程会有很多小细节需要注意。在移植 ip 命令的时候必须先对根文件系统做个备份!防止操作失误导致系统启动失败!切 记!笔者的血泪经验教训!这里需要说明一下,一般开发时直接选用buildroot创建根文件系统,因为他可以把一些小工具都直接一次性安装好,不需要跟busybox一样自己逐个搭建。

后续

本人对嵌入式行业兴趣浓厚,但是发现驱动开发越学越迷茫,听有些up主驱动开发就算去芯片原厂或者模组原厂也是做缝缝补补或者移植的工作,一般需要要求对某一个领域,比如音频、网络、蓝牙等领域研究特别深入才可能有能力做驱动开发工作,目前本人处于学习阶段,不太可能深耕某一个领域,因此当前阶段就仅仅只是了解驱动是如何实现底层工作的,后期可能会继续研究MCU的RTOS开发和Linux从bootloader->linux内核裁剪->驱动修改->应用开发,并将自己所学的皮毛用于开发一个小项目。
希望对此方向感兴趣的伙伴能一起评论交流!!!!

参考文献

  1. 个人专栏系列文章
  2. 正点原子嵌入式驱动开发指南
  3. 瑞萨电子编写的《CAN 入门教程》
  4. 对代码有兴趣的同学可以查看链接https://github.com/NUAATRY/imx6ull_dev

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937724.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机游戏运行时常见问题解析:d3dx9_43.dll丢失的真相与修复指南

游戏运行时d3dx9_43.dll缺失问题全解析 在计算机游戏的探险之旅中&#xff0c;d3dx9_43.dll文件缺失常成为玩家的绊脚石。此DLL文件是DirectX 9的关键组件&#xff0c;对图形渲染至关重要。以下&#xff0c;我们将深入剖析其丢失原因&#xff0c;并提供精简有效的修复策略。 …

CSS(13):2D

一.2D转换之移动translate 2D移动是2D转换里面的一种功能&#xff0c;可以改变元素在页面中的位置&#xff0c;类似定位。 transform:translate(x,y);&#xff08;里面可以用到参数%&#xff0c;是相对于自身宽度和高度来计算的&#xff09; transform:translateX(n); tran…

AI 赋能:医学科研审稿邀请的优化之道

在医学科研这座宏伟的知识殿堂中&#xff0c;审稿邀请是保障学术成果质量的关键环节&#xff0c;审稿邀请犹如一扇关键之门&#xff0c;连接着科研成果与专业评审&#xff0c;决定着学术智慧的传承与升华。如今&#xff0c;AI 技术恰似一把神奇的钥匙&#xff0c;悄然插入这扇门…

如何搭建Hexo博客,并发布到github上

1、安装好git 2、安装好npm、node 3、切换npm的源&#xff0c;现在阿里的cnpm不行了&#xff0c;要切换成新的&#xff1a; npm config set registry https://registry.npmmirror.com npm config get registry4、安装hexo-cli npm install -g hexo-cli查看是否安装成功&#…

React,Antd实现文本输入框话题添加及删除的完整功能解决方案

最终效果就是实现该输入框: 添加话题时,话题自动插入到输入框前面多文本输入框左侧间距为话题的宽度多行文本时,第二行紧接开头渲染删除文本时,如果删除到话题,再次删除,话题被删除首先构造div结构const [hashtag, setHashtag] = useState(""); // 话题内容con…

Apache服务器配置:从小白到高手的飞跃

本节目录&#xff1a; Web服务器概述 Apache服务器及安装 配置 作业 Web服务:互联网的心脏 想象一下&#xff0c;如果没有Web服务器&#xff0c;我们就不能浏览网页&#xff0c;不能在线购物&#xff0c;不能看视频&#xff0c;不能做很多事情。Web服务器就是互联网的心脏&…

基于SpringBoot的滑雪场管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

bean创建源码

去字节面试&#xff0c;直接让人出门左拐&#xff1a;Bean 生命周期都不知道&#xff01; spring启动创建bean流程 下面就接上了 bean生命周期 doGetBean Object sharedInstance this.getSingleton(beanName); sharedInstance this.getSingleton(beanName, new ObjectF…

【HarmonyOS】鸿蒙获取appIdentifier,Identifier

【HarmonyOS】鸿蒙获取appIdentifier&#xff0c;Identifier 一、前言 三方后台需要填写的所谓appIdentifier&#xff0c;Identifier信息&#xff0c;其实对应鸿蒙应用的appID。 二、解决方案&#xff1a; 注意&#xff0c;模拟器获取data.signatureInfo.appIndentifer为空…

在Linux的嵌入式开发中,如何确定要操作的帧缓冲设备是第几个实例?即是fb0还是fb1还是fb2...

方法汇总 在实际编写程序时&#xff0c;要确定操作的帧缓冲设备&#xff08;如 /dev/fb0、/dev/fb1 等&#xff09;&#xff0c;通常需要结合系统环境和硬件配置。以下是一些常见的方法&#xff0c;帮助你确定需要打开的帧缓冲设备实例&#xff1a; 1. 检查系统设备文件 查看…

The Past, Present and Future of Apache Flink

摘要&#xff1a;本文整理自阿里云开源大数据负责人王峰&#xff08;莫问&#xff09;在 Flink Forward Asia 2024上海站主论坛开场的分享&#xff0c;今年正值Flink开源项目诞生的第10周年&#xff0c;借此时机&#xff0c;王峰回顾了Flink在过去10年的发展历程以及 Flink社区…

自动驾驶控制与规划——Project 2: 车辆横向控制

目录 零、任务介绍一、环境配置二、算法三、代码实现四、效果展示 零、任务介绍 补全src/ros-bridge/carla_shenlan_projects/carla_shenlan_stanley_pid_controller/src/stanley_controller.cpp中的TODO部分。 一、环境配置 上一次作业中没有配置docker使用gpu&#xff0c;…

FFmpeg库之ffplay

文章目录 FFmpeg环境搭建ffplay使用通用选项视频选项音频选项快捷键使用滤镜直播拉流 FFmpeg环境搭建 FFmpeg官网 FFmpeg环境搭建 我这里用的是cmake配置&#xff0c;mingw编译&#xff0c;不用移动文件夹 CMakeLists.txt cmake_minimum_required ( VERSION 3.16 )project…

jenkins pipeline打包流程

Jenkins Pipeline 是 Jenkins 提供的一种用于持续集成和持续交付&#xff08;CI/CD&#xff09;的脚本化流程工具。它允许你通过编写一个 Jenkinsfile 文件来定义整个构建、测试和部署的流程。本文介绍打包springcloud项目&#xff0c;react项目为docker镜像 文章目录 1.项目结…

【LC】876. 链表的中间结点

题目描述&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间结点…

WEB开发: Node.js路由之由浅入深- 即拿即用完整版

前面我们一起学习了Node.js路由之由浅入深&#xff0c;基本了解并熟悉了Node.js的路由实现。 现在我们来一个综合完整版&#xff0c;让这个路由模块即拿即用&#xff0c;也就是下载运行就可用&#xff0c;并可以轻松地自行增加路由&#xff0c;无需去繁琐地修改路由配置&#…

就业相关(硕士)

一、嵌入式 1.机器人行业 1.1 大致情况 要做机器人行业&#xff0c;主要技术栈是运动控制、深度学习、强化学习、具身智能等&#xff0c;主要求职方向有运动控制算法工程师和机器人算法工程师等等。大致薪资在30w到50w不等&#xff0c;主要看方向&#xff08;双211&#xff…

C++编程:使用树莓派Pico制作光控小夜灯

在智能家居系统中,光控设备通过环境光强度的变化自动调节设备的状态,具有广泛的应用。常见的应用场景包括自动开关灯、调节LED亮度等。本项目基于树莓派Pico开发板,通过光敏电阻检测环境光强度,并利用PWM调光控制LED亮度,实现一个简单的光控小夜灯。本文将深入解析光敏电阻…

安卓获取所有可用摄像头并指定预览

在Android设备中&#xff0c;做预览拍照的需求的时候&#xff0c;我们会指定 CameraSelector DEFAULT_FRONT_CAMERA前置 或者后置CameraSelector DEFAULT_BACK_CAMERA 如果你使用的是平板或者工业平板&#xff0c;那么就会遇到多摄像头以及外置摄像头问题&#xff0c;简单的指…

回归任务与分类任务应用及评价指标

能源系统中的回归任务与分类任务应用及评价指标 一、回归任务应用1.1 能源系统中的回归任务应用1.1.1 能源消耗预测1.1.2 负荷预测1.1.3 电池健康状态估计&#xff08;SOH预测&#xff09;1.1.4 太阳能发电量预测1.1.5 风能发电量预测 1.2 回归任务中的评价指标1.2.1 RMSE&…