4、CAN通信基础:CAN协议帧格式、位定时、错误处理、CAN控制器与收发器工作原理

CAN(Controller Area Network)总线自20世纪80年代由Bosch公司提出以来,已成为汽车电子系统中应用最广泛的串行通信协议。在AUTOSAR CP通信栈中,CAN通信模块(Can、CanIf、CanNm、CanTp等)均构建于CAN控制器与收发器提供的物理传输能力之上。理解CAN协议的核心机制——帧格式、位定时、错误处理以及控制器与收发器的分工——是配置AUTOSAR CAN驱动、优化网络拓扑和排查通信故障的前提。本章将从协议底层原理出发,结合AUTOSAR CP的抽象层次,系统解析CAN通信的完整技术链路。

CAN通信链路与协议核心机制 应用层/上层协议 AUTOSAR COM / CanIf / CanNm CAN控制器 帧打包/解包、位定时、错误检测 CAN收发器 电平转换、差分驱动/接收 物理总线 CAN_H / CAN_L / 终端电阻 标准数据帧格式(2.0A) SOF ID(11bit) RTR IDE r0 DLC Data(0-8B) CRC ACK EOF 位定时:同步段(SYNC_SEG) + 传播段(PROP_SEG) + 相位缓冲段1(PS1) + 相位缓冲段2(PS2) 采样点 = (SYNC_SEG + PROP_SEG + PS1) / 位时间,典型值 75%~80% 波特率 = 1 / 位时间,例如 500kbps → 位时间 = 2μs 同步跳转宽度(SJW) 用于重同步,范围 1~4 TQ 错误处理机制 • 错误检测:位错误、填充错误、CRC错误、形式错误、ACK错误 • 错误状态:主动错误(Error Active) → 被动错误(Error Passive) → 总线关闭(Bus Off) • 错误计数:TEC(发送错误计数) / REC(接收错误计数),阈值 128 / 256 控制器与收发器分工 • 控制器(MCU内置或外部):协议处理、滤波、缓冲、中断、错误状态机 • 收发器(外部芯片):差分信号转换、总线驱动、显性/隐性电平、保护 • 典型收发器:TJA1043、TJA1051、NCV7344;支持唤醒、待机模式

上图展示了CAN通信的完整链路:应用层数据通过AUTOSAR COM模块传递至CanIf,再由CAN控制器完成帧打包、位定时与错误检测,最终经CAN收发器转换为差分信号在物理总线上传输。理解这一链路中各层的职责边界,是后续配置AUTOSAR Can驱动、CanIf通道以及CanTrcv驱动的基础。

4.1 CAN协议帧格式:标准帧与扩展帧

4.1.1 核心原理:帧结构与字段含义

CAN协议定义了四种帧类型:数据帧、远程帧、错误帧和过载帧。其中数据帧用于实际数据传输,是AUTOSAR通信栈中最常处理的帧类型。数据帧分为标准帧(CAN 2.0A,11位标识符)和扩展帧(CAN 2.0B,29位标识符)。标准帧的典型结构包括:帧起始(SOF,1位显性)、仲裁场(11位ID + RTR位)、控制场(IDE位、r0保留位、DLC数据长度码)、数据场(0~8字节)、CRC场(15位CRC + CRC界定符)、ACK场(ACK槽 + ACK界定符)以及帧结束(EOF,7位隐性)。

仲裁机制是CAN协议的核心特性。当多个节点同时发送时,总线通过“显性位(逻辑0)覆盖隐性位(逻辑1)”的物理特性实现逐位仲裁。ID值越小,优先级越高。RTR位用于区分数据帧(显性0)和远程帧(隐性1),但在AUTOSAR CP实际应用中,远程帧使用较少,主要依赖数据帧进行周期性或事件触发通信。

4.1.2 判断方法:标准帧与扩展帧的选择

在AUTOSAR配置中,选择标准帧还是扩展帧需考虑以下因素:

  • 网络规模:标准帧仅提供2048个可用ID(11位),扩展帧提供超过5亿个ID(29位)。若网络节点数超过50个或需要大量报文ID,建议使用扩展帧。
  • 兼容性:部分老式控制器仅支持标准帧。若网络中存在此类节点,必须使用标准帧。
  • 带宽效率:扩展帧额外占用18位仲裁场,在相同波特率下有效数据吞吐率降低约10%~15%。
  • AUTOSAR配置:在CanHardwareObject中通过CanIdType参数指定STANDARD或EXTENDED,同时需在CanController中配置对应的帧类型支持。

4.1.3 案例拆解:混合帧类型网络配置

某车身控制模块(BCM)网络包含32个节点,其中部分老式车窗控制器仅支持标准帧,而新引入的域控制器需要发送29位扩展帧。初始方案中,所有节点统一使用标准帧,导致域控制器无法发送扩展报文。分析后发现,CAN协议允许标准帧和扩展帧在同一总线上共存,但需注意:扩展帧的ID基地址(Base ID)与标准帧ID不能冲突,否则仲裁时扩展帧的SRR位(替代远程请求)为隐性,标准帧的RTR位为显性,会导致标准帧优先。实际配置中,将标准帧ID范围限制在0x000~0x3FF,扩展帧ID使用0x40000000以上的基地址,并在CanIf层配置独立的RxPdu和TxPdu。最终网络运行稳定,仲裁行为符合预期。

4.1.4 常见误区与总结

风险提示:在AUTOSAR CanIf配置中,若将标准帧和扩展帧映射到同一个硬件对象(HardwareObject),可能导致接收路径无法正确区分帧类型。必须为不同帧类型分配独立的硬件接收邮箱,并在CanIf层配置对应的CanIdType。

帧格式的选择直接影响网络兼容性和带宽利用率。在AUTOSAR CP中,CanDriver通过Can_IdType枚举区分标准帧与扩展帧,CanIf层则根据CanIdType和CanId匹配接收报文。建议在项目初期即明确帧类型策略,避免后期大规模改动。

4.2 位定时与同步机制

4.2.1 核心原理:位时间的构成

CAN协议的位定时决定了波特率、采样点位置以及同步能力。一个位时间(Bit Time)由四个段组成:同步段(SYNC_SEG,固定1个时间量子TQ)、传播段(PROP_SEG,补偿总线传播延迟)、相位缓冲段1(PS1)和相位缓冲段2(PS2)。采样点位于PS1与PS2的交界处,通常配置在75%~80%的位时间位置,以容忍信号上升/下降时间和总线传播延迟。

时间量子TQ由控制器时钟分频得到:TQ = (BRP + 1) / f_clk,其中BRP为波特率预分频器。例如,MCU外设时钟为40MHz,若需500kbps波特率,位时间为2μs,则TQ = 2μs / 16 = 125ns,BRP = 40MHz × 125ns - 1 = 4。位时间各段的TQ数需根据网络拓扑和收发器延迟进行配置。

4.2.2 判断方法:采样点与SJW配置

采样点位置的计算公式为:

采样点 = (SYNC_SEG + PROP_SEG + PS1) / (SYNC_SEG + PROP_SEG + PS1 + PS2) × 100%

同步跳转宽度(SJW)用于重同步,其值必须满足:SJW ≤ PS2,且SJW ≥ 1 TQ。SJW越大,同步能力越强,但会降低抗干扰能力。推荐配置:SJW = 1~2 TQ,采样点 = 75%~80%。

在AUTOSAR CanController配置中,通过CanControllerBaudRateConfig结构体设置BaudRate、SamplePoint、SyncJumpWidth等参数。若使用EB tresos或Davinci工具,可直接在图形界面中调整,工具会自动计算寄存器值。

4.2.3 实战场景:500kbps网络位定时调优

某动力总成网络使用500kbps波特率,总线长度约5米,收发器TJA1043的环路延迟约250ns。初始配置:BRP=4,SYNC_SEG=1,PROP_SEG=3,PS1=4,PS2=4,采样点=66.7%。实测发现,在高温环境下出现偶发位错误。分析认为采样点过早,未充分覆盖信号稳定区域。调整配置:PROP_SEG=2,PS1=5,PS2=4,采样点=72.7%,同时将SJW从1增加到2。重新测试后,位错误率从0.02%降至0.0001%以下。关键经验:采样点应尽量靠近80%,但需确保PS2足够大以容忍振荡器偏差。

4.2.4 常见误区与总结

经验提醒:位定时配置不能仅依赖理论计算,必须结合示波器实测总线信号。使用CANoe或PCAN的“Bus Timing”分析功能,观察实际采样点位置,并检查位时间是否满足收发器数据手册中的最小/最大要求。

位定时是CAN物理层最关键的参数之一。AUTOSAR CP中,CanDriver在Can_Init时根据CanControllerBaudRateConfig完成控制器初始化。若网络中存在不同波特率的节点,必须确保所有节点使用相同的位定时参数,否则会导致同步失败。

4.3 错误处理机制

4.3.1 核心原理:错误检测与状态机

CAN协议内置了完善的错误检测机制,包括五种错误类型:位错误(发送节点在发送位时监视总线电平,若与发送值不一致则报错)、填充错误(连续5个相同电平后缺少填充位)、CRC错误(接收节点计算的CRC与发送值不匹配)、形式错误(固定位场出现非法电平)、ACK错误(发送节点在ACK槽未收到显性应答)。

每个节点维护两个错误计数器:发送错误计数(TEC)和接收错误计数(REC)。错误处理遵循以下规则:

  • 检测到错误时,发送节点TEC加8,接收节点REC加1;
  • 发送成功时TEC减1,接收成功时REC减1(若REC > 0);
  • TEC或REC超过127时,节点进入被动错误状态;
  • TEC超过255时,节点进入总线关闭状态,自动断开与总线的连接。

4.3.2 判断方法:错误状态诊断

在AUTOSAR CP中,CanDriver通过Can_GetControllerErrorState函数返回当前错误状态(CAN_ERROR_STATE_ACTIVE、CAN_ERROR_STATE_PASSIVE或CAN_ERROR_STATE_BUSOFF)。CanSM(状态管理器)模块负责处理总线关闭恢复策略,典型流程为:检测到BusOff → 停止发送 → 等待BusOff恢复时间(通常为128个11位隐性位)→ 重新初始化控制器 → 恢复通信。

实际排障时,可通过以下步骤定位错误源:

  1. 使用CANoe或PCAN记录错误帧,分析错误类型(CRC错误、位错误等);
  2. 检查总线终端电阻(应为60Ω,即两个120Ω并联);
  3. 测量CAN_H和CAN_L的静态电平(隐性应为2.5V左右,显性差分应为2V);
  4. 检查节点时钟精度(CAN要求晶振误差不超过±0.5%)。

4.3.3 案例拆解:总线关闭故障排查

某商用车网络在低温启动时频繁出现“总线关闭”故障,仪表盘显示通信中断。通过CANoe记录发现,故障节点为发动机ECU,其TEC在启动瞬间快速累积至256。分析原因:低温导致ECU晶振频率偏移超过±1%,位定时失步,发送节点持续检测到位错误。进一步检查发现,该ECU使用的晶振为普通石英晶振,未使用温补晶振(TCXO)。解决方案:将ECU晶振更换为温补晶振,并在AUTOSAR CanSM配置中将BusOff恢复时间从默认的10ms延长至50ms,以应对极端温度下的瞬态偏差。整改后,故障消失。

4.3.4 常见误区与总结

风险提示:不要随意修改错误计数器阈值或禁用错误检测功能。某些开发者为了规避偶发错误,将CanController配置为“忽略错误”,这会导致网络中的错误帧无法被识别,严重时可能引发数据一致性问题。

错误处理机制是CAN协议可靠性的基石。AUTOSAR CP中的CanSM模块提供了完整的BusOff恢复流程,但需根据网络拓扑和节点特性调整恢复参数。建议在项目验证阶段进行错误注入测试,确认错误处理逻辑符合预期。

4.4 CAN控制器与收发器工作原理

4.4.1 核心原理:控制器与收发器的分工

CAN控制器通常集成在MCU内部(如英飞凌AURIX、恩智浦S32K系列),负责协议处理:帧打包/解包、位填充/解填充、CRC计算、错误检测、滤波、缓冲管理以及中断生成。控制器通过CAN_TX和CAN_RX引脚与外部收发器连接,采用单线逻辑电平(通常为3.3V或5V TTL)。

CAN收发器(如TJA1043、TJA1051)负责将控制器的逻辑电平转换为总线差分信号。收发器内部包含发送驱动器(将TX信号转换为CAN_H/CAN_L差分)和接收比较器(将差分信号转换为RX逻辑电平)。收发器还提供总线保护功能,包括短路保护、过温保护和共模电压抑制。

在AUTOSAR CP中,CanTrcv驱动抽象了不同收发器的特性,通过CanTrcv_GetBusDriverMode和CanTrcv_SetBusDriverMode控制收发器的工作模式(正常模式、待机模式、睡眠模式)。收发器的唤醒功能(如本地唤醒、远程唤醒)由CanTrcv和EcuM协同管理。

4.4.2 判断方法:控制器与收发器选型

选型时需考虑以下关键参数:

参数控制器要求收发器要求
波特率范围支持125kbps~1Mbps(经典CAN)支持相应波特率,传播延迟< 500ns
工作电压3.3V或5V逻辑电平5V供电(部分支持3.3V)
待机电流—< 5μA(睡眠模式)
ESD保护—≥ ±8kV(HBM)
唤醒能力—支持本地唤醒和远程唤醒

在AUTOSAR配置中,CanController的硬件对象(HardwareObject)需与收发器的通道映射。例如,MCU的CAN0外设连接TJA1043,则在CanTrcv配置中关联CanControllerDeviceRef。

4.4.3 实战场景:收发器模式切换与低功耗管理

某新能源车型的BMS(电池管理系统)需要实现KL30(常电)下的低功耗。BMS的CAN收发器选用TJA1043,支持待机模式(Standby)和睡眠模式(Sleep)。在AUTOSAR CP中,通过CanTrcv_SetOpMode实现模式切换。具体流程:车辆下电后,EcuM进入Sleep状态,调用CanTrcv_SetOpMode(CANTRCV_OPMODE_SLEEP);此时收发器进入低功耗模式,总线唤醒功能仍有效。当检测到远程唤醒(总线出现显性电平)时,收发器通过INH引脚唤醒MCU电源,MCU启动后调用CanTrcv_SetOpMode(CANTRCV_OPMODE_NORMAL)恢复通信。实测待机电流从12mA降至0.8mA,满足整车静态电流要求。

4.4.4 常见误区与总结

经验提醒:在AUTOSAR CP中,CanTrcv驱动与Can驱动是独立的模块。若收发器支持多种模式,必须在CanTrcv配置中正确设置模式切换的时序,避免在总线通信期间切换模式导致数据丢失。

控制器与收发器的协同工作决定了CAN网络的物理层性能。AUTOSAR CP通过Can和CanTrcv两个独立驱动模块实现了协议处理与物理层控制的解耦,使上层应用无需关心具体硬件实现。在项目开发中,应优先选择经过AUTOSAR验证的控制器和收发器组合,并参考MCU厂商提供的MCAL配置指南。

本章从帧格式、位定时、错误处理以及控制器与收发器四个维度系统解析了CAN通信的基础原理。这些知识是理解AUTOSAR CP通信栈中Can、CanIf、CanTrcv等模块配置的前提。在实际项目中,建议结合CANoe、示波器等工具进行信号级验证,确保物理层参数与协议配置的一致性。