协议 - CAN详解


【全文大纲】 : https://blog.csdn.net/Engineer_LU/article/details/135149485


1 . 概要

1 . CAN协议在工业,汽车领域应用偏多,这里尽量往以往风格按物理层,协议层,应用层分析
2 . CAN协议属于半双工通信协议, 由于风格简洁,此篇文章适合入门
3 . 接下来从从下到上深入浅出解析

2 . 物理层

  1. 结构简洁,每个节点只需两根线通信CAN_H与CAN_L, 注意MCU一般只有控制器,因此需要CAN收发器,对于芯片端只有TX和RX, 经过CAN收发器变成CAN_H与CAN_L
状态CAN_H 对地电压CAN_L 对地电压差分电压 Vdiff (CAN_H - CAN_L)逻辑电平
隐性 (逻辑1)≈2.5V (典型范围 2.0V - 3.0V)≈2.5V (典型范围 2.0V - 3.0V)≈ 0V; 通常Vdiff<0.5V1
显性 (逻辑0)≈3.5V (最低通常 > 3.0V)≈1.5V (最高通常 < 1.5V)+2V (通常 > 0.9V, 标准要求 1.5V ~ 3.0V)0
  1. 以下这种结构是开环结构的CAN总线网络,这种CAN总线网络由ISO11519-2标准定义,定义为低速,远距离的CAN网络,通信速率最高125kbit/s。在40kbit/s速率时,总线最长通信距离为1000m, 还有一种是基于ISO11898定义的高速,短距离闭环结构的CAN网络,不进行2.2K欧串联,而改成每个设备终端CAN_H与CAN_L并联120R的电阻,这种结构通信速率为125kbit/s到1Mbit/s,在1Mbit/s通讯速率时,总线最长为40m,注意这里描述的距离为总线内最远的两个设备之间的距离

在这里插入图片描述

  1. 关于物理层的防护,CAN收发器芯片(如TJA1050)内部集成了一定的ESD保护(通常能达到±8kV HBM,人体模型)但这主要针对装配和日常操作中的静电。在真实的车载或工业现场,总线会面临更严重的威胁,因此要考虑在收发器上增加TVS管和ESD管,而TVS管和ESD管的应用场景如下表,对于大多数应用,在CAN_H和CAN_L对地之间各接一个双向TVS管(如SMBJ24A或SMBJ30A),并在总线入口串联一个共模扼流圈,已能提供优秀保护。专用ESD管常集成在带有集成保护的增强型收发器(如TJA1051T)中,所以CAN收发器外围通常需要并联TVS管(必选项),并根据应用环境考虑是否增加专用ESD管(可选项)
特性TVS管(瞬态电压抑制器)ESD保护二极管(专用)
核心用途吸收高能量浪涌和瞬态过压应对高电压、快速的静电放电
响应速度极快(皮秒级),但通常略慢于专用ESD管极快(皮秒级)
箝位电压 (Vc)相对较高。需根据总线工作电压(如12V/24V系统)选择,如选择SMBJ24A(箝位约38.9V)非常低(如5V),旨在将电压牢牢限制在收发器引脚绝对最大额定值之下
典型封装/功率功率较大(如400W、600W、1500W),封装如SMB、SMC功率较小,封装小巧(如SOD-923)
在CAN电路中的角色主力防护,抵御浪涌和EFT精细防护,在TVS之后提供第二级、更低箝位的保护,或用于空间有限、仅需防静电的场合

3 . 协议层

  1. 标准CAN2.0格式如下 :
    在这里插入图片描述

  2. CAN FD格式如下 :
    在这里插入图片描述

位字段位置(经典CAN)位置(CAN FD)值/含义作用解析
SOF帧起始帧起始显性0启动同步。唯一,标志一帧开始,用于硬同步总线节点。
标准标识符 (Std ID)SOF之后, 在标准帧中位于仲裁场起始 11位同左范围:0x000 - 0x7FF1. 报文标识:唯一标识报文的数据内容(如“发动机转速”)。
2. 决定优先级:数值越小,优先级越高。仲裁时从MSB开始逐位比较,“显性0”胜出。
3. 过滤基础:接收节点根据此ID设置硬件过滤器,决定是否接收
扩展标识符 (Ext ID)在扩展帧中, 位于 SRR、IDE 位之后 29位同左范围:范围:0x00000000 - 0x1FFFFFFF1. 扩展标识:提供海量ID资源,满足复杂网络需求。
2. 复合优先级:仲裁时先比较11位基础ID,完全相同时再比较后续的SRR/IDE位。这确保了在基础ID相同的情况下,标准帧比扩展帧优先级更高。
3. 结构化寻址:可将高11位定义为“功能模块”,低18位定义为“具体信号”,实现层次化管理。
RTR/RSS标准帧:ID后第12位
扩展帧:18位扩展ID后
经典CAN帧格式同左
FD帧中作用不变
数据帧:显性0
远程帧:隐性1
功能标识。区分该帧是携带数据还是请求数据。你之前的理解基本正确,但远程帧的RTR是隐性1,不是显性0。
SRR仅存在于扩展帧,位于标准帧RTR位相同位置(第12位)仅存在于扩展帧,位置同左隐性1替代占位符。仅为确保在ID前11位相同时,标准数据帧比扩展帧优先级更高(因显性0 > 隐性1)。本身无功能意义,因此作为占位符。
IDE标准帧:RTR之后
扩展帧:SRR之后
位置同左标准帧:显性0
扩展帧:隐性1
标识符扩展。标识此帧是11位标准帧还是29位扩展帧。
R0控制字段中的保留位在CAN FD帧中,BRS、ESI位占据了这些位置经典CAN:保留(常为显性0)标准帧时R0为隐性1时则当前帧为CAN FD,否则是CAN 2.0
R1控制字段中的保留位在CAN FD帧中,BRS、ESI位占据了这些位置经典CAN:保留(常为显性0)标准帧时R1为隐性1时则当前帧为CAN FD,否则是CAN 2.0
EDL经典CAN中无此位扩展帧IDE位之后,或标准帧 R0 位的位置显性0:经典CAN帧
隐性1:CAN FD帧
扩展数据长度。CAN FD的“总开关”。为1表示此帧是CAN FD帧,后续将按FD规则解析BRS、ESI及扩展DLC。
BRS经典CAN中无此位EDL位之后隐性1:启用数据段波特率切换
显性0:不切换
波特率切换开关。仅在EDL=1(CAN FD帧)时有效。决定数据段是否切换到更高的预设波特率。
ESI经典CAN中无此位BRS位之后隐性1:发送节点处于被动错误状态
显性0:处于主动错误状态
错误状态指示。发送节点主动向总线报告自身的错误等级,便于网络监控。
DLCIR0之后,4位BRS/ESI之后,4位经典CAN:0-8,直接对应数据字节数
CAN FD:0-15,通过查表对应0-64字节
数据长度码。编码数据段的字节数。CAN FD通过扩展编码实现最大64字节。
CRC数据段之后,15位+1位界定符数据段之后,17或21位+1位界定符基于特定多项式计算(多项式:x¹⁵ + x¹⁴ + x¹⁰ + x⁸ + x⁷ + x⁴ + x³ + 1)循环冗余校验。用于验证帧传输的正确性。经典CAN用15位CRC;CAN FD因数据变长,采用更强大的17位(数据≤16字节)或21位CRC(数据>16字节)。界定符为隐性1,用于分割ACK。
ACKCRC界定符之后,2位(ACK槽+ACK界定符)同左ACK槽:发送方发隐性1,接收方用显性0覆盖应答
ACK界定符:固定隐性1
应答场。任何正确接收到该帧(CRC正确)的接收节点,都会在ACK槽发送显性0来应答发送方,告知“我已正确收到”。这是对所有帧(数据帧、远程帧、错误帧)的应答,不专用于RTR。界定符用于分割。
EOFACK界定符之后同左7个连续的隐性1帧结束。固定7位隐性1,标志一帧正常结束。期间总线必须保持隐性,否则会触发错误。

4 . 应用层

  1. 实际报文波形如下
    在这里插入图片描述

  2. 芯片自带CAN控制器,外围电路需搭配一个CAN收发器;

  3. 关于多节点通信CAN依靠ID段进行仲裁,按照逻辑“0”进行,谁的“0”多,谁可以继续

  4. 一般有传输完成一帧中断(有芯片分为高优先级和低优先级的报文缓存,分开两个标志位),接收到一帧报文中断(ID仲裁正确才会响应),接收slots阈值警告中断,接收溢出中断(此时一般可以配置丢弃老报文还是新报文,有ACK槽回应才会触发,如果是自应答环回模式则不需要)

  5. 数据帧 (Data Frame) = “我这里有数据,发给大家。” (推模式,主动广播数据),是携带数据的报文,用于主动广播信息。仲裁失败会转为接收;

  6. 远程帧 (Remote Frame) = “谁有这个ID的数据?请发给我一份。” (拉模式,主动请求数据),是不携带数据的报文,用于主动请求特定ID的信息。仲裁失败同样会转为接收。

  7. 基于CAN底层协议可以用CAN OPEN来管理一个CAN网络,从而软件层面稳定通信

5 . 帧同步与仲裁机制

  1. CAN规定,节点只有在总线空闲时才能开始发送。总线空闲定义为检测到11个连续的隐性位(也就是帧间间隔,包括EOF的7个隐性位和3个隐性位的帧间间隔
  2. 在总线空闲期,如果有两个或更多节点“几乎同时”决定发送,它们都会在各自的下一个位时间起点发出SOF的下降沿。由于信号传播速度极快,这些下降沿在总线上会叠加成一个下降沿。所有节点(包括这些发送节点)都同步到这个唯一的下降沿,然后一同进入仲裁场,通过比较ID逐位竞争。输者退出发送转为接收,赢者继续发完剩余部分
  3. 一个节点(A)已经发出了SOF并开始了仲裁场,此时另一个节点(B)才想发送。B的控制器会检测到总线已不是空闲状态(没有连续的11个隐性位),因此根本不会启动发送流程。它会将自己的发送请求挂起,直到检测到完整的EOF和帧间间隔,总线恢复空闲后,才尝试参与下一轮的竞争
  4. CAN的ID可以是你需要的任何二进制值(标准帧11位:0x000-0x7FF;扩展帧29位:0x00000000-0x1FFFFFFF)。设计时,我们只关心ID的数值大小,因为:
    ID数值越小,其二进制表示中高位的“显性0”就越多,优先级就越高,例如关键安全报文(如刹车指令)分配非常小的ID(如0x001),确保绝对优先,普通状态报文(如温度上报)分配较大的ID(如0x500),在总线空闲时发送。
  5. ID仲裁机制 : 例如设备A的ID : 0B 000 000 0001 和设备B的ID : 0B 101 0000 0000比较,在最高位开始比较设备B就被设备A比下去了,接下来设备B会停止继续发送数据,退出这一帧的通信,因此每个节点将自己的发送位与监听到的总线位实时比较若一致会继续发送,否则立即停止对CAN_H和CAN_L线的输出驱动,从“发送状态”转为“接收状态”,放弃本轮发送竞争,等待当前帧结束,B会完整地作为接收方,监听并接收胜出者(A)发来的整帧数据。之后,在总线空闲时,B可以重新尝试发送它未成功的帧
  6. 在仲裁阶段,所有参与竞争的节点都在“边发边听”,因此中途仲裁失败了后,还能实时“听”出胜出者的完整ID,因此仲裁失败会从“发送状态”转为“接收状态”

6 . CAN的六种模式

1. 正常模式
描述 : 控制器完全接入网络,可主动发送和接收报文,参与总线仲裁和错误管理,控制器强制TX引脚保持隐性(1), 不驱动任何信号。收发器处于正常接收状态,所以RX能收到总线信号
应用:所有节点的标准运行模式

2. 只听模式 (Listen-Only)
描述:控制器只接收,不发送任何报文(包括ACK位和数据帧)。它像一个“沉默的监听者”,用于分析总线流量而不产生任何影响
应用:网络诊断工具、新节点在接入活跃网络前的总线活动学习、避免故障节点干扰总线

3. 待机模式 (Standby / Sleep)
描述:控制器和收发器进入低功耗状态,关闭大部分功能。通常需通过总线活动或本地唤醒信号来恢复
应用:车载节点在车辆熄火后的低功耗休眠

4. 内部回环模式 (Internal Loopback)
描述:控制器的TX引脚在内部直接连接到RX引脚,绕过外部收发器。发送的帧被立刻自己接收。与物理总线完全隔离
应用:软件自检。在开发初期,无需焊接外围电路即可测试CAN驱动、通信协议栈是否正常

5. 外部回环模式 (External Loopback)
描述:控制器正常驱动TX引脚,但将收发器配置为环回状态,使TX信号在收发器内部直接返回到RX引脚。收发器不驱动物理总线,当 CAN 运行在外部回环模式下时,如果 MCU 设备接入总线,那么 MCU 会接收到自己发送的报文和外部报文,且中断正常置起;若 MCU 没有接入总线,那么若将 CAN_TX 与 CAN_RX 连接且将 SACK 位写 1,MCU 也会接收到自己发送的报文且中断正常置起,因此外部回环模式 只有集成了PHY才能真正实现,如果用外接的PHY其实就跟普通模式一样
应用:硬件自检。验证从MCU的TX/RX引脚到收发器芯片的电路连接和焊接是否正常

6. 外部自应答环回模式 (Self-Reception / Automatic Retransmission Disable)
描述:这是最特殊的一种。节点正常驱动总线发送帧,同时自己也接收这帧,并且在内部自动生成ACK应答位(而不是等待其他节点应答)。因此,对于总线上的其他节点,这是一次完全正常的发送;但对于发送节点自身,它完成了一次自发自收自答的闭环测试,和普通模式的区别是普通模式节点发送后,依赖至少一个其他节点在ACK槽发显性0来应答,否则会报错并重发,而自应答环回模式不会报错
应用:全链路自检且不干扰网络。常用于在系统启动时,在不干扰总线的情况下,快速验证自身CAN接口(控制器+收发器+连线)是否完好; 在“单节点”网络或调试时,无需两个节点即可测试通信;

技术交流QQ群 : 745662457
群内专注 - 问题答疑,技术研究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客 - L U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值