当前位置: 首页 > news >正文

CAN知识大全——带你读懂CAN数据手册

一、CAN的通信特点

1.can通信:串行、异步、半双工通信;

2.有一对差分信号(CANH和CANL,有的也叫CHAN和CHAL);

3.实际系统中可使用多路独立 CAN 总线,分别控制不同功能模块,使网络结构更清晰。为统一解析报文含义,我们会人为使用.dbc CAN 数据库文件,定义 ID 与数据对应的物理意义,类似于在串口通信中的数据包格式(包头、包尾、校验位、数据位等),方便各节点统一解析数据,保证每一个节点或者部门都有自己的通信协议,不会互相干扰。

4.通信速率有低速、高速还有CAN FD三种,了解即可。

对比维度低速/容错CAN高速CANCAN FD
核心定位简单、不关键的设备控制实时性要求高的关键控制大数据量、高效率的升级网络
传输速率最高 125 kbps最高 1 Mbps仲裁段 ≤1 Mbps,数据段最高 8 Mbps
单帧数据量最多 8 字节最多 8 字节最多 64 字节
物理层容错收发器 (如 TJA1055)高速收发器 (如 TJA1044)高速收发器,物理层与高速CAN基本相同
典型应用车窗、座椅、灯光控制发动机、变速箱、ABS等动力系统ADAS车载诊断与软件升级(OTA)网关

5.CAN 控制器(注意是控制器,不是收发器,控制器在板子内部,收发器是我们需要自行购买的联通两边的通信中介)根据两根线(CANH和CANL,有的也叫CHAN和CHAL)上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。

至于电平定义,分为显性电平和隐性电平,就是逻辑1和逻辑0,但是高速can和低速can的显性电平和隐性电平的定义不同,并且他们的硬件电路也有所不同。

对比维度高速CAN (ISO 11898-2)低速/容错CAN (ISO 11898-3)
显性电平 (逻辑0)CAN_H = 3.5V, CAN_L = 1.5V
电压差=2.0V
CAN_H = 3.6V, CAN_L = 1.4V
电压差​=2.2V
隐性电平 (逻辑1)CAN_H = 2.5V, CAN_L = 2.5V
电压差​=0V
CAN_H = 0.3V, CAN_L = 4.7V
电压差=−4.4V
差分电压范围显性: 0.9V ~ 2.0V
隐性: -1.0V ~ 0.5V
显性: 约1.5V ~ 3.0V
隐性: 约-5.0V ~ -1.5V

二、CAN的数据帧格式及其位时序与位填充

数据帧格式

CAN的帧类型一共有4种,数据帧,远程帧,错误帧,过载帧。实际开发中,主要关注的是数据帧的收发。远程帧在某些应用(如诊断、轮询式数据采集)中也会用到。而错误帧和过载帧完全由CAN控制器硬件处理,你只需要通过状态寄存器去判断是否发生过错误即可。

你想做的事应该用的帧类型
发送一个数据给其他节点数据帧
请求其他节点发数据给我远程帧
检测到总线通信异常错误帧(硬件自动完成,无需软件干预)
接收太慢,让对方等一等过载帧(硬件自动完成)

往下我们主要聚焦数据帧的格式,一个数据帧有7个段组成,

| 帧起始 | 仲裁段 | 控制段 | 数据段 | CRC段 | 应答段 | 帧结束 |
段名长度关键内容一句话作用
帧起始1位逻辑0喊"准备开始"
仲裁段12位11位ID + RTR

ID标识消息内容和优先级

数字越小优先级越高

数据帧:RTR = 0

远程帧:RTR = 1

控制段6位IDE=0 + r0=0 + 4位DLC

告诉对方数据长度

IDE=0,为标准帧,反之为扩展帧

r0为保留位,固定为0

DLC为数据长度

数据段0-8字节实际数据真正要传的内容
CRC段16位15位校验 + 1位界定符检查传输有无错误,有误则发送错误帧
应答段2位ACK槽 + ACK界定符接收方喊"收到了"
帧结束7位逻辑1说"发完了"

位时序和同步方法

位时序

CAN总线不使用传统的时钟线,每个时钟的所发送的一个数据位通过位时序拼成,用于防止因为传输距离过长或者信号干扰导致的信号采集延迟或提前。一个标称位时间(Tq)被分成4个段:

段名作用占比
同步段SS让总线上的各个节点对齐,用于检测边沿固定1Tq
传播段PTS补偿信号在总线上的物理传播延迟1~8个Tq
相位缓冲段1 PBS1补偿边沿相位误差,采样点通常设在此段末尾1~8个Tq
相位缓冲段2 PBS2补偿相位误差,决定下一个位开始的时间1~8个Tq

采样点在PBS1和PBS2中间。

关于采样点,涉及到CAN控制器的同步方法:硬同步和再同步。

同步方法用于校准采样点,防止采样点偏移PBS1和PBS2中间。

同步方法

硬同步就是在数据帧的一开始,直接强行调整采样点,此后不在进行硬同步。

再同步就是在数据帧后续中,并且再同步只认 隐性 → 显性(1→0)的跳变,也就是下降沿!通过动态调整自己的PBS1和上一个的PBS2的Tq,持续调整采样点。

一般在硬同步之后还会继续调用再同步,防止持续发送数据造成的误差,起到一个类似于“时钟”的作用,对各节点的“时序”进行同步。

位填充

概念

发送端规则:从帧起始(SOF段)到校验位(CRC段),当can发送节点连续发送5个一样的电平(连续5个显性位或者5个隐性位),就会强制插入一个相反的电平的填充位

接收端规则:检测接收到连续5个一样的电平后紧跟着一个相反电平,会自动删除这个填充位,若检测接收到连续6个一样的电平后判定为位填充错误,并由检测到错误的节点(节点可以是接收端也可以是发送端,这里是接收端发现错误,由接收端发送)向CAN总线发送错误帧,告诉总线上所以节点这一帧数据错误,作废。

作用

1.错误通知机制:当节点检测到位填充错误、CRC 错误等任意 CAN 错误时,会强制发送一个长度为6位的0信号(显性位),以此向总线上的其他节点提醒错误当前帧出错了。

2.便于同步时钟:CAN总线没有单独的时钟线来保证各节点的交流,需要靠电平的调变来产生变化,然后各节点进行对齐;倘若没有位填充,数据一直发送1111......时间一长可能就会发生同步丢失,导致数据出错;

3.至于位填充怎么让各节点同步更新,结合上面关于位时序再同步的知识,CAN 再同步只认 隐性 → 显性(1→0)的跳变,所以在出现位填充这个相反电平的电平调变后,必然会出现一个下降沿,就会趁此下降沿进行再同步。

三、CAN的发送邮箱与接收FIFO

CAN 发送邮箱(Transmit Mailbox)接收 FIFO(Receive FIFO)是 CAN 控制器(内部核心的硬件缓存与调度机制,专门解决 “CPU 速度快、CAN 总线慢” 的矛盾,实现异步、可靠、不丢帧的通信。

CAN的发送邮箱

STM32中,CAN有3个发送邮箱,可以了简单理解成一个长度为三的数组,每一位代表一个邮箱,每个邮箱只能存一帧报文,用来暂时存储CAN要发送的数据,这样就不需要发一帧数据还要重新上传一帧数据,而是能实现一次发送3帧数据。

CPU能手动发送指令,告诉CAN控制器“你可以发送了”,此时置位TXRQ(发送请求),CAN硬件会自己完成仲裁+发送+错误重发等,直到邮箱空闲(⚠️邮箱在发送期间会被CAN硬件占用,CPU控制不了),期间CPU只负责把要发送的数据丢进邮箱,不需要等待或者CPU自己发送,缓解CPU压力

CAN的接收FIFO

STM32中,CAN有2个接收FIFO,深度为3帧,可以理解成2个长度为3的队列(FIFO),在经过过滤器(下面会讲)过滤ID后,才能进入FIFO,按照先到先读取的顺序处理数据。

作用:用于缓存突然大量的接收的数据,防止数据被覆盖,便于接收端的CPU慢慢处理数据,并且由于有2个FIFO,可以设置一个FIFO为紧急组,一个FIFO为普通组,实现急缓分流,同时FIFO的每一个状态(满,半满,新帧)能出发中断,不需要一直轮询,所以也能缓解CPU压力

四、CAN的过滤器

概念

由于CAN通信是广播式的,所有节点都能收到信息,为了防止数据传输错误,就需要ID来辨别是要发送给哪个节点,而辨别的工作就靠过滤器完成,在报文进入FIFO之前会现在过滤器筛选ID,ID不对直接放弃该帧数据。

结构组成及其模式

STM32F103系列共有14个过滤器,互联型系列有28个过滤器。每个过滤器有2个32位的寄存器,分别是Filter ID寄存器和Filter Mask寄存器。2种寄存器在不同的模式下有不同的作用。

掩码模式:掩码用于筛选你不想对比的位,比如你想发的ID是11223344,掩码是000011,意思就是只要发送过来的ID是xxxx44,只需要后2位对就行,如果掩码是111111,就是只有11223344才能通过。所以在掩码模式下,c就作为存放“11223344”这个目标ID值的寄存器,Filter Mask寄存器作为存放掩码“000011”的寄存器,对应0的位不必一样,对应1的位必须一模一样。

列表模式:就是Filter ID寄存器和Filter Mask寄存器作为最基本的寄存器,存放你想通过的ID,没有掩码,传输过来的帧数据的ID必须和寄存器里的一模一样才能进入。

宽度:在Filter ID寄存器和Filter Mask寄存器中还有宽度的概念,我们知道,Filter ID寄存器和Filter Mask寄存器本质都是一个位宽32的寄存器,而一帧数据中的ID段长度是11位,32位远大于11位的存储空间,所以为了多存储目标ID,就需要把32位空间分成2份,每份16位(寄存器都是8/16/32 位对齐的,16位最合适)

这样1个32位寄存器就能存储2个目标ID,提高效率;要是遇到的是29位的扩展ID,就是一个32位寄存器存储一个目标ID。(在掩码模式和列表模式都适用。)

五、CAN的工作模式及其测试模式

工作模式

CAN的工作模式分为初始化模式、正常模式和睡眠模式,而正常模式也纳入在测试模式。

初始化模式:就是CAN总线自己初始化一些参数,不会参与发送、接收,不理会总线发生什么。

正常模式:就是我们常用的模式,发送接收和仲裁等前面提到的所有,都在这个模式完成。

睡眠模式:睡眠模式就是总线长时间没消息了就会进入睡眠模式,等总线有消息了或者代码唤醒了再进入正常模式。

测试模式

正常模式:会把消息发往总线,会正常进行接收和发送。

静默模式:相当于只接受不发送,监听者的身份。

回环模式:相当于正常模式,会把消息发往总线,会正常进行内部接收、外部接收和发送,但是会把数据同样的又向自己发送一遍,进行自测。

静默回环模式:就相当于把数据发给自己,不往外发也不接收外部,就自测。

模式发往总线自收接收外部影响总线典型用途
正常正常通信
静默总线监听
回环自测 + 总线
静默回环不干扰在线自测

六、CAN的仲裁

仲裁的概念

CAN 总线是多主总线—— 任何节点想发就发,不需要谁批准。如果两个或多个节点同时开始发送,就会产生冲突。仲裁就是解决冲突的机制:让 ID 优先级更高的帧优先发送,低优先级帧主动退让。整个过程完全硬件自动完成,不需要 CPU 参与,不丢数据,不冲突。

仲裁的原理

⚠️首先我们要搞清楚:显性电平是0,隐性电平是1!显性电平0强,会覆盖隐性电平1.

其次,仲裁只发生在ID段,根据ID的值来比较谁优先值高

举例:每个发送节点都在做同一件事:我发一位 → 立刻读总线电平 → 看和我发的一不一样,总线只是一根线,谁发 0 就拉低,谁发 1 就放开,总线的最终电平 = 所有节点发出来的 “与” 结果只要有一个节点发 0 → 总线就是 0,所以假设节点A,B,C的ID分别为1001,0100,0001,那么他们的优先级从高到低就是C,B,A。等C数据发送完成后,B和A或者其他新加入的节点再进行仲裁。

整个过程非破坏性、硬件自动、无冲突、不丢帧。

http://www.jsqmd.com/news/639070/

相关文章:

  • MobileNetSSD_deploy.caffemodel下载地址
  • LightOnOCR-2-1B快速上手:使用LightOnOCR-2-1B构建微信小程序OCR接口
  • ChatGPT 深度实测:到底有没有?功能全不全?版本新不新?
  • AI智能体视觉检测系统(TVA)工作原理系列(十二)
  • 瑞祥商联卡回收全攻略,高效又安全! - 团团收购物卡回收
  • 别再盲目找!适合你的CRM系统,从这几个选项开始选 - 毛毛鱼的夏天
  • 软件工程师如何5年内薪资翻倍?真实案例揭秘
  • 黑丝空姐-造相Z-Turbo项目文档自动化:用LaTeX排版生成报告与论文
  • 如何在Windows上免费创建10个虚拟显示器:终极解决方案指南
  • 2026年靠谱的婚姻律师推荐,宁波处理非婚生子女抚养纠纷律师哪家好 - 工业品网
  • 【Hyper-V】Windows11家庭版如何解锁并启用Hyper-V功能
  • 长芯微LPA8421完全P2P替代AD8421,是一款低成本、低功耗、极低噪声、超低偏置电流、高速仪表放大器
  • 知网AIGC标红怎么救?10款免费降AI工具实测指南
  • Next.js从入门到实战保姆级教程:错误处理与加载状态
  • 科研数据处理:结合MATLAB信号分析与Qwen3-ASR-0.6B语音识别
  • 从依赖“人治”到 “法治”:一套让流程自己跑起来的绩效驱动模型
  • 期刊 | 《电讯技术》详解
  • 免费论文消AI痕迹+降重:6款实用工具亲测推荐
  • 从理论到芯片:手把手解析冗余数系统(Redundant Number System)在AI加速器中的应用
  • 终极Python自动化购票解决方案:告别手动抢票的完整操作指南
  • 2026年靠谱的门窗品牌推荐,聊聊珠海皇派门窗规模扩张速度与耐用性 - 工业设备
  • 基于Phi-3-mini-4k-instruct-gguf的MySQL智能运维:安装配置与性能调优问答
  • 歌词滚动姬:免费开源LRC歌词制作工具完整指南
  • 基于cnn卷积神经网络的yolov5+deepsort目标检测+目标跟踪(教程+代码)
  • Kate文本编辑器
  • Claude Code全解析:去哪找、怎么用、如何快速获取
  • AI在医疗测试中的应用:伦理红线
  • 谈谈SP系列注塑机厂家,注塑机源头厂家、实力厂家哪家性价比高 - 工业推荐榜
  • 【RAG】【vector_stores038】Firestore向量存储示例
  • 3步快速实现百度网盘高速下载:免费直链解析工具完全指南