3. CAN帧结构详解

做CAN总线系统,最核心的硬件选型就是控制器和收发器。我见过不少项目,软件写得挺好,结果硬件选型没做好,最后通讯就是不稳定。今天咱们就把这块掰开揉碎了讲清楚。

3.1 主流CAN控制器芯片选型

CAN控制器负责协议层的活儿——帧封装、仲裁、错误检测这些。市面上主流的方案分两类:独立控制器和集成控制器。

3.1.1 独立CAN控制器

这类芯片需要外接MCU,通过SPI或并行接口通信。典型代表有:

型号 接口 缓冲区 我最看重的点
MCP2515 SPI 2个TX缓冲 + 1个RX缓冲 便宜、资料多、适合入门
SJA1000 并行 64字节FIFO 工业级、抗干扰强
MCP2518FD SPI 32个对象缓冲 支持CAN FD、DMA传输

我个人习惯,如果MCU资源紧张或者想快速验证,首选MCP2515。但如果是量产项目,我建议用集成方案——少一颗芯片,少一个故障点。

3.1.2 集成CAN控制器

现在大部分MCU都内置了CAN控制器。比如STM32的bxCAN、NXP的FlexCAN、TI的DCAN。选型时我主要看三点:

  • 邮箱数量:STM32F1只有3个邮箱,做多节点数据采集时很容易溢出。我踩过这个坑。
  • FIFO深度:有些芯片只有1级FIFO,高负载下丢帧是常事。
  • 时钟源:CAN控制器需要精确的时钟,内部RC振荡器往往不够用。
我曾经踩过的坑: 用STM32F103的bxCAN做8节点数据采集,邮箱只有3个,结果高负载下一直丢帧。后来换成STM32F407,邮箱翻倍到6个,问题才解决。选型时别只看主频,CAN邮箱数量同样关键。

3.2 CAN收发器工作原理

收发器是控制器和物理总线之间的桥梁。它把控制器的数字信号转换成差分信号,再送到CAN_H和CAN_L线上。

3.2.1 信号转换过程

说白了,收发器就干两件事:

  1. 发送时:把TX引脚的逻辑电平转成差分电压。显性位(0)输出2.5V+1V=3.5V(CAN_H)和2.5V-1V=1.5V(CAN_L);隐性位(1)两线都回到2.5V。
  2. 接收时:检测CAN_H和CAN_L的电压差,差大于0.9V判为显性,小于0.5V判为隐性。

你想想看,为什么用差分信号?因为共模干扰在两根线上同时出现,一减就没了。这就是CAN能在工业现场稳定工作的根本原因。

3.2.2 常见收发器对比

型号 速率 工作电压 特色功能
TJA1050 1Mbps 5V 低功耗、EMC性能好
SN65HVD230 1Mbps 3.3V 适合低压系统
TJA1043 5Mbps 5V 支持CAN FD、待机模式
ISO1050 1Mbps 5V 隔离型、抗浪涌
我的选型习惯: 3.3V系统用SN65HVD230,5V系统用TJA1050。如果总线要过恶劣环境(比如车载),直接上ISO1050隔离型,省得后面返工。

3.3 电气特性与总线拓扑

这部分是硬件工程师的必修课。电气特性搞不清楚,总线跑起来全是问题。

3.3.1 关键电气参数

  • 差分电压:显性位1.5V~3.5V,隐性位2.5V。差值超过0.9V才算有效。
  • 共模电压:理想是2.5V,实际允许-2V~+7V。超过这个范围,收发器会进入保护状态。
  • 终端电阻:120Ω,两端各一个。作用是匹配阻抗、消除反射。
  • 总线长度:和速率成反比。1Mbps时最长40米,125kbps时可以到500米。

嗯,这里要注意:终端电阻不是随便焊的。我见过有人只在总线一端焊了120Ω,结果信号反射得一塌糊涂。

3.3.2 总线拓扑结构

CAN总线是线性拓扑,说白了就是一根主干线,所有节点都挂上去。结构图如下:

CAN总线线性拓扑结构 CAN_H CAN_L 120Ω 120Ω 节点1 节点2 节点3 节点4 注意:所有节点并联在主干线上,不能有星形或环形分支 分支长度建议不超过30cm,否则信号反射严重

3.3.3 拓扑设计避坑指南

我曾经犯过的错: 做一套设备,为了布线方便,把节点接成了星形。结果总线怎么调都不稳定,最后发现是分支太长导致信号反射。改成线性拓扑后,问题立刻消失。

设计总线拓扑时,记住几个硬指标:

  • 分支长度:不超过30cm。实在不行就用中继器。
  • 节点间距:没有严格限制,但建议不小于0.3米。
  • 总线长度:按速率算,1Mbps时40米封顶。
  • 节点数量:标准CAN最多110个,实际建议不超过32个。

3.4 实战选型建议

最后给几个实在的建议:

  1. 低速率、短距离(125kbps以内,20米以下):MCP2515 + TJA1050,成本最低。
  2. 高速率、中等距离(500kbps,100米以内):用集成控制器 + SN65HVD230,省PCB面积。
  3. 恶劣环境(车载、工业现场):ISO1050隔离型收发器,贵但省心。
  4. 需要CAN FD:MCP2518FD + TJA1043,速率能到5Mbps。

我的经验: 不管选什么方案,终端电阻一定要焊在PCB上,别用跳线帽。我见过产线工人忘了插跳线帽,整批板子通讯失败。硬件设计要防呆,别考验人性。