4、CAN控制器与收发器:SJA1000、MCP2515、TJA1050、SN65HVD230选型与对比

做CAN通信,说白了就两样东西绕不开:控制器收发器

控制器负责协议处理,收发器负责电平转换。我见过不少新手,一上来就纠结选哪个芯片。其实没那么玄乎,搞清楚各自定位就好。

今天咱们就聊聊四款经典芯片:SJA1000MCP2515TJA1050SN65HVD230。前两个是控制器,后两个是收发器。

4.1 控制器选型:SJA1000 vs MCP2515

先说说控制器。我个人习惯,选控制器主要看三点:接口方式封装大小供货稳定性

SJA1000——老牌劲旅

SJA1000是NXP(原Philips)的经典产品。我入行那会儿,几乎所有的CAN节点都用它。它支持CAN 2.0B,兼容BasicCAN和PeliCAN两种模式。

它的接口是并行总线,说白了就是地址线、数据线一大堆。接MCU的时候,像接SRAM一样。好处是速度快,坏处是占引脚。

核心参数:

  • 工作电压:5V
  • 接口:并行(Intel/Motorola模式)
  • 支持CAN 2.0B(29位扩展ID)
  • 64字节接收FIFO
  • 支持单次/自接收/监听模式

我在项目中遇到过一个问题:SJA1000的复位时序要求很严格。有一次板子焊完,CAN死活不通。查了半天,发现是MCU的复位信号比SJA1000慢了一点点。嗯,这里要注意,复位引脚必须拉低至少5个时钟周期

MCP2515——SPI接口的灵活选手

MCP2515是Microchip的产品。它最大的特点是SPI接口。你想想看,只要MCU有SPI,就能扩展出一路CAN。这对引脚紧张的MCU来说,简直是救星。

我建议,如果你的MCU引脚不多,或者想快速验证方案,直接上MCP2515。它内部集成了三个发送缓冲器、两个接收缓冲器,还有6个滤波器。

核心参数:

  • 工作电压:2.7V~5.5V
  • 接口:SPI(最高10MHz)
  • 支持CAN 2.0B
  • 3个发送缓冲器,2个接收缓冲器
  • 6个接收滤波器,2个掩码

不过MCP2515有个小坑——SPI通信速率不能太高。我曾经为了追求速度,把SPI时钟调到10MHz,结果数据经常错位。后来降到5MHz,稳如老狗。所以别贪快,5MHz以内最保险。

怎么选?

对比项 SJA1000 MCP2515
接口 并行 SPI
引脚数 28脚(占用MCU引脚多) 18脚(占用MCU引脚少)
速度 快(直接内存映射) 受限于SPI速率
灵活性 一般 高(可扩展多路)
供货 成熟,但逐渐停产 充足,仍在量产

我个人习惯:新项目首选MCP2515。除非你MCU自带CAN控制器,或者对实时性要求极高,才考虑SJA1000。

4.2 收发器选型:TJA1050 vs SN65HVD230

收发器的作用,就是把控制器的逻辑电平,转换成CAN总线的差分信号。说白了,它就是个电平转换器加驱动器。

TJA1050——5V系统的标配

TJA1050是NXP的经典收发器。它替代了早期的TJA1040和PCA82C250。我最早用82C250,那个芯片发热厉害。后来换成TJA1050,功耗低了不少。

TJA1050支持5V供电,最高速率1Mbps。它内部有热保护、短路保护,抗干扰能力不错。

小技巧: TJA1050的RS引脚(斜率控制)接地时,进入高速模式。如果总线长度超过100米,建议在RS引脚接一个10kΩ电阻到地,降低边沿斜率,减少反射。

我曾经在一条200米长的CAN总线上调试,信号反射得一塌糊涂。后来把RS引脚接了电阻,再配合终端电阻120Ω,问题就解决了。

SN65HVD230——3.3V系统的首选

SN65HVD230是TI的产品。它最大的特点是3.3V供电。现在很多MCU都是3.3V的,如果用TJA1050,还得加电平转换。用SN65HVD230就省事了。

它支持待机模式,功耗极低。适合电池供电的设备,比如车载诊断设备、便携式工具。

核心参数:

  • 工作电压:3.0V~3.6V
  • 速率:最高1Mbps
  • 待机电流:<1μA
  • 支持CAN 2.0B
  • 热关断保护

不过要注意,SN65HVD230的共模电压范围是-7V~+12V。如果总线环境特别恶劣,比如有高压干扰,建议加隔离。

怎么选?

对比项 TJA1050 SN65HVD230
供电电压 5V 3.3V
待机模式 支持(通过RS引脚) 支持(通过S引脚)
功耗 中等
抗干扰 中等
适用场景 工业、车载5V系统 3.3V系统、低功耗设备

我建议:5V系统用TJA1050,3.3V系统用SN65HVD230。别混用,否则电平不匹配,通信会出问题。

4.3 实战搭配方案

说了这么多,直接给几个我常用的搭配方案:

方案一:5V MCU + SJA1000 + TJA1050

适合:工业控制、车载ECU、对实时性要求高的场景。

注意:MCU引脚要够用,SJA1000占用至少8个IO。

方案二:3.3V MCU + MCP2515 + SN65HVD230

适合:便携设备、电池供电、引脚紧张的场景。

注意:SPI走线要短,时钟不要超过5MHz。

方案三:3.3V MCU + MCP2515 + TJA1050(加电平转换)

适合:手头只有TJA1050,但MCU是3.3V的。

注意:MCP2515的TXD/RXD是5V电平,需要加电平转换芯片(如74LVC4245)。

4.4 避坑指南

最后,分享几个我踩过的坑:

坑1:终端电阻忘接

我曾经调试一块板子,CAN信号波形乱七八糟。查了半天,发现终端电阻没焊。CAN总线两端必须各接一个120Ω电阻,否则信号反射严重。

坑2:收发器供电不足

有一次用SN65HVD230,总线长度不到50米,但通信老是丢帧。后来用示波器一看,收发器的VCC只有2.8V。原来是电源走线太细,压降太大。换粗线后问题解决。

坑3:MCP2515的晶振选错

MCP2515需要外部晶振。我一开始用了16MHz的,结果CAN速率怎么算都不对。后来才发现,MCP2515内部有分频器,晶振频率必须和CAN速率匹配。建议用8MHz晶振,兼容性最好。

好了,关于CAN控制器和收发器的选型,就聊这么多。记住一句话:选型不是越贵越好,合适才是王道。下一章咱们聊聊CAN总线的终端电阻和拓扑结构,到时候见。