CAN通讯学习笔记

一、拓扑结构:总线拓扑

线性总线:所有节点通过两条线(CAN_H和CAN_L) 并行连接

差分信号

  • CAN_H - CAN_L = +2V → 显性位(逻辑0)

  • CAN_H - CAN_L = 0V → 隐性位(逻辑1)

终端电阻

  • 总线两端各需120Ω电阻

  • 消除信号反射,保证信号完整性

长度与速率

  • 速率越高,允许的长度越短

  • 典型:1 Mbps时最长40米,125 kbps时可达500米

优势局限
布线简单:只需一条主干线单点故障敏感:总线断裂影响所有节点
增删节点容易:只需并联接入故障诊断复杂:需要分段排查
成本低:线缆用量少负载有限:通常最多110个节点
适合线性分布系统:如汽车车身距离受限:无中继时通常<1km

二、寻址方式:广播机制+接受过滤

广播机制(Broadcast)

“一人说话,所有人听见”

  • 发送方:不指定目标地址,将报文发送到总线

  • 物理层事实:所有节点同时收到相同的电气信号

  • 类比:就像会议室里有人发言,所有人都能听到

接收过滤(Acceptance Filtering)

“我只听我关心的”
每个CAN控制器都有硬件级的验收滤波器:

// 概念性配置示例
Filter Bank 1:
  ID Mask:   0x7FF (11位全匹配)
  Filter ID: 0x123
  Result: 只接收ID=0x123的报文

Filter Bank 2:
  ID Mask:   0x7F0 (高7位匹配)
  Filter ID: 0x200
  Result: 接收ID=0x200-0x20F的所有报文
物理信号 → 硬件滤波 → 硬件缓冲区 → 软件处理
   ↓           ↓           ↓           ↓
所有节点   配置过滤    临时存储    应用层
同时接收   丢弃无关    匹配报文    解析数据
          的报文

三、仲裁机制:线与+回流

线与逻辑(Wired-AND)

这是CAN总线的物理基础

  • 显性位(0):强制拉低总线

  • 隐性位(1):释放总线(通过电阻拉高)

  • 逻辑规则总线状态 = 所有节点输出的AND

    • 只要有一个节点发0(显性),总线就是0

    • 所有节点都发1(隐性),总线才是1

节点A输出:1(隐性)---\
节点B输出:1(隐性)--- AND → 总线=1(隐性)
节点C输出:1(隐性)---/

节点A输出:1(隐性)---\
节点B输出:0(显性)--- AND → 总线=0(显性)
节点C输出:1(隐性)---/

回读机制(Bit Monitoring)

每个发送节点必须

  1. 发送一位

  2. 立即回读总线实际电平

  3. 比较发送与接收是否一致

特性说明优势
非破坏性失败者主动退让,胜利者无损继续无带宽浪费
基于优先级ID值越小优先级越高紧急报文无延迟
实时解决在ID发送完时解决冲突确定性强
分布式无需中央仲裁器可靠性高

四、标准帧结构

图参考vector官方讲解PPT

五、五种通讯保护机制

5.1 位填充机制

基本原理

  • 规则:在帧起始(SOF)到CRC界定符之间的所有数据(包括ID、控制场、数据场、CRC场),每连续出现5个相同极性的位(5个0或5个1)后,发送节点必须自动插入一个反向极性的填充位。接收节点会自动删除这些填充位,恢复原始数据。

主要作用

  • 时钟同步:确保总线有足够的信号边沿(从0到1或1到0的跳变),以便所有节点能够同步其内部时钟,防止因微小晶振误差累积导致的失步。

  • 错误检测:为位填充错误检测提供基础。如果接收节点在解除填充时,发现有连续6个相同位,则判定为位填充错误,发送错误帧。

  • 电磁兼容性:避免长串相同位导致的电磁干扰问题。

5.2 位监控机制

基本原理

  • 核心规则:发送节点在发送每一位的同时,实时监控总线上的实际电平,并与自己刚刚发送的位进行比较。

  • 比较逻辑

    • 发送显性位(0),监听到隐性位(1) → 位错误 (Bit Error)

    • 发送隐性位(1),监听到显性位(0) → 仲裁正常(在仲裁场)或ACK确认(在ACK Slot)或位错误(非仲裁场和ACK slot)

主要作用

  1. 自我故障诊断:检测发送节点自身驱动器是否故障(无法驱动总线)。

  2. 确保发送一致性:保证发送节点实际输出的信号与总线状态一致。

  3. 支持仲裁机制:仲裁就是基于此机制实现的。

5.3 crc校验

基本原理

  • 位置:位于数据场之后,CRC界定符之前。

  • 长度:15位CRC值 + 1位CRC界定符(隐性位)。

  • 生成多项式:CAN使用特定多项式生成CRC,例如标准帧:x¹⁵ + x¹⁴ + x¹⁰ + x⁸ + x⁷ + x⁴ + x³ + 1

  • 覆盖范围:从帧起始(SOF)到数据场结束的所有位(包括填充位)。

主要作用

  1. 检测多位突发错误:CRC对总线上的突发干扰(如电磁脉冲)有很强的检测能力。

  2. 确保数据完整性:提供高概率的错误检测覆盖。

  3. 发送方计算,接收方验证:发送方计算并附加CRC,接收方重新计算并比对。

工作机制

  1. 发送节点将SOF到数据场结束的位序列作为被除数。

  2. 用生成多项式进行模2除法,得到15位余数(CRC)。

  3. 将CRC附加在报文后发送。

  4. 接收节点进行相同计算,比较结果:

    • 匹配 → 报文正确

    • 不匹配 → CRC错误,发送错误帧

5.4 帧格式校验

基本原理

检查报文的结构和格式是否符合CAN协议规范。

检查内容

  1. 固定格式位检查

    • 帧起始(SOF):必须是显性位(0)

    • 仲裁场和控制场的保留位:必须是显性位

    • CRC界定符:必须是隐性位(1)

    • ACK界定符:必须是隐性位(1)

    • 帧结束(EOF):7个连续的隐性位

  2. 帧类型一致性

    • 数据帧、远程帧、错误帧、过载帧各有固定格式

    • 检查各字段长度和位置是否正确

  3. DLC有效性

    • 数据长度码(DLC)必须在有效范围内(0-8,或扩展帧的0-64)

    • 远程帧的DLC必须与对应数据帧一致

主要作用

  1. 检测格式违规:如保留位不为显性、界定符不为隐性等。

  2. 防止畸形帧传播:格式错误的帧会被立即中断。

  3. 增强协议鲁棒性:确保所有节点对帧结构的理解一致。

5.5 校验位监控

基本原理

  • ACK Slot机制

    1. 发送节点在ACK Slot位置发送隐性位(1)

    2. 所有正确接收该帧的节点(无论是否需要该数据),必须在此位置发送显性位(0) 覆盖它

    3. 发送节点监控ACK Slot位:

      • 监听到显性位(0) → 至少有一个节点成功接收

      • 监听到隐性位(1) → 无节点确认,发送失败

主要作用

  1. 确保传输确认:提供最基本的传输成功确认机制。

  2. 检测总线节点存活:如果无节点应答,可能意味着总线断路或无活动节点。

  3. 实现闭环验证:发送方能够知道接收方是否成功接收。

特殊规定

  • 应答节点范围:所有正确接收的节点,包括:

    • 需要此ID数据的节点

    • 不需要此ID但正确接收的节点

    • 发送节点本身(如果它也正确接收)

  • 错误节点不应答:检测到错误的节点禁止发送ACK。

5.6 错误处理

当任何一层保护机制检测到错误时:

  1. 检测节点立即在下一位发送错误帧

  2. 错误帧中断当前传输

  3. 发送节点记录错误计数器

  4. 根据错误计数,节点可能进入错误主动错误被动总线关闭状态

  5. 发送节点稍后重发该报文(如果是可恢复错误)

场景模拟:

步骤1:检测到错误

  • 节点A在CRC校验失败后,在CRC界定符后的第一位开始发送错误标志。

步骤2:发送/识别错误标志

  • 节点A是主动错误状态,开始发送:000000(6个连续显性位)

  • 其他所有节点

    1. 正在正常接收,遵守位填充规则

    2. 当接收到第6个连续显性位时,立即意识到:"违规!这是错误帧!"

    3. 这个意识本身就是位填充错误检测

    4. 每个检测到此错误的节点必须立即在下一位加入,也发送错误标志

步骤3:错误标志的叠加

  • 由于多个节点几乎同时发送错误标志,总线实际上会出现6-12个连续的显性位

    • 第一个检测到错误的节点开始发6个0

    • 其他节点稍晚一点加入,延长了显性位的持续时间

  • 这个叠加确保了错误信号足够强大,不会被噪声干扰

步骤4:发送错误界定符

  • 每个节点在完成自己的6位错误标志后,开始发送8个连续的隐性位(1)

  • 总线逐渐从显性变为隐性

  • 当所有节点都看到连续的8个隐性位时,知道错误帧结束

步骤5:恢复与重试

  • 总线回到空闲状态(隐性)

  • 发送节点稍后会自动重试发送失败的报文

  • 所有节点更新各自的错误计数器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

10710

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

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

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

打赏作者

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

抵扣说明:

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

余额充值