4、CAN控制器与收发器:SJA1000/MCP2515等控制器介绍、TJA1040/SN65HVD230等收发器选型、外围电路设计要点
好,咱们进入第四章。这一章聊的是CAN硬件层面的核心——控制器和收发器。
很多刚入行的朋友容易把这两者搞混。我简单解释一下:控制器负责协议处理,收发器负责电平转换。说白了,控制器是大脑,收发器是嘴巴。大脑想好要说什么,嘴巴把它喊出去。
4.1 CAN控制器:SJA1000与MCP2515
先聊控制器。市面上主流的独立CAN控制器,绕不开两个型号:SJA1000和MCP2515。
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自动切断了,其他节点还能正常工作。我当时长舒一口气。
- 工作电压: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的电解电容。这样高频和低频的去耦都照顾到了。
完整的参考电路
下面给一个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的帧结构,那才是协议的精髓所在。