2. CAN协议物理层与帧结构精讲
CAN总线能在汽车、工业控制等强干扰环境中长期可靠工作,根本原因在于它的物理层设计与帧结构设计是配套的。理解这一层,是后续在PIC32上配置CAN模块、排查通信故障的前提。本节从差分信号讲起,逐层展开到位定时、帧格式、仲裁与错误界定。
一、差分信号与显性/隐性电平
CAN使用一对差分线CANH与CANL传输信号,总线电平由两者电压差决定,而不是对地电压。这样做的直接好处是:共模干扰同时叠加在两根线上,接收端取差值后被抵消。ISO 11898-2高速CAN的典型电平定义如下:
| 总线状态 | CANH | CANL | 差分电压 Vdiff | 逻辑值 |
|---|---|---|---|---|
| 显性 Dominant | 约3.5V | 约1.5V | 约2.0V | 0 |
| 隐性 Recessive | 约2.5V | 约2.5V | 约0V | 1 |
这里有一个容易混淆的点: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定义了五种错误类型:位错误、填充错误、CRC错误、格式错误和应答错误。发送节点在仲裁段之外回读总线,若发现电平与发送不符即为位错误;帧中连续5个相同极性位后必须插入1个相反位,违反即为填充错误;CRC校验失败为CRC错误;固定格式字段出现非法电平为格式错误;发送节点在ACK槽未收到显性应答为应答错误。
每个节点维护两个计数器:发送错误计数TEC和接收错误计数REC。检测到错误时相应计数器加1或加8,成功发送/接收时减1。根据计数值,节点处于三种状态:
- 错误主动:TEC和REC均≤127,正常参与通信,检测到错误时发送主动错误帧(6个连续显性位)。
- 错误被动:TEC或REC超过127,仍能通信,但发送被动错误帧(6个隐性位),且在总线空闲后需等待暂停传输时间才能再次发送。
- 总线关闭:TEC超过255,节点自动脱离总线,停止收发。需检测到128次连续11个隐性位后,才能恢复为错误主动状态。
把物理层、位定时、帧结构、仲裁和错误界定串起来看,CAN的可靠性并非来自某一项技术,而是差分传输、位填充、CRC、应答和故障界定共同构成的闭环。后续在PIC32上配置CAN模块时,BRP、Prop_Seg、Phase_Seg1/2、SJW这几个参数直接对应本节讲到的位定时结构,理解它们的作用,才能根据实际总线长度和干扰情况做出合理取舍。