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

CAN通信协议入门

CAN(Controller Area Network)通信协议是工业控制、汽车电子等领域极其重要的串行通信总线标准。它以其高可靠性、实时性、抗干扰能力多主机结构而著称。下面是关于系统性地入门CAN协议的整理:

一、 CAN协议的核心设计目标

  1. 可靠性: 在电磁干扰强烈的环境(如汽车引擎舱)下稳定工作。
  2. 实时性: 对传输延迟有严格要求,关键信息能优先发送。
  3. 多主结构: 没有传统意义上的“主/从”机之分,网络上任何节点都可以在总线空闲时主动发送信息(广播)。
  4. 基于优先级的总线访问: 通过非破坏性的“仲裁”机制解决多个节点同时发送的冲突,让高优先级的信息先发送。
  5. 广播通信: 一个节点发送的信息,所有其他节点都能收到(但可以选择是否处理)。
  6. 错误检测与处理: 内置强大的错误检测机制(CRC、位填充、ACK、帧检查等)和错误处理(节点自动关闭输出)。

二、 CAN协议的核心概念

  1. 差分信号:

    • CAN使用两条线传输信号:CAN_H和CAN_L。
    • 信号状态由两条线之间的电压差表示:
      • 显性电平: CAN_H - CAN_L ≈ 2V (通常代表逻辑 0)。这是总线上的“强势”状态。
      • 隐性电平: CAN_H - CAN_L ≈ 0V (通常代表逻辑 1)。这是总线上的“弱势”状态。
    • 优点: 抗共模干扰能力强(比如电源噪声同时影响两条线时,电压差基本不变)。
  2. 总线拓扑:

    • 所有节点(ECU - Electronic Control Unit)都挂接在一条总线上(CAN_H和CAN_L)。
    • 总线两端需要终端电阻(通常是120Ω),用于匹配线路阻抗,消除信号反射。
  3. 消息帧(Message Frame):

    • CAN通信的基本单位是“帧”(Frame)。节点发送数据时,是以“帧”的形式广播出去的。
    • 标准帧: 11位标识符(ID),数据域最多8字节。
    • 扩展帧: 29位标识符(ID),数据域最多8字节(使用更广泛)。
    • 关键字段:
      • 标识符: 唯一标识一个消息(在同一个网络上不能重复)。它决定了消息的优先级!ID值越小,优先级越高。 非常重要!
      • 数据长度码: 指示数据域包含的字节数(0-8)。
      • 数据域: 实际要传输的数据(0-8字节)。虽然短,但适合传输控制指令、状态信息等。
      • CRC: 循环冗余校验码,用于接收方检查数据是否正确。
      • ACK槽: 发送方会留一个位时间(ACK Slot)。所有正确接收到该帧(无CRC错误) 的节点,无论其是否需要该帧数据,都会在这个槽内发送一个显性位(0)来应答发送方。如果发送方没收到ACK,就知道发送失败,会尝试重发。
  4. 非破坏性逐位仲裁:

    • 核心机制: 当多个节点同时开始发送时,它们一边发送自己的ID位,一边监听总线状态。
    • 仲裁规则:
      • 节点发送隐性位(1),但监听到总线是显性位(0) -> 说明有更高优先级的节点在发送显性位 -> 本节点立即停止发送,转为接收模式。
      • 节点发送显性位(0),监听到总线也是显性位(0) -> 继续发送。
      • 节点发送隐性位(1),监听到总线也是隐性位(1) -> 继续发送。
    • 结果: 优先级最高(ID值最小)的帧会赢得仲裁,完整发送出去。其他节点在仲裁过程中退出发送,并在总线空闲后自动重试。这个过程不会破坏正在发送的高优先级帧的数据。
  5. 错误检测与处理:

    • CAN协议设计了5种错误检测机制:
      • 位监控: 发送节点同时监听总线,确保发送的位与读回的位一致。
      • 位填充: 为了保证同步,在连续发送5个相同极性位后,自动插入一个相反极性的位。接收方会删除这个填充位。如果检测到连续6个相同位,就认为是错误(填充规则违反)。
      • 帧检查: 检查帧格式中固定格式位(如CRC界定符、ACK界定符、帧结束等)是否正确。
      • CRC校验: 接收方独立计算CRC,并与收到的CRC比较。
      • ACK检查: 发送方检查是否在ACK槽收到了显性位。
    • 错误处理:
      • 每个节点内部有一个发送错误计数器和接收错误计数器。
      • 检测到错误时,节点会立即发送一个“错误帧”(连续6个显性位)来主动破坏当前总线上的错误传输,通知所有节点。
      • 根据错误类型(是发送错误还是接收错误)和严重程度,计数器会增加。
      • 当计数器超过一定阈值时,节点会进入不同的错误状态(错误主动 -> 错误被动 -> 总线关闭),限制其发送能力,避免故障节点持续干扰总线。

三、 CAN协议的分层模型(OSI简化版)

  • 物理层: 定义电气特性(电压、信号、线缆、连接器、终端电阻)、比特率(常见125kbps, 250kbps, 500kbps, 1Mbps)。负责实际电平转换和收发。
  • 数据链路层: 这是CAN协议的核心。包含:
    • LLC (Logical Link Control): 帧接收过滤、过载通知、恢复管理。
    • MAC (Medium Access Control): 帧封装/解封、帧编码(位填充)、错误检测/信令、仲裁、ACK应答、串行化/反串行化。定义帧结构和总线访问规则(仲裁)。
  • 应用层: CAN协议本身不定义应用层!它只负责可靠地传输原始数据帧。实际应用中需要更高层的协议来定义数据的含义、命令、状态、网络管理、节点诊断等。常见的基于CAN的应用层协议有:
    • CANopen: 广泛应用于工业自动化、医疗设备等。
    • J1939: 商用车(卡车、客车、工程机械、船舶)标准。
    • DeviceNet: 工业自动化领域。
    • ISO-TP (ISO 15765-2): 用于在CAN上传输超过8字节的长数据(如汽车诊断UDS/OBD-II)。

四、 CAN协议的特点总结

  • 优点:
    • 高可靠性和强大的错误处理能力。
    • 实时性好(基于优先级仲裁)。
    • 多主结构,灵活组网。
    • 抗干扰能力强(差分信号)。
    • 成本相对较低(双绞线即可)。
  • 缺点:
    • 数据负载较小(最大8字节/帧),传输大块数据效率低(需上层协议如ISO-TP分包)。
    • 协议本身不定义数据含义(需应用层协议)。
    • 带宽有限(最高1Mbps,实际常用500kbps或更低)。
    • 总线拓扑长度和速度成反比(1Mbps时典型长度<40米)。

五、 典型应用领域

  • 汽车电子: 发动机控制、变速箱控制、ABS、安全气囊、车身控制(门窗、灯光)、仪表盘、信息娱乐系统等。现代汽车可能有多个CAN网络(高速CAN, 低速容错CAN)。
  • 工业自动化: PLC、传感器、执行器、电机驱动器、HMI之间的通信。
  • 医疗设备: 医疗仪器内部组件通信。
  • 楼宇自动化: 电梯控制、HVAC系统。
  • 航空航天: 飞机内部子系统通信(有更严格的变种如CAN Aerospace)。
  • 船舶: 发动机监控、导航系统。
http://www.lryc.cn/news/593041.html

相关文章:

  • FPGA自学——二选一多路选择器
  • 【图像处理基石】什么是小波变换?
  • 【专题一】双指针
  • 《Origin画百图》之多分类矩阵散点图
  • 音频3A处理简介之ANS(自动噪声抑制)
  • 地级市-城市创业活力数据(1971-2024年)-实证数据
  • 【音视频协议篇】RTSP系列
  • Letter Combination of a Phone Number
  • 【Bluedroid】btif_av_sink_execute_service之服务器启用源码流程解析
  • 模块加载、ES、TS、Babel 浅析
  • Gerrit workflow
  • 云边端协同架构下的智能计算革命
  • 打造高效订单处理!ZKmall开源商城的统一履约中心架构解析
  • 车载诊断架构 --- 故障码DTC严重等级定义
  • 模电基础-电阻和功率
  • Oracle Database 23ai 技术细节与医疗 AI 应用
  • python学智能算法(二十五)|SVM-拉格朗日乘数法理解
  • 车载诊断架构 --- OEM对于DTC相关参数得定义
  • 开疆智能Profinet转ModbusTCP网关连接康耐视InSight相机案例
  • VUE2 学习笔记1
  • python爬虫之获取渲染代码
  • 【机器学习深度学习】为什么要将模型转换为 GGUF 格式?
  • 计算机网络:(十一)多协议标记交换 MPLS
  • 结合python面向对象编程,阐述面向对象三大特征
  • 软件设计师之开发模型
  • HTML5中的自定义属性
  • 从Prompt到结构建模:如何以数据驱动重构日本语言学校体系?以国际日本语学院为例
  • World of Warcraft [CLASSIC] The Ruby Sanctum [RS] Halion
  • 在 .NET Core 中创建 Web Socket API
  • Kotlin泛型约束