第四章 CAN网络设计:网络拓扑、节点设计、终端电阻、总线长度与波特率关系、信号采样点

好,咱们今天聊聊CAN网络设计。说实话,这是整车电子电气架构里最基础、也最容易出坑的一块。我见过太多项目,因为CAN网络没设计好,最后台架测试时各种丢帧、总线错误,搞得大家焦头烂额。

你想想看,一辆新能源车少说也有十几个ECU,多的能到四五十个。它们之间怎么通信?CAN总线就是那个"高速公路"。但路怎么修、收费站怎么设、限速多少,这些都得提前规划好。

4.1 网络拓扑:别小看这根线怎么连

CAN网络的拓扑结构,说白了就是节点怎么挂到总线上。最常见的就两种:直线型和星型。

直线型拓扑,也叫总线型。所有节点都挂在一根主干线上,分支尽量短。我个人习惯,分支长度控制在0.3米以内,最长不超过1米。为什么?分支长了会产生反射,信号质量会变差。

星型拓扑,就是有个中央集线器,节点都连到它上面。这种结构在乘用车上用得少,但在商用车或特种车辆上偶尔能看到。嗯,这里要注意:星型拓扑对集线器的要求很高,搞不好就成了单点故障。

我的经验之谈

  • 乘用车:99%用直线型拓扑,简单可靠
  • 分支长度:能短则短,超过0.3米就要考虑加终端电阻
  • 节点间距:没有严格限制,但建议不要超过40米(对于500kbps)

我在项目中遇到过一件事:有个同事把BMS和VCU放在车头,OBC和DCDC放在车尾,中间用一根10米长的CAN线连着。结果呢?通信时好时坏,最后发现是总线太长,信号衰减太严重。后来加了中继器才解决。

4.2 节点设计:每个ECU都是"交通参与者"

每个CAN节点,本质上就是一个带CAN控制器的微控制器,加上一个CAN收发器。收发器负责把逻辑电平转换成差分信号。

节点设计时,有几个关键点:

  • CAN控制器:现在主流MCU都集成了,比如NXP的S32K系列、Infineon的TC3xx系列
  • CAN收发器:TJA1040、TJA1050这些经典款,现在也有带CAN FD的TJA1145
  • 共模扼流圈:这个很多人会忽略,但它能有效抑制共模干扰
  • ESD保护:CAN总线是暴露在车外的,静电防护不能省

一个小技巧

节点设计时,收发器的电源一定要加滤波电容。我见过一个案例,就是因为电源纹波太大,导致CAN收发器误判电平,总线上一堆错误帧。后来加了100nF+10μF的滤波组合,问题就解决了。

4.3 终端电阻:为什么是120Ω?

终端电阻,这是CAN网络里最容易被误解的东西。很多人以为它就是个匹配电阻,其实它的作用有两个:

  1. 消除信号反射:当信号在总线末端遇到阻抗突变时,会产生反射。终端电阻把末端阻抗匹配到120Ω,反射就没了。
  2. 提供总线偏置:CAN总线在隐性状态时,CAN_H和CAN_L都是2.5V。终端电阻和收发器内部的偏置电路一起,维持这个电压。

为什么是120Ω?因为CAN总线用的双绞线特性阻抗大约是120Ω。你想想看,如果不匹配,信号反射回来就会叠加到原始信号上,轻则影响采样,重则导致通信失败。

注意!

终端电阻必须放在总线的两端,不能放在中间。我见过有人把两个120Ω电阻都放在一个节点上,结果总线信号完全乱套了。正确的做法是:总线最远的两个节点各放一个120Ω电阻。

我曾经在一个项目中,因为终端电阻放错了位置,导致总线上的信号反射严重,CAN控制器一直报错。排查了整整两天,最后用示波器一看,波形上全是振铃。把电阻挪到两端后,波形干净得像教科书一样。

4.4 总线长度与波特率:鱼和熊掌不可兼得

总线长度和波特率的关系,说白了就是:速度越快,能跑的距离越短。为什么?因为信号在总线上的传输速度是有限的(大约5ns/m),波特率越高,一个位的时间就越短,信号在总线上来回反射的时间窗口就越小。

经典CAN的推荐关系如下:

波特率 最大总线长度 典型应用
1 Mbps 40 m 动力系统、底盘控制
500 kbps 100 m 车身控制、信息娱乐
250 kbps 250 m 诊断、低速网络
125 kbps 500 m 工业控制、大型车辆

嗯,这里要注意:这个表格是理论值,实际工程中要留余量。我个人习惯,500kbps的总线长度控制在80米以内,1Mbps控制在30米以内。

为什么?因为车上还有各种干扰源——电机、逆变器、DC-DC,这些都会在总线上引入噪声。总线越长,噪声耦合进来的机会就越大。

4.5 信号采样点:一个位的时间怎么分?

CAN通信中,一个位的时间被分成了四段:同步段、传播段、相位缓冲段1、相位缓冲段2。采样点就落在相位缓冲段1和相位缓冲段2之间。

采样点的位置很关键。太早了,信号还没稳定;太晚了,可能已经进入下一个位了。标准推荐采样点在87.5%的位置,也就是一个位的87.5%处采样。

为什么是这个值?因为CAN总线有同步机制,节点之间会有时钟偏差。采样点靠后一些,能容忍更大的时钟偏差。

采样点配置示例(500kbps)

// 假设系统时钟为80MHz,CAN时钟分频后为40MHz
// 目标波特率:500kbps
// 位时间 = 1/500k = 2000ns
// 时间量子Tq = 1/40M = 25ns
// 每个位包含的Tq数 = 2000/25 = 80

// 推荐配置:
// 同步段:1 Tq
// 传播段:7 Tq
// 相位缓冲段1:62 Tq
// 相位缓冲段2:10 Tq
// 采样点位置 = (1+7+62)/80 = 87.5%

// 代码示例(以NXP S32K为例):
CAN_CTRL1.BIT.PROPSEG = 6;    // 传播段 = 7 Tq (寄存器值=6)
CAN_CTRL1.BIT.PSEG1 = 61;     // 相位缓冲段1 = 62 Tq (寄存器值=61)
CAN_CTRL1.BIT.PSEG2 = 9;      // 相位缓冲段2 = 10 Tq (寄存器值=9)
CAN_CTRL1.BIT.RJW = 4;        // 同步跳转宽度 = 5 Tq (寄存器值=4)

避坑指南

我曾经在一个项目中,为了追求更高的总线利用率,把采样点调到了75%。结果呢?在实验室跑得好好的,一到整车路试就频繁丢帧。后来发现是不同节点的晶振精度不一样,采样点太靠前,导致时钟偏差累积后采样失败。改回87.5%后,问题就消失了。

所以我的建议是:除非你有充分的理由,否则就用标准推荐的87.5%。别瞎折腾。

4.6 实战经验总结

好了,说了这么多,我总结几条实战经验:

  • 拓扑优先:能用直线型就别用星型,简单就是可靠
  • 终端电阻别搞错:两个120Ω,放在最远的两端,别放中间
  • 长度和速度要匹配:500kbps别超过100米,1Mbps别超过40米
  • 采样点用标准值:87.5%,别自作聪明去调
  • 节点设计要扎实:共模扼流圈、ESD保护、电源滤波,一个都不能少

最后说一句:CAN网络设计看着简单,但细节决定成败。你想想看,一辆车几十个ECU,如果CAN总线出问题,那可不是重启一下就能解决的。所以,设计时多花点心思,测试时多跑几个场景,总比出了问题再返工强。

下一章我们聊聊CAN FD和车载以太网,这两个东西在新能源车上越来越常见了。