CAN (Controller Area Network) 通信,作为一种高效、可靠的串行通信协议,已经在工业控制和汽车电子领域占据了不可替代的地位。它不是一个简单的点对点连接,而是一个复杂的、容错能力极强的网络系统。本篇文章将围绕CAN通信的核心疑问,从其构成、原理、优势、应用、参数到实施细节进行全方位、深入且具体的探讨,旨在提供一份高质量的参考,帮助读者全面理解和掌握CAN通信的精髓。

CAN通信到底是什么?核心构成与数据帧解析

CAN通信本质上是一种异步串行、多主、总线式的差分信号通信协议。它允许网络中的所有节点在同一条总线上进行数据交换,并且具备冲突检测和仲裁机制。

核心构成要素

  • CAN控制器(CAN Controller):这是CAN协议的核心实现者,负责处理CAN协议的底层细节,如报文的打包、解包、错误检测、错误恢复、优先级仲裁、位时序同步等。它通常集成在微控制器(MCU)内部,或作为独立芯片存在。
  • CAN收发器(CAN Transceiver):作为物理层接口,连接CAN控制器与CAN总线。它的主要作用是将CAN控制器输出的TTL/CMOS电平信号转换为CAN总线所需的差分电平信号(CAN_H和CAN_L),并将总线上的差分信号转换回控制器可识别的电平。它还提供必要的ESD保护和故障保护功能。
  • CAN总线(CAN Bus):由两条信号线(CAN_H和CAN_L)组成,传输差分信号。当CAN_H与CAN_L电平差为2V左右时,表示“显性”(Dominant)位,通常对应逻辑0;当CAN_H与CAN_L电平差为0V时(都接近中间电平),表示“隐性”(Recessive)位,通常对应逻辑1。
  • 终端电阻(Terminator Resistors):在CAN总线的两端各连接一个120欧姆的电阻。它们的作用是消除信号反射,确保信号完整性。

CAN数据帧结构详解

CAN协议定义了四种帧类型:数据帧、远程帧、错误帧和过载帧。其中,数据帧和远程帧又分为标准帧(CAN 2.0A)和扩展帧(CAN 2.0B)。

标准数据帧(Standard Data Frame)
  1. 帧起始(SOF – Start Of Frame):1位显性位,表示帧的开始。
  2. 仲裁段(Arbitration Field)
    • 标识符(ID – Identifier):11位,决定报文的优先级,值越小优先级越高。
    • RTR位(Remote Transmission Request):1位,显性表示数据帧,隐性表示远程帧。
  3. 控制段(Control Field)
    • IDE位(Identifier Extension):1位,显性表示标准帧(11位ID),隐性表示扩展帧(29位ID)。
    • 保留位(r0):1位,必须为显性位。
    • 数据长度码(DLC – Data Length Code):4位,表示数据字段的字节数(0-8字节)。
  4. 数据段(Data Field):0到8字节的数据。
  5. CRC段(Cyclic Redundancy Check Field)
    • CRC序列(CRC Sequence):15位,用于错误检测。
    • CRC界定符(CRC Delimiter):1位隐性位。
  6. ACK段(Acknowledgement Field)
    • ACK槽(ACK Slot):1位显性位,由接收到有效报文的节点发送。
    • ACK界定符(ACK Delimiter):1位隐性位。
  7. 帧结束(EOF – End Of Frame):7位隐性位。
  8. 帧间隔(Interframe Space):3位隐性位,在总线空闲时使用。
扩展数据帧(Extended Data Frame)

与标准帧的主要区别在于仲裁段和控制段:

  • 仲裁段:包含29位标识符(11位基础ID + SRR位 + IDE位 + 18位扩展ID),提供更丰富的报文类型和优先级划分。
  • RTR位:位于29位ID之后。

CAN通信支持广播式数据传输。一个节点发送数据,所有其他节点都能接收,但只有指定ID的节点才会处理。它不采用地址寻址,而是基于报文ID的过滤机制。

为什么选择CAN通信?解决之道与显著优势

CAN通信之所以能广泛应用,是因为它解决了传统点对点或简单串行通信在复杂分布式系统中面临的诸多挑战,并具备独特的优势。

解决多点互联与实时性问题

在汽车等复杂系统中,存在大量的电子控制单元(ECU)需要实时交换数据。如果采用点对点连接,布线将极其复杂且成本高昂。CAN总线以其多主(Multi-Master)架构,允许多个节点在同一条总线上发送数据,显著简化了布线,降低了成本。

卓越的多主仲裁机制

CAN总线通过基于ID的非破坏性位仲裁(Non-Destructive Bit-Wise Arbitration)机制,解决了多节点同时发送时的冲突问题。当多个节点同时开始发送报文时,它们会逐位比较仲裁段。发送显性位(逻辑0)的节点在总线上观察到隐性位(逻辑1)时,会立即停止发送并进入接收状态,从而让发送显性位(优先级更高)的报文继续传输,而不会发生数据破坏。优先级高的报文总能优先占用总线,保证了实时性。

强大的错误检测与故障闭锁功能

CAN协议设计了多重错误检测机制,包括:

  • CRC校验(Cyclic Redundancy Check):检测数据传输中的位错误。
  • 位填充(Bit Stuffing):确保数据流中不会出现过长的相同电平序列,用于同步和错误检测。
  • ACK错误(Acknowledgement Error):如果发送的报文没有收到ACK,则认为是错误。
  • 位错误(Bit Error):发送节点发送的位与总线上监测到的位不一致。
  • 帧错误(Form Error):帧结构不符合CAN协议规范。

当节点检测到错误时,会发送错误帧。CAN控制器还会根据错误计数值(发送错误计数器TEC和接收错误计数器REC)自动进入不同的状态(错误主动、错误被动、总线关闭),以隔离故障节点,防止一个故障节点使整个网络瘫痪。这种故障闭锁(Fault Confinement)能力极大地提高了系统的可靠性。

高可靠性与抗干扰能力

CAN总线采用差分信号传输,对共模噪声具有很强的抑制能力,使得其在嘈杂的电磁环境中也能稳定工作。总线上的终端电阻也进一步增强了信号完整性。这使得CAN通信在工业现场、汽车发动机舱等恶劣环境下表现出色。

标准化与互操作性

CAN协议是国际标准(ISO 11898),确保了不同厂商生产的CAN设备能够相互兼容,实现互操作性,这对于构建复杂的分布式系统至关重要。

高效的带宽利用率

尽管CAN报文数据段最大只有8字节,但由于其高效的仲裁机制和相对较低的协议开销(对于小数据包),使其在传输短周期性数据方面非常高效。

CAN通信的应用场景:它具体连接了什么?

CAN通信凭借其独特的优势,在众多领域得到了广泛应用。以下是一些具体的应用场景及它所连接的典型模块或设备:

汽车电子系统

这是CAN通信最初的设计目标和最广泛的应用领域。它构建了车辆内部的“神经网络”,连接着数以百计的ECU。

  • 动力总成CAN(Powertrain CAN):连接发动机控制单元(ECU/ECM)变速箱控制单元(TCU)电池管理系统(BMS)(在电动车中)、混合动力控制单元等,用于传输扭矩请求、档位信息、电池状态、发动机转速等关键数据。
  • 车身CAN(Body CAN):连接车身控制模块(BCM)车门模块座椅模块车窗升降模块照明系统等,负责控制车门锁、车窗、灯光、雨刮器等舒适性功能。
  • 底盘CAN(Chassis CAN):连接防抱死制动系统(ABS)电子稳定程序(ESP)电动助力转向系统(EPS)悬挂控制系统等,传输车轮速度、转向角度、制动压力等安全相关数据。
  • 信息娱乐CAN(Infotainment CAN):连接车载信息娱乐系统导航系统仪表盘音响功放等,用于显示车辆状态、导航信息、音频控制等。
  • ADAS/自动驾驶CAN(Advanced Driver-Assistance Systems/Autonomous Driving CAN):连接毫米波雷达摄像头激光雷达(LiDAR)域控制器等,传输环境感知数据、路径规划指令等,对实时性和可靠性要求极高。

工业自动化与控制

在工厂自动化领域,CAN bus(通常指CANopen或DeviceNet等上层协议)是连接各种现场设备的首选。

  • 可编程逻辑控制器(PLC):作为主控制器,通过CAN总线连接各种I/O模块、传感器、执行器。
  • 传感器:如压力传感器、温度传感器、编码器等,将模拟信号转换为数字信号并通过CAN发送。
  • 执行器:如步进电机驱动器、伺服电机驱动器、阀门控制器等,接收CAN指令并执行动作。
  • 人机界面(HMI):用于显示设备状态、操作参数,并通过CAN与PLC或其他控制器通信。
  • 机器人控制器:协调多个关节电机和传感器,实现精确运动控制。
  • 生产线设备:如输送带系统、包装机、CNC机床等,实现模块间的协同工作。

医疗设备

CAN通信用于连接医疗设备中的子系统,例如:

  • 诊断设备:如超声波探头、CT扫描仪的运动控制模块。
  • 监护设备:连接生命体征监测仪的不同传感器。
  • 手术机器人:控制精确的机械臂运动。

智能家居与楼宇自动化

用于连接智能照明、HVAC(供暖、通风与空调)系统、安防系统等模块。

航空航天与船舶电子

在飞机航电系统、船舶控制系统以及卫星姿态控制等领域,CAN总线也扮演着重要角色,负责连接传感器、执行器和控制单元。

电梯控制系统

连接轿厢控制器、层站控制器、门机控制器等,实现安全可靠的运行。

CAN通信的量化参数:节点、速率、距离与数据容量

理解CAN通信的量化参数对于设计和评估CAN网络至关重要。

支持的节点数量

理论上,CAN总线可以连接无限多个节点,因为它是基于报文ID而非节点地址的。然而,在实际应用中,由于以下几个因素,节点数量是有限制的:

  • 总线负载率:节点越多,报文发送越频繁,总线负载率越高。当总线负载率过高时(例如超过70%-80%),实时性可能下降,报文延迟增加。
  • 信号完整性:每个CAN收发器都会对总线信号造成一定的负载。过多的节点会降低总线信号的驱动能力,影响信号质量和通信可靠性。实际应用中,通常建议单个CAN段(由终端电阻限定的物理总线段)的节点数量在30到64个之间,具体取决于收发器的类型和总线设计。通过使用CAN中继器或网关,可以连接更多的CAN段,从而扩展整个网络的节点数量。

最大传输速率与距离的权衡

CAN通信的传输速率与通信距离存在反比关系:速率越高,最大通信距离越短。

  • 最高传输速率:标准CAN(ISO 11898-2)最高支持1 Mbps的传输速率。
  • 速率与距离示例
    • 1 Mbps:最大通信距离通常在40米左右。
    • 500 kbps:最大通信距离可达100米左右。
    • 250 kbps:最大通信距离可达250米左右。
    • 125 kbps:最大通信距离可达500米左右。
    • 50 kbps:最大通信距离可达1000米左右。

这些数据是经验值,实际距离还受限于电缆质量、终端电阻匹配、电磁干扰等因素。CAN FD(Flexible Data-rate)在此基础上进行了扩展,可以实现数据段更高的传输速率(最高可达5 Mbps甚至更高),但报文的仲裁段仍保持标准CAN速率。

一个CAN数据帧最多能传输多少字节的数据?

一个标准的CAN数据帧(包括标准帧和扩展帧)在其数据段(Data Field)最多可以传输8个字节的数据。这是一个固定的限制。对于需要传输更多数据量的应用,通常需要将大数据分割成多个CAN帧进行传输,或采用上层协议(如CANopen、J1939)来处理数据分段和重组。

CAN报文标识符(ID)的位数与优先级

CAN报文的标识符(ID)决定了报文的优先级,并且是实现多主仲裁的关键。

  • 标准帧标识符:11位,可以表示 2的11次方 = 2048 种不同的报文ID。ID值越小,报文优先级越高。
  • 扩展帧标识符:29位,由11位基础ID和18位扩展ID组成,可以表示 2的29次方 = 536,870,912 种不同的报文ID。同样,ID值越小,优先级越高。

通过合理规划ID,可以确保关键、实时性要求高的报文具有最高的优先级,从而在总线繁忙时也能及时传输。

CAN通信的实现与管理:从机制到部署

CAN通信不仅仅是发送和接收数据,其背后有一套精妙的机制来确保通信的可靠性和效率。

如何实现多主仲裁?位仲裁机制

CAN总线上的所有节点都是平等的,任何节点都可以在总线空闲时尝试发送数据。当多个节点同时发送时,仲裁过程如下:

  1. 同步发送SOF:所有要发送的节点同步发送帧起始(SOF)位。
  2. 逐位比较标识符:发送节点会一边发送仲裁段(ID和RTR位),一边监听总线上的电平。
  3. 显性压制隐性
    • 显性位(逻辑0)是“强”信号,隐性位(逻辑1)是“弱”信号。
    • 当一个节点发送隐性位,但同时监听到了总线上的显性位时,这意味着有其他节点发送了显性位。此时,发送隐性位的节点立即“失去仲裁”,停止发送并切换到接收模式。
    • 发送显性位的节点将继续发送,直到其标识符的全部位都成功发送出去,或者它自己也遇到需要发送隐性位但总线上出现显性位的情况。
  4. 优先级决定胜者:由于ID值越小,其二进制表示中出现显性位(0)的可能性就越大,因此ID值越小的报文将优先赢得仲裁,继续发送。这种机制是非破坏性的,不会导致已发送的数据被损坏。

示例:节点A发送ID=0x100(001…),节点B发送ID=0x200(010…)。在ID的第一位,两者都发送0。在ID的第二位,节点A发送0,节点B发送1。节点B在总线上观察到0(显性),而它自己发送的是1(隐性),因此节点B失去仲裁,停止发送,节点A赢得总线。整个过程在几微秒内完成。

CAN如何进行错误检测与故障闭锁?

CAN协议的可靠性来源于其严密的错误检测和故障闭锁机制。

错误检测机制
  • CRC校验:接收节点计算接收到的数据流(仲裁段、控制段、数据段)的CRC,并与接收到的CRC序列进行比较。不一致则报告CRC错误。
  • 位填充规则(Bit Stuffing Rule):在非填充区(SOF、仲裁段、控制段、数据段、CRC序列),连续5个相同电平的位后必须插入一个反向电平的填充位。接收节点若检测到连续6个相同电平的位,则报告填充错误。
  • 帧结构错误(Form Error):帧的某些特定位(如CRC界定符、ACK界定符、EOF)必须为隐性位。如果检测到显性位,则报告帧错误。
  • 位错误(Bit Error):发送节点在发送数据位时,会同时监听总线电平。如果发送的位与监听到的位不符(发送隐性位但监听到了显性位),则报告位错误。
  • ACK错误(Acknowledgement Error):发送节点发送报文后,会检测ACK槽。如果所有接收节点都没有在ACK槽发送显性位(即总线上保持隐性),则发送节点报告ACK错误。
故障闭锁(Fault Confinement)

每个CAN控制器都维护两个错误计数器:发送错误计数器(TEC)接收错误计数器(REC)。根据错误事件类型,这些计数器会增加或减少。当计数器达到特定阈值时,节点会进入不同的错误状态:

  1. 错误主动(Error Active):正常工作状态,当检测到错误时,会发送“主动错误帧”(6个连续显性位)。TEC和REC低于128。
  2. 错误被动(Error Passive):当TEC或REC超过127时进入此状态。此时节点仍能发送和接收报文,但发送的错误帧是“被动错误帧”(6个连续隐性位),不会像主动错误帧那样“破坏”总线仲裁。此状态下的节点在发送报文前会等待更长时间(8个隐性位,而非3个)。
  3. 总线关闭(Bus Off):当TEC超过255时进入此状态。节点将完全与总线断开连接,不能发送或接收任何报文。通常需要通过软件复位或特定的总线关闭恢复机制才能重新激活。这有效地将故障节点隔离,防止其持续干扰整个网络。

CAN网络如何进行拓扑设计和终端电阻配置?

CAN总线通常采用线性总线(Linear Bus)拓扑。这意味着所有节点都通过短的引线(Stub Line/Drop Line)连接到一条主干总线(Main Bus)。

  • 主干总线:应尽量短且分支尽可能少,以减少信号反射和阻抗不匹配。
  • 引线长度:应尽可能短。在高速CAN网络中(如1 Mbps),引线长度通常限制在0.3米以内。过长的引线会引起信号反射和阻抗不连续,导致通信错误。
  • 终端电阻
    • 总线的两端必须连接一个120欧姆的终端电阻。这是关键!
    • 这些电阻的作用是匹配总线阻抗,吸收电信号,防止信号在电缆末端反射,从而保证信号的完整性。
    • 在一条总线上只能有且必须有两个终端电阻。如果缺少或超过两个,或者电阻值不正确,都可能导致通信故障。

一个典型的CAN通信系统是如何构建和调试的?

构建流程
  1. 硬件选型
    • 微控制器(MCU):选择内置CAN控制器的MCU(如STM32、NXP S32K、Infineon Aurix等),或使用带有独立CAN控制器的MCU。
    • CAN收发器:根据工作电压、速度、ESD保护和故障保护特性选择合适的CAN收发器(如MCP2551、TJA1040、SN65HVD230等)。
    • 总线电缆:使用符合ISO 11898标准的双绞线电缆,通常是屏蔽双绞线,以增强抗干扰能力。
    • 连接器:DB9连接器或特定的汽车级连接器。
  2. 电路设计
    • 将CAN控制器与收发器正确连接,通常是RXD/TXD引脚。
    • 确保收发器的CAN_H和CAN_L引脚正确连接到总线,并注意电源去耦。
    • 在总线两端精确安装120欧姆的终端电阻。
  3. 软件开发
    • CAN控制器初始化:配置CAN模块的时钟源、波特率、工作模式(正常、监听、休眠等)。
    • 报文过滤(Message Filtering):配置接收滤波器和屏蔽器,以便控制器只接收感兴趣的报文ID,减轻CPU负担。
    • 发送/接收缓冲区管理:设置邮箱或FIFO来管理待发送和已接收的报文。
    • 中断服务程序(ISR):处理接收到报文或发送完成、发生错误等事件。
    • 应用层协议:根据具体需求实现上层协议(如CANopen、J1939或自定义协议),处理数据打包/解包、状态机等。
调试技巧
  • 使用CAN分析仪:这是调试CAN网络最重要的工具。它可以实时监测总线上的所有报文,显示ID、数据、时间戳,并能发送自定义报文、模拟节点。
  • 示波器:用于物理层故障排查,检查CAN_H和CAN_L的波形是否正常,是否存在信号反射、噪声、电压漂移等。
  • 万用表:测量终端电阻是否正确,总线电压是否正常。
  • 逐步排查法:从最简单的两节点通信开始,逐步增加节点和功能。
  • 错误帧分析:如果CAN总线出现错误帧,通过分析错误帧的类型和发生频率,结合错误计数器状态,可以定位故障源。例如,位错误可能指示布线问题或收发器故障,ACK错误可能指示接收节点问题或终端电阻问题。
  • 波特率匹配:确保所有节点都配置了相同的波特率和位时序参数。

如何通过硬件和软件接口实现CAN通信?

实现CAN通信通常涉及硬件接口设计和软件编程两大部分。

硬件接口

大多数现代微控制器(MCU)都集成了至少一个CAN控制器模块。如果MCU不带CAN控制器,可以通过SPI或并行总线接口连接外部CAN控制器芯片(如MCP2515)。

  • CAN控制器(集成或独立):提供协议处理功能,包括位流编解码、CRC计算、仲裁、错误检测与报告、报文过滤等。
  • CAN收发器(物理层):将控制器TTL/CMOS电平转换为CAN总线的差分电平,反之亦然。例如,通过TJA1040或SN65HVD230系列芯片实现。这些芯片还具备总线故障保护、低功耗模式等功能。
  • 隔离器(可选):在某些对电气隔离有严格要求的工业应用中,会在CAN控制器和CAN收发器之间增加光耦或磁耦隔离芯片,以提供共模噪声抑制和保护敏感电路。
软件接口

软件接口是与CAN控制器硬件交互的手段,通常由驱动层和应用层构成。

  • 底层驱动(Driver Layer)
    • 寄存器操作:直接读写CAN控制器内部的控制寄存器、状态寄存器、发送/接收缓冲区寄存器。
    • 中断处理:编写中断服务程序(ISR),响应CAN控制器生成的中断事件,如报文接收完成、发送完成、错误发生等。
    • 波特率和位时序配置:根据系统时钟和目标波特率,计算并配置位时序寄存器,包括同步段(Sync Seg)、传播段(Prop Seg)、相位缓冲段1(Phase Seg1)和相位缓冲段2(Phase Seg2),以确保位同步。
    • 接收滤波器配置:设置标识符寄存器和屏蔽寄存器,以过滤不感兴趣的报文。
  • 应用层(Application Layer)
    • 报文发送函数:封装发送过程,接收应用数据和ID,将其填充到CAN数据帧结构,并写入CAN控制器的发送邮箱。
    • 报文接收函数:从CAN控制器的接收FIFO或邮箱中读取报文,解析ID和数据,并传递给应用程序处理。
    • 错误处理函数:根据CAN控制器的错误状态寄存器,提供错误报告和恢复机制。
    • 上层协议栈(Optional):对于更复杂的应用,可能需要实现或集成CANopen、J1939、DeviceNet等标准上层协议栈,它们提供了更高级别的服务,如网络管理、对象字典、服务数据对象(SDO)、过程数据对象(PDO)等。

通过这种软硬件协同的方式,CAN通信得以高效、可靠地运行,满足了各种分布式实时控制系统的需求。

can通信