CAN通信协议基础教程:原理、架构及应用

目录

前言

一、CAN通信协议概述

1.定义与起源

2.主要特点

3.应用领域

二、CAN通信协议的物理层

1.物理介质

2.电气特性

3.连接方式

三、CAN通信协议的数据链路层 

数据帧结构

错误检测与处理

仲裁机制

位时序与同步

四、CAN通信应用实验


前言

在当今的电子系统中,通信协议是实现设备之间高效、可靠交互的核心技术。从简单的传感器网络到复杂的汽车电子系统,通信协议都扮演着至关重要的角色。CAN(Controller Area Network,控制器局域网)通信协议作为一种高性能的串行通信协议,因其卓越的可靠性和灵活性,被广泛应用于汽车电子、工业自动化等领域。本文将解析CAN通信协议的原理、架构和应用,为初学者提供一个系统的学习框架,也为有一定基础的读者梳理知识要点,加深理解。文中不足的地方还请大家多多指点。

一、CAN通信协议概述

1.定义与起源

  • CAN(Controller Area Network)是一种异步串行通信协议,主要用于嵌入式系统中的设备通信。它最初由德国Bosch公司于1986年开发,旨在满足汽车电子控制系统对高可靠性和实时性的需求。

  • 随着时间的推移,CAN协议逐渐被标准化为国际标准ISO 11898,并广泛应用于汽车、工业自动化、航空航天等领域。

2.主要特点

  • 高可靠性:CAN协议设计了多种错误检测和处理机制,能够在恶劣的电磁环境中保持稳定通信。例如,通过循环冗余校验(CRC)和位填充技术,可以有效检测和纠正传输错误。

  • 多主通信:CAN总线支持多个节点同时连接,每个节点都可以作为主节点发起通信。这种多主结构使得总线利用率更高,通信更加灵活。

  • 实时性:CAN协议通过优先级仲裁机制,确保高优先级的消息能够优先传输,从而满足实时控制的要求。

  • 错误检测与处理机制:CAN协议定义了多种错误类型(如位错误、填充错误、CRC错误等),并通过错误帧进行错误报告和纠正。每个节点都具备独立的错误检测能力,能够在检测到错误时立即发送错误帧,通知其他节点。

3.应用领域

  • 汽车电子:CAN总线是现代汽车电子控制系统的核心通信协议。它用于连接发动机控制单元(ECU)、车身电子模块(如车窗、车门控制)、安全系统(如气囊、ABS)等。例如,发动机控制单元可以通过CAN总线将发动机状态信息发送给仪表盘,同时接收来自车身控制模块的指令。

  • 工业自动化:在工业自动化领域,CAN总线用于连接传感器、执行器和控制器。例如,在分布式控制系统中,多个传感器可以将采集到的数据通过CAN总线发送给中央控制器,控制器根据这些数据进行逻辑处理后,再通过CAN总线向执行器发送控制指令。

  • 其他领域:除了汽车和工业自动化,CAN协议还被应用于航空航天、医疗设备、机器人等领域。例如,在航空航天领域,CAN总线用于连接飞机的航电系统和飞行控制系统,确保飞行数据的可靠传输。

二、CAN通信协议的物理层

1.物理介质

  • 双绞线:CAN总线通常使用双绞线作为物理传输介质。双绞线具有良好的抗干扰能力,能够有效抑制电磁干扰(EMI),同时成本较低,适合长距离传输。在汽车和工业自动化应用中,双绞线是首选的物理介质。

  • 其他介质(可选):在一些特殊场景下,如需要更高的抗干扰能力或长距离传输时,也可以使用光纤作为物理介质。光纤具有更高的抗电磁干扰能力和更长的传输距离,但成本较高。

2.电气特性

  • 信号电平:CAN总线使用差分信号传输,通过两条信号线(CAN_HCAN_L)来表示逻辑状态。在逻辑“0”(显性)状态下,CAN_H和CAN_L之间的电压差为2V左右;在逻辑“1”(隐性)状态下,两条信号线的电压差接近0V。这种差分信号传输方式能够有效抵抗共模干扰。

  • 总线状态:CAN总线定义了两种基本状态:显性状态隐性状态。显性状态表示逻辑“0”,具有更高的优先级;隐性状态表示逻辑“1”,在总线空闲时为默认状态。这种状态定义是CAN协议位仲裁机制的基础。

3.连接方式

  • 终端电阻:为了防止信号反射和匹配总线阻抗,CAN总线的两端需要连接终端电阻。通常,终端电阻的阻值为120Ω,能够有效减少信号在总线末端的反射,提高通信的可靠性。

  • 节点连接:每个CAN节点通过CAN收发器连接到总线上。收发器的作用是将节点的逻辑信号转换为适合总线传输的差分信号,同时将总线上的差分信号转换为节点可以识别的逻辑信号。常见的CAN收发器芯片有TJA1050(如下图)等。

三、CAN通信协议的数据链路层 

CAN数据链路层的核心特性包括灵活的帧结构、强错误检测、高效仲裁和同步机制,使其成为高噪声环境中可靠通信的首选协议。

  • 数据帧:携带实际数据,包含标准帧(11位标识符)和扩展帧(29位标识符)两种格式。
  • 远程帧:请求节点发送特定数据,无数据字段。
  • 错误帧:用于通知总线错误,包含错误标志和错误界定符。
  • 过载帧:在接收节点未准备好时插入延迟。

数据帧结构

  • 仲裁域:包含标识符(ID)和RTR位(区分数据/远程帧)。
  • 控制域:包含IDE位(标准/扩展帧标识)和数据长度码(DLC,0-8字节)。
  • 数据域:实际传输的数据(最多8字节)。
  • CRC域:15位CRC校验和1位CRC界定符。
  • ACK域:应答位和应答界定符。
/* CAN 数据帧结构体 */
typedef struct {
    uint32_t StdId;        /*!< 标准标识符 */
    uint32_t ExtId;        /*!< 扩展标识符 */
    uint8_t IDE;           /*!< 标识符扩展(0表示标准帧,1表示扩展帧) */
    uint8_t RTR;           /*!< 远程传输请求(0表示数据帧,1表示远程帧) */
    uint8_t DLC;           /*!< 数据长度代码,表示数据字段的长度(0-8字节) */
    uint8_t data[8];       /*!< 数据字段,存储实际传输的数据,最多8字节 */
    uint8_t FMI;           /*!< 过滤器匹配索引 */
} CAN_FrameTypeDef;

错误检测与处理

数据链路层提供多重错误检测机制:

  • CRC校验:15位循环冗余校验检测数据传输错误。
  • 帧检查:固定格式位(如帧结束、ACK间隙)的违规检测。
  • 应答错误:发送节点未收到ACK时重传。
  • 位监控:节点发送与回读电平不一致时触发错误。

错误计数器(TEC/REC)超出阈值时,节点进入被动错误状态或总线关闭状态。

仲裁机制

基于非破坏性逐位仲裁(CSMA/CA+AMP):

  • 显性电平(逻辑0)优先于隐性电平(逻辑1),线与逻辑。
  • 低ID帧在仲裁中胜出,高ID帧自动退出发送。
# 仲裁过程示例(简化逻辑)
def arbitration(id1, id2):
    for bit in range(11):  # 标准帧11位ID
        if (id1 & (1 << bit)) != (id2 & (1 << bit)):
            return "ID1 wins" if (id1 & (1 << bit)) == 0 else "ID2 wins"
    return "IDs are identical"

位时序与同步

数据链路层通过位时间(Bit Time)控制通信速率,分为:

  1. 同步段(Sync Segment):硬同步调整。
  2. 传播段(Propagation Segment):补偿物理延迟。
  3. 相位缓冲段(Phase Buffer Segments):软同步调整。

典型位时间配置(1 Mbps速率):

  • 1个时间量子(Tq) = 1 / (时钟频率 × 分频因子)
  • 位时间 = 8 Tq(Sync=1, Prop=3, Phase1=2, Phase2=2)

四、CAN通信应用实验

这一部分后续会出一篇关于ESP32实现CAN通信的文章,敬请期待~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值