4、CAN控制器与收发器:SJA1000/MCP2515等控制器介绍、TJA1040/SN65HVD230等收发器选型、外围电路设计要点

好,咱们进入第四章。这一章聊的是CAN硬件层面的核心——控制器和收发器。

很多刚入行的朋友容易把这两者搞混。我简单解释一下:控制器负责协议处理,收发器负责电平转换。说白了,控制器是大脑,收发器是嘴巴。大脑想好要说什么,嘴巴把它喊出去。

4.1 CAN控制器:SJA1000与MCP2515

先聊控制器。市面上主流的独立CAN控制器,绕不开两个型号:SJA1000MCP2515

SJA1000——老当益壮

SJA1000是NXP(原Philips)的产品。它支持BasicCAN和PeliCAN两种模式。我个人习惯直接用PeliCAN模式,功能更全,支持11位和29位标识符。

它的接口是并口的,地址线、数据线一大堆。如果你用单片机资源比较富裕,比如用STM32的FSMC总线去挂它,那没问题。但如果你I/O口紧张,用SJA1000就有点痛苦了。

我记得有一次项目,MCU选了个小封装的,引脚不够用。硬着头皮用GPIO模拟并口时序去操作SJA1000,那代码写得...嗯,调试了整整两天。后来我学乖了,引脚紧张的时候直接换MCP2515。

关键参数:
  • 工作电压:5V
  • 接口:并行(8位数据总线)
  • 支持CAN 2.0A/B
  • 最大速率:1Mbps
  • 接收缓冲区:64字节FIFO

MCP2515——SPI接口的福音

MCP2515是Microchip的产品。它最大的优势就是SPI接口。你想想看,一个SPI接口只需要4根线(CS、SCK、MOSI、MISO),比SJA1000那十几根线省事多了。

我现在的项目,只要不是对实时性有变态要求的场合,基本都用MCP2515。它内部集成了三个发送缓冲器、两个接收缓冲器,还有六个29位过滤器。这个过滤功能很实用,能帮你筛掉大量无关报文,减轻MCU负担。

不过要注意一点:MCP2515的SPI时钟频率最高只能到10MHz。我曾经遇到过有人把它挂到20MHz的SPI总线上,结果数据全是乱的。嗯,这里要注意,别超频

我的选型建议:
MCU引脚多、对实时性要求高 → 选SJA1000
MCU引脚少、追求设计简洁 → 选MCP2515
如果MCU内部自带CAN控制器,那当然优先用内部的,省一颗芯片的钱。

4.2 CAN收发器:TJA1040与SN65HVD230

控制器搞定了,接下来是收发器。收发器的作用就是把控制器的数字信号(TX/RX)转换成CAN总线上的差分信号(CANH/CANL)。

TJA1040——高速稳定

TJA1040是NXP的产品,是TJA1050的升级版。它支持1Mbps的速率,待机电流极低,只有几十微安。而且它有显性超时功能——如果TX引脚被拉低时间过长,它会自动关闭驱动器,防止总线被锁死。

这个功能我深有体会。有一次调试,代码里有个bug,导致CAN发送任务卡死了,TX引脚一直低电平。如果没有这个保护功能,整条CAN总线都会被拖死,其他节点全得瘫痪。TJA1040自动切断了,其他节点还能正常工作。我当时长舒一口气。

TJA1040关键特性:
  • 工作电压:5V
  • 速率:最高1Mbps
  • 待机模式:电流<10μA
  • 显性超时保护:有
  • 总线引脚ESD保护:±8kV

SN65HVD230——3.3V系统的首选

SN65HVD230是TI的产品。它最大的特点是3.3V供电。现在很多低功耗MCU都是3.3V的,如果用5V的收发器,还得加电平转换电路,麻烦。SN65HVD230直接3.3V搞定。

它的速率也是1Mbps,而且有三种工作模式:高速模式、斜率控制模式和待机模式。斜率控制模式可以降低EMI,对EMC要求高的场合很实用。

我有个项目是做车载诊断设备,用的就是SN65HVD230。因为设备是电池供电的,3.3V系统省电。而且它体积小,SOP-8封装,板子上不占地方。

参数 TJA1040 SN65HVD230
供电电压 5V 3.3V
最大速率 1Mbps 1Mbps
待机电流 <10μA <1μA
工作模式 正常/待机 高速/斜率/待机
典型应用 车载、工业 便携设备、3.3V系统

4.3 外围电路设计要点

芯片选好了,电路设计才是见真功夫的地方。我见过太多人,芯片选得挺好,结果外围电路画得一塌糊涂,总线通信就是不稳定。

终端电阻——必须加

CAN总线两端必须各加一个120Ω的终端电阻。这个电阻的作用是匹配阻抗,防止信号反射。

有人问:我能不能只加一个?或者不加?
答案是:不能。不加终端电阻,总线上的信号会像弹簧一样来回弹,数据根本没法看。我见过一个项目,终端电阻焊错了,焊成了10Ω,结果总线波形惨不忍睹。

注意:终端电阻要加在总线的最远端。如果节点数多,总线拓扑复杂,建议用示波器看看波形,确认信号质量。

共模扼流圈——抗干扰利器

在CANH和CANL线上串一个共模扼流圈(Common Mode Choke),可以有效抑制共模干扰。特别是在车载环境,发动机点火、电机启动都会产生强烈的电磁干扰。

我一般选100μH左右的共模扼流圈,封装选小一点的,比如0805或0603。注意扼流圈的额定电流要大于总线上的最大电流,一般100mA以上就够了。

保护电路——防患于未然

CAN总线是暴露在外的,很容易被静电、浪涌打坏。所以保护电路不能省。

我的标准做法是:

  • 在CANH和CANL对地各加一个TVS管,选双向的,击穿电压5V~6V左右
  • 在CANH和CANL之间加一个电容,10pF~100pF,滤除高频噪声
  • 如果环境特别恶劣,再加一个气体放电管,不过成本会高一些

我曾经有个客户,产品在工厂里用,环境比较干净,就没加TVS管。结果有一次工人把CAN线插拔的时候带电操作,啪一下,收发器烧了。从那以后,我所有设计都加上TVS管,哪怕客户说不用加,我也坚持加。这是经验教训。

电源去耦——别忽视

收发器在工作时,电流变化很快。如果电源去耦不好,会导致总线信号抖动。

我的习惯是:在收发器的电源引脚旁边放一个100nF的陶瓷电容,尽量靠近引脚。如果空间允许,再加一个10μF的电解电容。这样高频和低频的去耦都照顾到了。

一个小技巧: 在PCB布局时,把收发器尽量靠近CAN连接器。这样CANH/CANL的走线可以最短,减少天线效应。我一般控制在10mm以内

完整的参考电路

下面给一个MCP2515 + TJA1040的典型电路示意。注意这只是核心部分,电源和MCU部分省略了。

// MCP2515与TJA1040连接示意
// MCP2515          TJA1040
// TXCAN  ---------> TXD
// RXCAN  <--------- RXD
// VCC    ---------> VCC (5V)
// GND    ---------> GND
//
// TJA1040外围:
// CANH ---- 120Ω ---- CAN总线H
// CANL ---- 120Ω ---- CAN总线L
// CANH ---- TVS ---- GND
// CANL ---- TVS ---- GND
// CANH ---- 100pF --- CANL
// VCC ---- 100nF ---- GND (靠近引脚)
//
// MCP2515外围:
// CS  ---- MCU GPIO
// SCK ---- MCU SPI SCK
// SI  ---- MCU SPI MOSI
// SO  ---- MCU SPI MISO
// INT ---- MCU GPIO (中断引脚)
// OSC1/OSC2 ---- 16MHz晶振 + 15pF电容

嗯,这个电路我用了很多年,基本没出过问题。如果你是新设计,可以直接抄这个框架,再根据具体芯片微调一下。

好了,这一章就到这里。下一章我们聊聊CAN的帧结构,那才是协议的精髓所在。