2. CAN协议物理层与帧结构精讲

CAN总线能在汽车、工业控制等强干扰环境中长期可靠工作,根本原因在于它的物理层设计与帧结构设计是配套的。理解这一层,是后续在PIC32上配置CAN模块、排查通信故障的前提。本节从差分信号讲起,逐层展开到位定时、帧格式、仲裁与错误界定。

一、差分信号与显性/隐性电平

CAN使用一对差分线CANH与CANL传输信号,总线电平由两者电压差决定,而不是对地电压。这样做的直接好处是:共模干扰同时叠加在两根线上,接收端取差值后被抵消。ISO 11898-2高速CAN的典型电平定义如下:

总线状态CANHCANL差分电压 Vdiff逻辑值
显性 Dominant约3.5V约1.5V约2.0V0
隐性 Recessive约2.5V约2.5V约0V1

这里有一个容易混淆的点:CAN的“0”是显性,“1”是隐性,与常规数字逻辑相反。显性电平具有“压倒”隐性电平的能力——只要总线上有一个节点发送显性位,整条总线就呈现显性。这一物理特性正是仲裁机制的基础。总线两端必须各接一个120Ω终端电阻,使隐性状态下差分阻抗匹配、快速回到共模电平,否则信号反射会导致位采样错误。

二、位定时与采样点

CAN是异步通信,没有独立时钟线,每个节点靠自己的振荡器对位时间进行划分。一个位时间被分为四个段:同步段(Sync_Seg,固定1个TQ)、传播段(Prop_Seg)、相位缓冲段1(Phase_Seg1)和相位缓冲段2(Phase_Seg2)。采样点位于Phase_Seg1结束处。

位时间以时间份额TQ为单位,TQ = (BRP+1)/fCAN。以PIC32的CAN模块为例,若系统时钟为80MHz,目标波特率500kbps,取BRP=7,则TQ=8/80MHz=100ns,一个位时间10个TQ正好是1μs。若把采样点设在75%,即Sync_Seg=1TQ、Prop_Seg+Phase_Seg1=6.5TQ(取6TQ)、Phase_Seg2=3TQ,采样点落在第7个TQ末。采样点太靠前,信号尚未稳定;太靠后,留给再同步的余量不足。工程上500kbps常用75%~87.5%的采样点,长线或高干扰场合可适当后移。

再同步分为硬同步和重同步。硬同步只在帧起始的SOF下降沿发生,强制把位时间起点对齐;重同步在后续每个边沿根据相位误差调整Phase_Seg1或Phase_Seg2,调整量受SJW(同步跳转宽度)限制,SJW通常取1~4个TQ。SJW过小无法吸收振荡器漂移,过大则可能引入误判。

三、标准帧与扩展帧格式

CAN 2.0B定义了两种帧格式。标准帧使用11位标识符,扩展帧使用29位标识符(11位基本ID + 18位扩展ID)。两者在仲裁段之后的结构基本一致,区别集中在仲裁段和控制段。

  • 标准帧:SOF(1) + 标识符(11) + RTR(1) + IDE(1) + r0(1) + DLC(4) + 数据(0~8字节) + CRC(15) + CRC界定符(1) + ACK槽(1) + ACK界定符(1) + EOF(7)。
  • 扩展帧:SOF(1) + 基本ID(11) + SRR(1) + IDE(1) + 扩展ID(18) + RTR(1) + r1(1) + r0(1) + DLC(4) + 数据 + CRC + ACK + EOF。

IDE位区分两种格式:IDE=0为标准帧,IDE=1为扩展帧。RTR位区分数据帧与远程帧:RTR=0为数据帧,RTR=1为远程请求帧。DLC为4位,取值0~8表示数据长度,超过8的值在经典CAN中按8处理。CRC段为15位,接收节点计算后与发送值比较,不一致则报错。

四、仲裁机制

当多个节点同时开始发送时,CAN采用非破坏性逐位仲裁。每个节点在发送每一位的同时回读总线电平:若自己发隐性而读到显性,说明有更高优先级节点在竞争,该节点立即退出发送、转为接收,且不丢失数据。标识符数值越小,优先级越高,因为显性位(0)在仲裁中胜出。

标准帧与扩展帧混合竞争时,由于标准帧的IDE位为显性、扩展帧的SRR为隐性,相同基本ID下标准帧优先。这也是工程中建议对实时性要求高的报文使用标准帧的原因之一。

CAN物理层与帧结构关系图 差分电平 显性: CANH 3.5V / CANL 1.5V Vdiff ≈ 2.0V → 逻辑 0 隐性: CANH=CANL=2.5V Vdiff ≈ 0V → 逻辑 1 位定时结构 Sync Prop Phase1 Phase2 采样点 TQ = (BRP+1)/fCAN 500kbps 示例: 10 TQ/位 帧格式对比 标准帧: SOF|ID11|RTR|IDE|r0|DLC|Data 扩展帧: SOF|ID11|SRR|IDE|ID18|RTR|r1|r0|DLC|Data 公共尾部: CRC15|CRCdel|ACK|ACKdel|EOF7 IDE=0 标准 / IDE=1 扩展 RTR=0 数据 / RTR=1 远程 非破坏性逐位仲裁(ID越小优先级越高) 节点A ID=0x100 (二进制 001 0000 0000) 节点B ID=0x120 (二进制 001 0010 0000) 节点C ID=0x080 (二进制 000 1000 0000) 仲裁结果: C 胜出(第3位显性),A、B 退出发送转接收 错误检测与故障界定状态机 错误主动 错误被动 总线关闭 TEC/REC > 127 TEC > 255

五、错误检测与故障界定

CAN定义了五种错误类型:位错误、填充错误、CRC错误、格式错误和应答错误。发送节点在仲裁段之外回读总线,若发现电平与发送不符即为位错误;帧中连续5个相同极性位后必须插入1个相反位,违反即为填充错误;CRC校验失败为CRC错误;固定格式字段出现非法电平为格式错误;发送节点在ACK槽未收到显性应答为应答错误。

每个节点维护两个计数器:发送错误计数TEC和接收错误计数REC。检测到错误时相应计数器加1或加8,成功发送/接收时减1。根据计数值,节点处于三种状态:

  • 错误主动:TEC和REC均≤127,正常参与通信,检测到错误时发送主动错误帧(6个连续显性位)。
  • 错误被动:TEC或REC超过127,仍能通信,但发送被动错误帧(6个隐性位),且在总线空闲后需等待暂停传输时间才能再次发送。
  • 总线关闭:TEC超过255,节点自动脱离总线,停止收发。需检测到128次连续11个隐性位后,才能恢复为错误主动状态。
在PIC32上调试CAN时,若发现节点频繁进入错误被动甚至总线关闭,应优先检查:终端电阻是否缺失或阻值错误、波特率与采样点是否与总线其他节点一致、CANH/CANL是否接反、地电位差是否过大。这些物理层问题往往表现为CRC错误或位错误计数快速上升。

把物理层、位定时、帧结构、仲裁和错误界定串起来看,CAN的可靠性并非来自某一项技术,而是差分传输、位填充、CRC、应答和故障界定共同构成的闭环。后续在PIC32上配置CAN模块时,BRP、Prop_Seg、Phase_Seg1/2、SJW这几个参数直接对应本节讲到的位定时结构,理解它们的作用,才能根据实际总线长度和干扰情况做出合理取舍。