3. CAN控制器与收发器:硬件选型与实战经验

做CAN总线开发,绕不开两个核心器件:控制器和收发器。

控制器负责协议处理——把你要发的数据打包成CAN帧,或者从总线上把帧解析出来。收发器则负责物理层——把控制器输出的逻辑电平转换成CAN总线上的差分信号。

说白了,控制器是“大脑”,收发器是“嘴巴和耳朵”。

核心关系:MCU(主控) ↔ CAN控制器(协议引擎) ↔ CAN收发器(物理层) ↔ CAN总线(差分双绞线)

3.1 独立CAN控制器芯片

早期MCU很多不带CAN外设,所以得外挂一颗独立的CAN控制器。就算现在,有些场景下独立控制器依然有优势——比如你要扩展多路CAN,或者主控芯片选型受限。

3.1.1 SJA1000——经典中的经典

NXP的SJA1000,可以说是CAN控制器界的“老前辈”了。我入行那会儿,几乎所有CAN项目都在用这颗芯片。

它支持两种模式:

  • BasicCAN模式:兼容老款82C200,发送/接收缓冲区各只有1个,适合简单应用
  • PeliCAN模式:扩展模式,支持11位和29位标识符,有64字节的接收FIFO

我个人习惯,新项目一律用PeliCAN模式。BasicCAN那个单缓冲区,在高负载下很容易丢帧。

参数 SJA1000
接口 并行(8位/16位)
支持协议 CAN 2.0A / 2.0B
接收FIFO 64字节(PeliCAN模式)
工作电压 5V
封装 DIP28 / SO28

注意:SJA1000是5V器件。如果你用3.3V的MCU,需要做电平转换。我曾经在一个项目里直接连,结果SJA1000死活不工作,查了半天才发现是电平不匹配。

3.1.2 MCP2515——SPI接口的现代选择

Microchip的MCP2515,通过SPI接口与MCU通信。相比SJA1000的并行接口,MCP2515只需要4根线(SCK、MOSI、MISO、CS),大大节省了MCU的IO引脚。

我特别喜欢这颗芯片的一点:它内部有3个发送缓冲区和2个接收缓冲区,还支持接收过滤和屏蔽。对于中等负载的CAN网络,完全够用。

参数 MCP2515
接口 SPI(最高10MHz)
支持协议 CAN 2.0A / 2.0B
发送缓冲区 3个
接收缓冲区 2个 + 1个MAB
工作电压 2.7V ~ 5.5V

选型建议:如果你的MCU引脚紧张,或者想快速验证CAN功能,MCP2515是首选。Arduino上的CAN扩展板,十有八九用的就是它。

3.2 CAN收发器芯片

收发器把控制器的逻辑电平(通常是3.3V或5V)转换成CAN总线的差分信号(CAN_H和CAN_L)。

3.2.1 TJA1050——高速CAN收发器的标杆

NXP的TJA1050,是TJA1050的升级版。它支持最高1Mbps的通信速率,而且电磁兼容性(EMC)做得很好。

我记得有一次做车载项目,现场总线老是出现偶发错误。排查了几天,最后发现是收发器抗干扰能力不够。换成TJA1050后,问题就再没出现过。

参数 TJA1050
速率 最高1Mbps
工作电压 4.75V ~ 5.25V
待机模式 支持(电流<10μA)
总线引脚保护 ±8kV ESD
封装 SO8

3.2.2 SN65HVD230——3.3V系统的理想搭档

TI的SN65HVD230,专为3.3V系统设计。如果你用STM32这类3.3V的MCU,这颗芯片可以直接对接,不需要电平转换。

它有三种工作模式:

  • 高速模式:正常通信,速率最高1Mbps
  • 斜率控制模式:通过外接电阻控制上升/下降沿斜率,降低EMI
  • 待机模式:低功耗,接收器仍工作

对比总结:

  • TJA1050:5V系统,抗干扰强,适合工业/车载
  • SN65HVD230:3.3V系统,低功耗,适合便携/电池供电设备

3.3 MCU集成CAN外设

现在越来越多的MCU把CAN控制器集成到芯片内部。比如STM32的bxCAN、NXP的FlexCAN、TI的DCAN等。

集成的好处很明显:

  • 省成本:少一颗芯片,PCB面积和BOM成本都降了
  • 省IO:不需要额外的并行或SPI接口
  • 性能更好:内部总线访问,延迟更低

以STM32F103的bxCAN为例:

  • 支持CAN 2.0A和2.0B
  • 3个发送邮箱
  • 2个接收FIFO(每个FIFO有3个邮箱)
  • 14个可配置的接收过滤器组

实战经验:用集成CAN外设时,别忘了看数据手册的“CAN时钟”部分。STM32的CAN外设挂载在APB1总线上,时钟最高36MHz。如果配错了时钟分频,波特率怎么算都不对。

3.4 知识体系结构图

下面这张图,帮你理清控制器和收发器的选型逻辑:

CAN控制器与收发器选型结构图 CAN控制器与收发器选型结构 MCU(主控) 独立CAN控制器 SJA1000(并行) MCP2515(SPI) MCU集成CAN外设 bxCAN / FlexCAN CAN收发器 TJA1050(5V) SN65HVD230(3.3V) 选型要点: 电压匹配 速率要求

3.5 实战选型建议

说了这么多,到底怎么选?我总结了几条经验:

  1. 看MCU:如果MCU自带CAN外设,优先用集成的。省事、省钱、省PCB空间。
  2. 看电压:3.3V系统用SN65HVD230,5V系统用TJA1050。别混用,除非你做了电平转换。
  3. 看环境:工业现场、车载等强干扰环境,优先选TJA1050。它的抗干扰能力确实强。
  4. 看扩展:如果需要多路CAN,或者主控不带CAN,MCP2515+SJA1000的组合很灵活。

避坑指南:我曾经在一个项目里,为了省成本,用了某国产的CAN收发器。结果在-20℃低温测试时,总线通信全部瘫痪。后来换成TJA1050,问题解决。有些钱,真不能省。