Linux驱动开发基础(can)
目录
1.can的介绍
2.can的硬件连接
2.1 CPU自带can控制器
2.2 CPU没有can控制器
3.电气属性
4.can的特点
5.can协议
5.1 can的种类
5.2 数据帧
5.2.1 标准数据帧格式
5.3.1 扩展数据帧格式
5.3 遥控帧
5.4 错误帧
5.5 过载帧
5.6 帧间隔
5.7 位填充
5.8 位时间
编辑
5.9 硬同步和再同步
5.10 仲裁
1.can的介绍
CAN是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。
在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为了减少线束的数量的需要,且能让不同的ECU模块(汽车电子中的最小控制模块)可以相互通信,1986年德国电气商博世公司开发出面向汽车的CAN通信协议。此后,CAN通过ISO11898及ISO11519进行了标准化,现在在欧洲已是汽车网络的标准协议。
现在,CAN的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。
CAN等通信协议的开发,使多种LAN通过网关进行数据交换得以实现。如图是车载网络的构想示意图。

2.can的硬件连接
2.1 CPU自带can控制器

2.2 CPU没有can控制器

can总线两端1200欧姆为终端电阻,作用是消除总线上的信号反射。
3.电气属性

高速CAN:当 CANH 和 CANL 电压相同时为逻辑“1”(隐性状态),CANH 和 CANL 电压相差2V时为逻辑“0”(显性状态)
can使用差分信号来传输数据,并且物理连接上一般使用双绞线,抗干扰能力更强。

注意:干扰信号对双绞线的干扰是等幅值,等相位,等频率的,所以双绞线抗干扰能力更高
所以 can 总线速率最快可达到1Mbps,此时传输距离最远可达40m。
4.can的特点
(1) 多主控制
在总线空闲时,所有的单元都可开始发送消息(多主控制)。
最先访问总线的单元可获得发送权(CSMA/CA方式*1)。
多个单元同时开始发送时,发送高优先级ID消息的单元可获得发送权。
(2) 消息的发送
在CAN协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以开始发送新消息。两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息ID的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
(3) 系统的柔软性
与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
(4) 通信速度
根据整个网络的规模,可设定适合的通信速度。
在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。
(5) 远程数据请求
可通过发送“遥控帧” 请求其他单元发送数据。
(6) 错误检测功能·错误通知功能·错误恢复功能
所有的单元都可以检测错误(错误检测功能)。 检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。 正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
(7) 故障封闭
CAN可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
(8) 连接
CAN总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
5.can协议
5.1 can的种类
通信是通过以下5种类型的帧进行的。
• 数据帧
• 遥控帧
• 错误帧
• 过载帧
• 帧间隔
另外,数据帧和遥控帧有标准格式和扩展格式两种格式。
标准格式有11个位的标识符(Identifier: 以下称ID), 扩展格式有29个位的ID。 各种帧的用途如表所示。

5.2 数据帧
can通信是通过数据帧进行发送数据的。数据帧会携带数据从发送设备到接收设备。数据帧分为标准数据帧和扩展数据帧两种。
5.2.1 标准数据帧格式
标准数据帧由 7 个不同的位场组成,分别是帧起始,仲裁(字段)场,控制(字段)场,数
据(字段)场,CRC(字段)场,应答(字段)场,帧结尾。
| 帧起始 | 仲裁字段 | 控制字段 | 数据字段 | CRC 字段 | ACK 字段 | 帧结束 |
标准数据帧格式分析:

(1)帧起始和帧结束
帧起始和帧结束表示一帧数据的起始和结束,帧起始由 1 个显性位组成,帧结束由 7 个连续的隐形位组成。
(2)仲裁字段
仲裁字段包括 11 位 ID 位,1 位 RTR 位,共 12 位。ID 位可以用来区分数据帧的功能(不同功能的报数据帧,ID 是不同的),也可以用来区分优先级。根据仲裁规则,ID 小的数据帧优先发送。禁止高 7 位都为隐性(禁止设定:ID=1111111XXXX)。
RTR 是远程请求标志位,用于区分数据帧还是遥控帧。数据帧 RTR 位必须为显性 0,遥控帧必须位隐性 1。(相同 ID 的数据帧和遥控帧,数据帧的优先级大于遥控帧)。
(3)控制字段
控制字段由 1 位 IDE 位,1 位 R0 保留位,4 位 DLC 共 6 位组成。
IDE位表示数据帧是标准数据帧还是扩展数组帧,标准格式固定为显示0,扩展格式固定为隐性1。
R0 保留位,固定为显示 0。
DLC 位表示数据字段的数据字节数(数据段的长度)。
(4)数据字段
可以承载 0 到 64 位数据。
(5) CRC 校验字段
CRC 校验字段由 15 位校验位和 1 位 CRC 界定字符组成,前 15 位用于 CRC 校验。CRC 界定符必须为隐性 1。
(6)ACK 字段
ACK 字段由确定间隙位和确认界定符组成,确认界定符必须是隐性 1。
5.3.1 扩展数据帧格式
当标准格式的 11 位 ID 位不够用时,就需要扩展 ID 位 ,这时就产生了扩展数据帧。
扩展数据帧在保留前面 11 位 ID 的基础上,额外增加 18 位 ID,能提供更多的标识选择,以满足更复杂的通信需求。同时,扩展数据帧还需要考虑对标准数据帧的兼容,这样可以保证在不同的应用场景和设备之间,通信能够正常进行。如下图所示。

SRR 位:替代原来的 RTR 位,没有使用,必须是隐性电平 1
5.3 遥控帧
遥控帧用于接收设备主动请求数据。发送方通过广播的形式发送数据,数据帧中通过 ID 区分不同功能的数据帧,如果发送方没有广播这个数据,接收方可以广播发送一个遥控帧,有接收方想要的数据的发送方就会广播这个数据出来。接收方就可以接收到这个数据了。

数据帧去掉数据段就是遥控帧(在有的资料中,遥控帧也要远程帧)。所以遥控帧也分为俩种(标准遥控帧和扩展遥控帧),都包含 6 个部分,分别是帧起始,仲裁(字段)场,控制(字段)场,CRC(字段)场,应答(字段)场,帧结尾。如图所示。

5.4 错误帧
在发送或者接收时,总线上的设备发生错误的时候,可以通过发送错误帧的方式告知其他节点发生了错误。
错误帧由两个部分组成,分别是错误标志和错误界定符。
错误标志:
主动错误标志:6 个连续显性位
被动错误标志:6 个连续隐性位
错误界定符:8 个连续隐性位

5.5 过载帧
当某个接收节点没有做好接收下一帧数据的准备时,接收方将发送过载帧通知发送节点。
节点最多可产生两条连续的过载帧来延迟一下次发送。
过载标志的构成与主动错误标志的构成相同,过载界定符的构成与错误界定符的构成相同。

5.6 帧间隔
帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、 遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间隔。


(1) 间隔
3 个位的隐性位。
(2) 总线空闲
隐性电平,无长度限制(0亦可)。 本状态下,可视为总线空闲,要发送的单元可开始访问总线。
(3) 延迟传送(发送暂时停止)
8 个位的隐性位。 只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。
5.7 位填充
位填充是为防止突发错误而设定的功能。当同样的电平持续5位时则添加一个位的反型数据。
因为错误帧的错误标志是由六位连续的显隐帧组成,当发送连续的数据时就很可能会被误判为错误帧,所以需要位填充来规避这种情况。
填充范围:从帧起始到 CRC 字段。
填充规则:在相同极性的 5 个连续位之后使用位填充。填充位与其前面的位极性相反。
第一种填充情况:
| 发送 | 110000011 |
| 实际发送 | 1100000111 |
| 实际接收 | 1100000111 |
| 移除填充位 | 110000011 |
第二种填充情况:
| 发送 | 0111111 |
| 实际发送 | 01111101 |
| 实际接收 | 01111101 |
| 移除填充位 | 0111111 |
第三种填充情况:
| 发送 | 1000001111 |
| 实际发送 | 100000111110 |
| 实际接收 | 100000111110 |
| 移除填充位 | 1000001111 |

(1) 发送单元的工作
在发送数据帧和遥控帧时,SOF~CRC段间的数据,相同电平如果持续5位,在下一个位(第6个位)则 要插入1位与前5位反型的电平。
(2) 接收单元的工作
在接收数据帧和遥控帧时,SOF~CRC段间的数据,相同电平如果持续5位,需要删除下一个位(第6个 位)再接收。如果这个第6个位的电平与前5位相同,将被视为错误并发送错误帧。
5.8 位时间
位时间就是指一个(二进制)位在总线传输所需要的时间,一个位时间分为 4 段,这些段又
由称为 Time Quantum (以下称为 Tq) 的最小时间单位构成
波特率 = 1 / 位时间

位时间的作用:CAN 是异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会使用约定好的波特率进行通讯。在 CAN 还会使用同步的方式对抗干扰、降低误差,保证对总线电平信号进行正确的采样,确保通讯正常。
各段的作用如表所示:

同步可通过调整以下三个段的时间去调整采样点的位置。
5.9 硬同步和再同步
1. 硬同步
接收单元在总线空闲状态检测出帧起始时进行的同步调整。 在检测出边沿的地方不考虑SJW的值而认为是SS段。

2. 再同步
在接收过程中检测出总线上的电平变化时进行的同步调整。
每当检测出边沿时,根据SJW值通过加长PBS1段,或缩短PBS2段,以调整同步。但如果发生了超出SJW 值的误差时,最大调整量不能超过SJW值。

3. 调整同步规则
(1) 1 个位中只进行一次同步调整。
(2) 只有当上次采样点的总线值和边沿后的总线值不同时,该边沿才能用于调整同步。
(3) 在总线空闲且存在隐性电平到显性电平的边沿时,则一定要进行硬件同步。
(4) 在总线非空闲时检测到的隐性电平到显性电平的边沿如果满足条件(1)和(2),将进行再同步。但还要满足下面条件。
(5) 发送单元观测到自身输出的显性电平有延迟时不进行再同步。
(6) 发送单元在帧起始到仲裁段有多个单元同时发送的情况下,对延迟边沿不进行再同步。
5.10 仲裁
can 总线上可以挂载多个通信结点,但是总线只有一条,同一时刻只能传输一个数据。那如何保证总线上的数据可以有序高效的传输呢。

主要通过以下方法:
- 非破坏性仲裁:显性优先,即显性优先级大于隐性优先级(线与机制:只有所有节点都发送隐性 1 时,总线才为 1,只要有一个节点发送显性 0,则总线就是显性 0)
- 载波侦听:总线上各个节点在发送数据前要侦听总线的状态,只有在总线是空闲状态时,才允许发送。
- 回读:节点在发送数据时要不停的检测要发送的数据。通过非破坏性仲裁判断是否与其他节点的数据发生冲突。
在总线空闲态,最先开始发送消息的单元获得发送权。
多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。

相关文章:
Linux驱动开发基础(can)
目录 1.can的介绍 2.can的硬件连接 2.1 CPU自带can控制器 2.2 CPU没有can控制器 3.电气属性 4.can的特点 5.can协议 5.1 can的种类 5.2 数据帧 5.2.1 标准数据帧格式 5.3.1 扩展数据帧格式 5.3 遥控帧 5.4 错误帧 5.5 过载帧 5.6 帧间隔 5.7 位填充 5.8 位时…...
5.2《生活中的透镜》——5.3《凸透镜成像规律》讲后再上
教会什么:照相机、投影仪、放大镜的原理 培养什么:(再说) 课标: (二)运动和相互作用 2.3 声和光 2.3.5了解凸透镜成像规律的应用。 例7 了解凸透镜成像规律在放大镜、照相机中的应用。 一、导入 提问:生活中有哪些透镜?(放大镜、照相机、投影仪/幻灯机) ——直接提出…...
【LangChain入门 3 Prompts组件】聊天提示词模板 ChatPromptTemplate
文章目录 一、 聊天信息提示词模板1.1 使用关键字1.2 使用SystemMessage, HumanMessage, AIMessage来定义消息1.3 使用MessagesPlaceholder 在特定未知添加消息列表 二、关键类介绍2.1 ChatPromptTemplate 类2.1.1 from_messages()2.1.2 format_messages()2.1.3 format_prompt(…...
fastadmin后台管理员日志指定方法不记录
做的订单提醒,只要在线会把日志自动存储进去,这个又是每30s执行一次,数据库没多久就爆掉了,最终找到一个处理方法,可能不是最好的,仅供大家参考 具体位置: application/admin/model/AdminLog.php里面的$ignoreRegex方法 protected static $ignoreRegex [/^(.*)\/(selectpage…...
leetcode热题100道——字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", &…...
MCU-芯片时钟与总线和定时器关系,举例QSPI
时钟源: 时钟源为系统时钟提供原始频率信号,系统时钟则通过(分频、倍频、选择器)成为整个芯片的“主时钟”,驱动 CPU 内核、总线(AHB、APB)及外设的运行。 内部时钟源: HSI&#x…...
力扣热题100(方便自己复习,自用)
力扣热题100 1. 两数之和 - 力扣(LeetCode) 查找两数之和是不是等于target也就是我们找到一个数之后,用target将其减掉,再寻找应当对应的元素是什么每找到一个数,我们就将其放在集合中,因为集合中可以去重…...
暂存合并分支
合并分支代码,冲突过多,没解决完 想切换分支,可以把合并暂存 先先 git add . 再git stash 恢复搁置: 查看当前的搁置列表: git stash list恢复特定的搁置 如果你想恢复特定的搁置更改,可以指定索引&a…...
力扣hot100——三数之和(双指针)
题目:三数之和 排序 双指针 本题的难点在于如何去除重复解。 算法流程: 1、特判,对于数组长度 n,如果数组为 null 或者数组长度小于 3,返回 []。 2、对数组进行排序。 3、遍历排序后数组: (…...
技术分享 | MySQL内存使用率高问题排查
本文为墨天轮数据库管理服务团队第51期技术分享,内容原创,如需转载请联系小墨(VX:modb666)并注明来源。 一、问题现象 问题实例mysql进程实际内存使用率过高 二、问题排查 2.1 参数检查 mysql版本 :8.0.…...
分享一个精灵图生成和拆分的实现
概述 精灵图(Sprite)是一种将多个小图像合并到单个图像文件中的技术,广泛应用于网页开发、游戏开发和UI设计中。在MapboxGL中,跟之配套的还有一个json文件用来记录图标的大小和位置。本文分享基于Node和sharp库实现精灵图的合并与…...
AI日报 - 2025年3月21日
🌟 今日概览(60秒速览) ▎🤖 AGI突破 | OpenAI成立安全委员会,加速AGI治理框架构建 ▎💼 商业动向 | 微软发布医疗大模型DAX Copilot 3.0,覆盖全球临床场景 ▎📜 政策追踪 | 中国发布…...
MongoDB 配合python使用的入门教程
MongoDB 入门教程 1. 安装 MongoDB 首先,你需要在你的机器上安装MongoDB。你可以从 MongoDB官网 下载并安装 Community 版本。安装完成后,启动MongoDB服务。 # 在Linux/Mac上启动MongoDB mongod# 在Windows上,你可以通过Windows服务启动Mo…...
函数:形参和实参
在函数的使用过程中分为实参和形参,实参是主函数实际调用的值而形参则是给实参调用的值,如果函数没被调用则函式不会向内存申请空间,先用一段代码演示 形参: int test(int x ,int y ) {int z 0;z x y;return z; } 为何会叫做…...
【C#知识点详解】ExcelDataReader介绍
今天来给大家介绍一下ExcelDataReader,ExcelDataReader是一个轻量级的可快速读取Excel文件中数据的工具。话不多说直接开始。 ExcelDataReader简介 ExcelDataReader支持.xlsx、.xlsb、.xls、.csv格式文件的读取,版本基本在2007及以上版本,支…...
Vala编程语言教程-控制结构
控制结构 while (a > b) { a--; } 会重复递减a,每次迭代前检查a是否大于b。 do { a--; } while (a > b); 会重复递减a,每次迭代后检查a是否大于b。 for (int a 0; a < 10; a) { stdout.printf("%d\n", a); } 会先将a初始化为0…...
《视觉SLAM十四讲》ch13 设计SLAM系统 相机轨迹实现
前言 相信大家在slam学习中,一定会遇到slam系统的性能评估问题。虽然有EVO这样的开源评估工具,我们也需要自己了解系统生成的trajectory.txt的含义,方便我们更好的理解相机的运行跟踪过程。 项目配置如下: 数据解读: …...
服务的拆分数据的迁移
参考: 数据迁移调研...
在类Unix终端中如何实现快速进入新建目录
🚪 前言 相信喜欢使用终端工作的小伙伴或多或少会被一个小地方给膈应,那就是每次想要新建一个文件夹并且进入之,那么就需要两条指令:mkdir DIR和cd DIR,有些人可能要杠了,我一条指令也能,mkdir…...
01分数规划,二分法,题目练习
一、01分数规划 1.1 01分数规划 01分数规划用来求一个分式的极值。模型如下: 给出 a i a_i ai 和 b i b_i bi,求一组 w i ∈ { 0 , 1 } w_i \in \{ 0, 1 \} wi∈{0,1}最小化或最大化 ∑ i 1 n a i w i ∑ i 1 n b i w i \frac{\sum_{i1…...
TG电报群管理机器人定制开发的重要性
在Telegram(电报)用户突破20亿、中文社群规模持续扩张的背景下,定制化群管理机器人的开发已成为社群运营的战略刚需。这种技术工具不仅解决了海量用户管理的效率难题,更通过智能化功能重构了数字社群的治理范式。本文从管理效能、…...
VNA操作使用学习-01 界面说明
以我手里面的liteVNA为例。也可以参考其他的nanoVNA的操作说明。我先了解一下具体的菜单意思。 今天我想做一个天调,居然发现我连一颗基本的50欧姆插件电阻和50欧姆的smt电阻的幅频特性都没有去测试过,那买来这个nva有什么用途呢,束之高阁求…...
mysql-DELETE、DROP 和 TRUNCATE区别
在MySQL中,DELETE、DROP 和 TRUNCATE 是用于不同目的的SQL命令,它们各自执行不同的数据库操作。以下是它们的区别和适用场景: DELETE 用途:用于从表中删除满足特定条件的行。语法示例:DELETE FROM table_name WHERE …...
耘想Docker版Linux NAS的安装说明
耘想LinNAS(Linux NAS)可以通过Docker部署,支持x86和arm64两种硬件架构。下面讲解LinNAS的部署过程。 1. 安装Docker CentOS系统:yum install docker –y Ubuntu系统:apt install docker.io –y 2. 下载LinNas镜像…...
OpenCV图像拼接(4)图像拼接模块的一个匹配器类cv::detail::BestOf2NearestRangeMatcher
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::BestOf2NearestRangeMatcher 是 OpenCV 库中用于图像拼接模块的一个匹配器类,专门用于寻找两幅图像之间的最佳特征点匹配…...
k8s 配置imagePullSecrets仓库认证
在 Kubernetes (K8s) 中,imagePullSecrets 允许 Pod 访问私有镜像仓库,例如 Docker Hub、Harbor、阿里云镜像仓库、腾讯云 TCR 或自建的 registry.flow.cn。以下是完整的 imagePullSecrets 配置步骤: 步骤 1:创建 imagePullSecret…...
不用 Tomcat?SpringBoot 项目用啥代替?
在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。 同时,SpringBoot也支持Undertow容器,我们可以很方便的用Undertow替换Tomcat,而Undertow的性能和内存使…...
Zabbix安装(保姆级教程)
Zabbix 是一款开源的企业级监控解决方案,能够监控网络的多个参数以及服务器、虚拟机、应用程序、服务、数据库、网站和云的健康状况和完整性。它提供了灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的告警,从而能够快速响应服务器问…...
鸿蒙开发真机调试:无线调试和USB调试
前言 在鸿蒙开发的旅程中,真机调试堪称至关重要的环节,其意义不容小觑。虽说模拟器能够为我们提供初步的测试环境,方便我们在开发过程中快速预览应用的基本效果,但它与真机环境相比,仍存在诸多差异。就好比在模拟器中…...
深度学习中的“刹车”:正则化如何防止模型“超速”
深度学习中的“刹车”:正则化如何防止模型“超速” 大家好!今天我们来聊聊深度学习中的一个重要概念——正则化。 什么是过拟合? 想象一下,你正在教一个孩子认字。你给他看很多猫的图片,他都能正确识别。但是&#…...

