第3章:CAN控制器与收发器——SJA1000、MCP2515、TJA1050等芯片介绍与硬件电路设计要点
各位同学,咱们今天聊聊CAN通信的“物理层”核心——控制器和收发器。说白了,控制器负责“动脑子”,收发器负责“喊话”。我刚开始做CAN开发时,总觉得选个芯片接上就能跑,结果被硬件坑得够呛。嗯,今天咱们就把这些坑填上。
3.1 CAN控制器:SJA1000与MCP2515
控制器的作用,就是把你要发的数据,按照CAN协议打包成帧,或者把收到的帧解析成数据。市面上主流的有两种:一种是集成在MCU内部的,比如STM32的bxCAN;另一种是独立的,比如SJA1000和MCP2515。
3.1.1 SJA1000——老当益壮的经典
SJA1000是NXP(原Philips)的产品,可以说是CAN控制器的“元老”。它支持BasicCAN和PeliCAN两种模式。我个人习惯直接用PeliCAN模式,因为支持29位扩展帧,功能更全。
关键特性:
- 兼容16位/8位微处理器接口
- 64字节的接收FIFO(够用,但别塞太满)
- 支持单次发送、自接收模式(调试时很有用)
- 时钟频率:16MHz或24MHz
我在项目中遇到过一个问题:SJA1000的复位引脚必须拉低至少2个时钟周期,否则芯片初始化会失败。当时查了半天手册才发现,嗯,这就是不看细节的代价。
3.1.2 MCP2515——SPI接口的“万金油”
MCP2515是Microchip的产品,最大的特点是通过SPI接口与MCU通信。这意味着你随便找个带SPI的单片机就能用,不挑MCU型号。我特别喜欢用它来做CAN转接板,或者给老旧系统加CAN功能。
| 对比项 | SJA1000 | MCP2515 |
|---|---|---|
| 接口类型 | 并行(8/16位) | SPI(串行) |
| 引脚数 | 28/44 | 18 |
| 接收缓冲器 | 64字节FIFO | 2个接收缓冲器+1个MAB |
| 典型应用 | 工业控制、汽车ECU | 嵌入式系统、DIY项目 |
MCP2515有个小坑:它的SPI时钟频率最高只能到10MHz,而且发送数据时,必须等前一个帧发送完成才能加载下一个。我曾经因为连续发送太快,导致数据丢帧。解决办法是在每次发送前检查TXREQ位是否清零。
我的建议:如果MCU引脚够用,选SJA1000,实时性更好;如果追求布线简单、引脚少,选MCP2515。别纠结,看项目需求。
3.2 CAN收发器:TJA1050与TJA1040
收发器负责把控制器的逻辑电平(通常是3.3V或5V)转换成CAN总线的差分信号(CAN_H和CAN_L)。说白了,它是“翻译官”。
3.2.1 TJA1050——高速收发器的标杆
TJA1050是NXP的经典产品,支持最高1Mbps的通信速率。它的特点是斜率控制和待机模式。我最早用的就是它,皮实耐造,几乎不出问题。
为什么需要斜率控制?你想想看,如果信号上升沿太陡,会产生电磁辐射(EMI),干扰其他设备。TJA1050的引脚8(RS)可以接电阻来控制斜率。我一般接47kΩ到GND,这样速率在500kbps时波形很漂亮。
注意:TJA1050的电源电压是5V,不能直接接3.3V的MCU!如果你用3.3V的控制器,需要加电平转换,或者选TJA1040(支持3.3V逻辑输入)。
3.2.2 TJA1040——低功耗的升级版
TJA1040是TJA1050的升级版,主要改进是更低的电磁辐射和支持本地唤醒。如果你做的是车载ECU,需要低功耗模式,TJA1040是更好的选择。
我曾经在做一个汽车BCM项目时,要求待机电流小于100μA。TJA1050的待机电流是5μA,但唤醒需要额外的引脚检测。换成TJA1040后,直接用CAN总线唤醒,省了一个GPIO,真香。
3.3 硬件电路设计要点
芯片选好了,接下来就是画板子。这部分我踩过的坑最多,大家认真听。
3.3.1 终端电阻:120Ω不是摆设
CAN总线两端必须各接一个120Ω的终端电阻。为什么?因为CAN总线是差分信号,需要电阻来匹配阻抗,防止信号反射。我见过有人偷懒只接一个,结果总线长度超过1米就开始丢包。
计算公式:终端电阻值 = 电缆的特性阻抗(通常为120Ω)。别乱改,否则信号质量会变差。
3.3.2 电源去耦:别让噪声毁了通信
CAN收发器在工作时,瞬间电流变化很大。如果电源去耦不好,会导致总线信号抖动。我习惯在每个收发器的电源引脚旁边放一个100nF的陶瓷电容,再加一个10μF的电解电容。位置要尽量靠近芯片,走线要短。
3.3.3 共模扼流圈:抗干扰的利器
在CAN_H和CAN_L线上串联一个共模扼流圈,可以有效抑制共模干扰。特别是在工业环境或者汽车上,电机、继电器产生的噪声很可怕。我一般选TDK的ACT45B系列,或者Murata的DLW系列。
3.3.4 保护电路:防反接、防浪涌
CAN总线是暴露在外的,很容易被静电或者电源反接搞坏。我的标准做法是:
- 在CAN_H和CAN_L对地各接一个TVS管(比如SMBJ12A)
- 在电源入口加一个自恢复保险丝(PTC)
- 在收发器的CANH/CANL引脚串联22Ω电阻(限流)
避坑指南:我曾经在批量生产时,发现一批板子CAN通信不稳定。查了半天,发现是TVS管的结电容太大(超过50pF),导致信号边沿变缓。后来换成低电容TVS(<5pF),问题解决。嗯,选型时一定要看结电容参数。
3.4 实战电路示例
下面是一个典型的CAN节点电路,使用MCP2515 + TJA1050组合:
// MCP2515与TJA1050连接示意
// MCU (SPI) -> MCP2515 -> TJA1050 -> CAN总线
// MCP2515引脚连接:
// CS -> MCU GPIO (片选)
// SCK -> MCU SPI_SCK
// SI -> MCU SPI_MOSI
// SO -> MCU SPI_MISO
// INT -> MCU GPIO (中断)
// TJA1050引脚连接:
// TXD -> MCP2515 TXCAN
// RXD -> MCP2515 RXCAN
// RS -> 47kΩ 到 GND (高速模式)
// CANH -> 120Ω 终端电阻 -> CAN_H
// CANL -> 120Ω 终端电阻 -> CAN_L
注意:MCP2515的VIO引脚要接MCU的IO电压(3.3V或5V),而TJA1050的VCC必须接5V。如果MCU是3.3V,MCP2515的VIO接3.3V,这样SPI电平就匹配了。
3.5 调试经验分享
最后,分享几个我调试CAN硬件时的“血泪史”:
- 示波器是必须的。先看CAN_H和CAN_L的差分信号,正常应该是显性位约2.5V,隐性位约1.5V。如果波形不对,先查电源和终端电阻。
- 波特率要匹配。总线上所有节点的波特率必须一致,误差不超过1%。我习惯用CAN分析仪先发一帧,看其他节点能不能收到。
- 接地很重要。CAN总线是隔离的,但节点之间最好共地。如果不共地,共模电压可能超过收发器的承受范围(通常-12V到+12V)。
终极警告:千万不要在CAN总线带电时插拔节点!否则瞬间的浪涌可能会烧毁收发器。我亲眼见过一个同事因为热插拔,烧了三个TJA1050。嗯,从那以后,我每次断电后才敢动总线。
好了,这一章的内容就到这里。CAN控制器和收发器的选型与电路设计,说白了就是“选对芯片,接好电阻,做好保护”。下一章咱们聊聊CAN协议栈的软件实现,到时候会用到今天讲的硬件知识。