CAN通信

news/2025/3/6 1:20:03/文章来源:https://www.cnblogs.com/kongbrid/p/18754089

一.什么是CAN总线

1.CAN总线的概念

  • CAN总线(Controller Area Network Bus)控制器局域网总线

2.CAN总线的特点

3.常见通信协议对比(UART、I²C、SPI、CAN)

特性 UART I²C SPI CAN
全称 Universal Asynchronous Receiver/Transmitter Inter-Integrated Circuit Serial Peripheral Interface Controller Area Network
协议类型 异步串行通信 同步串行通信 同步串行通信 异步串行通信
通信方式 全双工 半双工 全双工 半双工
线数 2 线(TX、RX) + GND 2 线(SDA、SCL) + GND 4 线(MISO、MOSI、SCK、CS) + GND 2 线(CAN_H、CAN_L) + GND
拓扑结构 点对点 多设备总线(支持多主多从) 主从结构(单主多从,每个从设备独立片选) 多主总线(节点平等)
寻址方式 无(依赖硬件连接) 7 位或 10 位设备地址 无(通过片选信号选择从设备) 消息 ID(11 位标准帧或 29 位扩展帧)
最大速度 通常 ≤ 115.2 kbps(受距离影响) 标准模式:100 kbps
快速模式:400 kbps
高速模式:3.4 Mbps
通常 1 Mbps ~ 100 Mbps(具体取决于器件) 1 Mbps(40m 内)
125 kbps(500m 内)
时钟信号 无(异步) 有(SCL 由主设备生成) 有(SCK 由主设备生成) 无(异步,通过位填充同步)
数据格式 起始位 + 数据位(5-9) + 校验位(可选) + 停止位(1-2) 起始条件 + 地址帧 + 读写位 + 数据帧 + 停止条件 无固定格式,数据通过 MOSI/MISO 同步传输 帧类型(数据帧/远程帧) + ID + 数据段(0-8 字节) + CRC 等
校验机制 奇偶校验(可选) ACK/NACK 确认机制 通常无校验(依赖硬件可靠性) CRC 校验 + ACK 应答 + 错误帧检测
冲突处理 无(点对点无冲突) 时钟同步和仲裁 无(主设备独占总线) 非破坏性逐位仲裁(基于 ID 优先级)
优点 1. 简单易用
2. 全双工
3. 无需时钟线
1. 多主多从
2. 引脚资源少
3. 支持热插拔
1. 高速传输
2. 全双工
3. 无地址限制
1. 高可靠性
2. 长距离抗干扰
3. 多主容错
缺点 1. 速度低
2. 点对点限制
3. 无冲突检测
1. 速度受限
2. 需要上拉电阻
3. 地址冲突风险
1. 线数多
2. 无标准协议
3. 从设备数量受限
1. 协议复杂
2. 硬件成本高
3. 数据负载小(≤8字节)
典型应用 调试接口、GPS 模块、老旧设备通信 传感器(温度/湿度)、EEPROM、低速外设 存储器(Flash/SD 卡)、显示屏、高速 ADC/DAC 汽车电子(ECU 通信)、工业控制、电梯系统
功耗 低(支持睡眠模式) 中(高速时功耗较高) 中(持续总线监听)
典型器件 CH340、CP2102 AT24Cxx(EEPROM)、BMP280(气压传感器) W25Qxx(Flash)、ADXL345(加速度计) MCP2515(CAN 控制器)、TJA1050(CAN 收发器)
特殊机制 波特率匹配 时钟拉伸(Clock Stretching) 时钟极性(CPOL)和相位(CPHA)配置 错误帧自动重发、故障节点自动离线

二.CAN的硬件电路

1.通信的基本框架

alt text

2.CAN的电平标准

3.CAN收发器

4.CAN物理层特性

三.CAN的通信协议

1.CAN的帧格式

2.数据帧

2.1.标准格式

CAN标准帧格式时序表

alt text

字段名称 起始段 (SOF) 仲裁段 控制段 数据段 CRC段 ACK段 结束段 (EOF)
位长 1 bit 12 bits
(11位ID + 1位RTR)
6 bits
(1位IDE + 1位r0 + 4位DLC)
0-64 bits
(对应0-8字节)
16 bits
(15位CRC + 1位CRC分界符)
2 bits
(1位ACK槽 + 1位ACK分界符)
7 bits
描述 帧开始标识:发送一个显性(0)位,用于总线同步,标志帧起始。 包含11位标识符与1位RTR位:
- 11位标识符决定报文优先级(ID越小优先级越高);
- RTR位区分数据帧(显性0)与远程帧(隐性1);
支持非破坏性仲裁。
包含控制信息:
- IDE位:显性(0)表示标准帧;
- 保留位r0:固定显性(0);
- DLC:4位数据长度编码,指示数据段字节数(0至8字节)。
传输实际数据内容,其长度由DLC字段确定,最多承载8字节的数据。 用于错误检测:
- 15位CRC校验码计算整个帧的CRC;
- 1位CRC分界符始终为隐性(1),起到分隔作用。
包含确认信息:
- ACK槽:由发送端发送为隐性,接收节点正确接收后覆盖为显性(0);
- 1位ACK分界符:始终为隐性(1)。
结束标志:由7位连续隐性(1)位组成,标识帧结束,帮助恢复总线空闲状态。
传输顺序 第1位 第2-13位 第14-19位 第20-83位(实际位数依据DLC值而定) 第84-99位 第100-101位 第102-108位

2.2.扩展格式

alt text

字段名称 起始段 (SOF) 仲裁段 控制段 数据段 CRC段 ACK段 结束段 (EOF)
位长 1 bit 32 bits
(11位标识符 + 1位SRR + 1位IDE + 18位扩展标识符 + 1位RTR)
5 bits
(1位保留位r0 + 4位DLC)
0-64 bits
(0-8字节,依据DLC值)
16 bits
(15位CRC校验码 + 1位CRC界定符)
2 bits
(1位ACK槽 + 1位ACK界定符)
7 bits
描述 帧起始标志:
发送1个显性(0)位,用于总线同步并标志帧开始。
包含帧的标识与仲裁信息:
- 11位标识符:基本标识符,确定较高优先级;
- SRR位:替代远程请求位,固定为隐性;
- IDE位:标识符扩展位,固定为隐性(1),表明使用扩展帧格式;
- 18位扩展标识符:与基本标识符组合构成29位标识符;
- RTR位:远程传输请求位,显性(0)表示数据帧,隐性(1)表示远程帧。
包含帧控制信息:
- 保留位r0:固定为显性(0);
- DLC:数据长度码,4位编码,指示数据段的字节数(0-8字节)。
传输实际数据,长度由DLC决定,最多8字节。 用于错误检测:
- 15位CRC校验码:对整个帧进行循环冗余校验;
- 1位CRC界定符:固定为隐性(1),用于分隔CRC段。
包含确认信息:
- ACK槽:发送时置为隐性(1),接收节点正确接收后覆盖为显性(0)表示确认;
- ACK界定符:固定为隐性(1)。
帧结束标志:
7位连续隐性(1)位,标志帧结束,使总线进入空闲状态。
传输顺序 第1位 第2-33位 第34-38位 第39-(38+DLC×8)位(数据长度依据DLC确定) 紧跟数据段,16位 紧跟CRC段,2位 紧跟ACK段,7位

3.遥控帧

4.错误帧

5.过载帧

6.帧间隔

7.位填充

#include "My_CAN.h"My_CAN_Init()
{}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

typora图床搭建+完美解决PicGo图片上传重命名问题

typora图床搭建+完美解决PicGo图片上传重命名问题typora图床搭建+完美解决PicGo图片上传重命名问题 typora设置上图中第五步需要你下载PicGo应用并安装 PicGo配置 下载安装好后得到如图界面这时需要对该软件进行配置 文档在这里https://picgo.github.io/PicGo-Doc/zh/guide/con…

[NSSCTF 2022 Spring Recruit]ezgame(两种解法)

可以看到,这个题目一打开就是一道简单的小游戏,玩了一会没看到什么提示就打开页面源码看看有没有提示可以看到只要分数超过65就会告诉你flag,但是真的自己去玩基本上是玩不到65分的,于是我尝试修改页面代码看能不能绕过 解法1 由于页面爆炸了,这里就不附上截图,反正修改分…

【转载】VPS、ECS、Docker和k8s

图片及内容均来源于小林coding公众号:面试官:Docker 和 k8s 之间是什么关系? 物理服务器 一台看得见摸得着的机器,其实就是云厂商页面里提到的物理服务器或物理机。不同厂商叫法不同,有的厂商叫它独立服务器。 vps 和 ecs VPS(Virtual Private Server,虚拟专用服务器)。…

【云原生】VPS、ECS、Docker和k8s

图片及内容均来源于小林coding公众号:面试官:Docker 和 k8s 之间是什么关系? 物理服务器 一台看得见摸得着的机器,其实就是云厂商页面里提到的物理服务器或物理机。不同厂商叫法不同,有的厂商叫它独立服务器。 vps 和 ecs VPS(Virtual Private Server,虚拟专用服务器)。…

FastAPI 查询参数完全指南:从基础到高级用法

title: FastAPI 查询参数完全指南:从基础到高级用法 🚀 date: 2025/3/6 updated: 2025/3/6 author: cmdragon excerpt: 探讨 FastAPI 查询参数的核心机制,涵盖从必需与可选参数、默认值到多参数处理的全方位知识。通过详细的代码示例、课后测验和常见错误解决方案,通过类…

[HNCTF 2022 WEEK3]ssssti

[HNCTF 2022 WEEK3]ssssti 首先打开题目这边翻译一下,server-side template injection是服务器模版注入,立马能反应过来是ssti(一般是flask框架) 不管了,直接丢fenjing里面一把梭哈开始扫描了1,不得不感慨fenjing的waf绕过能力是真强一些常见的危险payload也自动帮你试完了…

[安洵杯 2020]Normal SSTI

[安洵杯 2020]Normal SSTI好题目,直接把参数给我了都不用找了打开fenjing直接一把梭哈

[BJDCTF2020]Easy MD5

[BJDCTF2020]Easy MD5一个输入框,无论输入什么都没有回显,使用yakit抓包看看根据返回的数据包可以得知其sql查询语句,我们需要尝试绕过查询语句来获得线索,md5()函数中$pass参数为输入的参数,而true代表一种模式,将字符串md5哈希后转化为二进制类型 MD5语法 标准格式 md5…

【多线程】volatile关键字详解

volatile的作用volatile主要用于解决可见性和有序性的问题,但不保证原子性可见性:线程在操作变量时,会将主存中的变量拷贝一份到本地存储;修改有再找时机写回主存(不可控),这样多线程并发时会导致其他线程看到的数据和当前线程不一致 使用volatile关键字修饰变量,可使得每…

WiFiGrab教程2:一键抓包5G并使用字典破解全流程

本文使用WiFiGrab抓取5G无线网络的握手包,实验对象为自己的路由器,并结合EWSA进行字典攻击,演示暴力破解的原理和全流程操作。WiFiGrab抓包5G 本文使用WiFiGrab抓取5G无线网络的握手包,实验对象为自己的路由器,并结合EWSA进行字典攻击,演示暴力破解的原理和全流程操作。软…

phylip 中利用NJ法构建进化树

001、测试文件vcf文件(base) [b20223040323@admin2 02_NJ_tree]$ ls outcome.vcf 002、格式转换;输入文件为vcf文件run_pipeline.pl -Xms1G -Xmx5G -importGuess outcome.vcf -ExportPlugin -saveAs sequences.phy -format Phylip_Inter ## 格式转换 003、

vue的深度学习

vue的深度学习 本次学习了vue脚手架的知识,使用的是选项api,初步分析 对于脚手架目录进行简单分析 src:用于存放源码,我们一般写代码的地方,其中的app.vue是根组件,components中存放其他组件,其他组件可以加到根组件下方 <template><div class="fullName"&g…