第四章 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网络里最容易被误解的东西。很多人以为它就是个匹配电阻,其实它的作用有两个:
- 消除信号反射:当信号在总线末端遇到阻抗突变时,会产生反射。终端电阻把末端阻抗匹配到120Ω,反射就没了。
- 提供总线偏置: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和车载以太网,这两个东西在新能源车上越来越常见了。