2、CAN控制器与收发器:常用CAN芯片选型与硬件电路设计要点

大家好,我是你们的讲师。这一章咱们聊聊CAN通信的“心脏”和“手脚”——控制器和收发器。很多初学者容易把这两者搞混,其实说白了,控制器负责协议处理,收发器负责电平转换。我刚开始做电机驱动时,就因为选错芯片,折腾了好几天。今天就把这些经验分享给你们。

2.1 CAN控制器:协议处理的核心

CAN控制器负责完成CAN协议的数据链路层功能。它把你要发送的数据打包成标准帧或扩展帧,处理仲裁、错误检测这些脏活累活。你想想看,如果没有控制器,光靠MCU的GPIO去模拟CAN时序,那CPU基本就干不了别的事了。

2.1.1 STM32 FDCAN:新一代集成方案

现在做电机控制,我个人最推荐的是STM32的FDCAN外设。它集成在G4、H7、MP1这些系列里。为什么推荐它?

  • 速率高:传统CAN最高1Mbps,FDCAN可以跑到8Mbps甚至更高。电机控制里数据量大,这个优势很明显。
  • 数据场大:传统CAN一帧最多8字节,FDCAN可以到64字节。我做过一个项目,需要同时上传电流、转速、温度、位置四个参数,用FDCAN一帧搞定,省事多了。
  • 硬件滤波灵活:支持多个滤波器组,可以精确过滤掉不需要的报文,减轻CPU负担。

重要提示:STM32的FDCAN兼容传统CAN 2.0B。如果你的设备里既有老设备又有新设备,FDCAN可以自动切换模式。我在调试混合网络时,这个特性帮了大忙。

2.1.2 SJA1000:经典独立控制器

SJA1000是NXP(原Philips)的经典产品。虽然现在很多MCU都集成了CAN控制器,但SJA1000在一些老项目或特殊场合依然在用。

它的特点很鲜明:

  • 独立工作:不依赖特定MCU,通过并行接口或SPI连接。
  • 支持BasicCAN和PeliCAN:PeliCAN模式支持CAN 2.0B的29位扩展标识符。
  • 成本低:一颗芯片几块钱,适合对成本敏感的产品。

不过,SJA1000也有局限。它最高只支持1Mbps,而且数据场只有8字节。我记得有一次给一个老设备升级,客户要求保留原来的SJA1000方案,结果因为数据量太大,不得不拆分成多帧发送,调试起来挺麻烦的。

我的经验:如果你在维护老项目,SJA1000的寄存器配置要特别注意。它的复位模式和工作模式切换有严格的时序要求。我曾经因为初始化顺序写反了,导致芯片一直发错误帧,查了两天才发现。

2.2 CAN收发器:电平转换的桥梁

控制器输出的是逻辑电平(通常是3.3V或5V),而CAN总线需要差分信号。收发器就是干这个活的。它把控制器的TX/RX信号转换成CANH和CANL的差分电平。

2.2.1 TJA1050:经典高速收发器

TJA1050是NXP的明星产品,也是目前市面上用得最多的CAN收发器之一。它支持最高1Mbps的速率,兼容ISO 11898标准。

它的几个关键特性:

  • 低电磁辐射:优化了输出波形,EMI表现不错。
  • 总线引脚保护:耐压可达±36V,抗干扰能力强。
  • 待机模式:通过STB引脚控制,可以降低功耗。

嗯,这里要注意。TJA1050的VCC是5V,如果你的控制器是3.3V的,需要做电平匹配。我见过有人直接把3.3V的TX接到TJA1050的TXD引脚,结果逻辑高电平不够,导致发送失败。

避坑指南:我曾经在一个项目中,TJA1050的RXD引脚输出高电平只有3.5V左右,而STM32的GPIO识别高电平需要2.0V以上。虽然能工作,但噪声大时容易误判。后来我加了一个上拉电阻到3.3V,问题就解决了。

2.2.2 其他常用收发器

除了TJA1050,还有几款也值得了解:

型号 特点 适用场景
TJA1040 低功耗,待机电流仅5μA 电池供电设备
TJA1051 改进版,支持3.3V和5V 混合电压系统
SN65HVD230 3.3V供电,TI出品 低压系统
ISO1050 带隔离,耐压5kV 工业强干扰环境

我个人习惯在电机控制项目里优先选TJA1051。它兼容3.3V和5V,省去了电平转换的麻烦。而且它的总线引脚ESD保护更强,电机驱动产生的共模干扰比较大,这个特性很实用。

2.3 硬件电路设计要点

芯片选好了,电路设计才是关键。很多问题都是硬件设计不当引起的。我总结几个核心要点:

2.3.1 终端电阻

CAN总线两端必须各加一个120Ω的终端电阻。为什么是120Ω?因为CAN总线电缆的特性阻抗大约是120Ω,加这个电阻是为了消除信号反射。

实际设计中:

  • 如果节点数量少(2-3个),可以在两端各加一个120Ω电阻。
  • 如果节点多,建议只在最远的两端加,中间节点不要加。
  • 有些收发器内部集成了终端电阻,比如TJA1051T/3,但我不建议依赖它,还是外部加一个更可靠。

重要提示:终端电阻的功率要选对。在电机控制中,总线电压可能达到12V或24V,120Ω电阻上的功耗是P=U²/R。24V时功耗是4.8W,普通贴片电阻根本扛不住。我建议用0805或1206封装的电阻,或者用两个60Ω串联。

2.3.2 电源与去耦

收发器对电源噪声很敏感。电机驱动会产生大量的开关噪声,如果电源不干净,CAN通信就会出错。

我的做法是:

  • 在收发器的VCC引脚附近放一个10μF电解电容和一个0.1μF陶瓷电容。
  • 如果条件允许,用独立的LDO给收发器供电,不要和电机驱动共用一个电源。
  • 在CANH和CANL之间加一个共模扼流圈,可以有效抑制共模干扰。

2.3.3 保护电路

电机控制环境恶劣,总线可能会被高压或静电损坏。我建议加以下保护:

  • TVS管:在CANH和CANL对地各加一个双向TVS管,钳位电压选36V左右。
  • 串联电阻:在收发器引脚和总线之间各串一个10Ω电阻,限制浪涌电流。
  • 共模扼流圈:前面提到了,这个对抑制共模干扰很有效。

我的经验:我曾经在一个项目中,CAN总线经常莫名其妙地通信中断。后来用示波器一看,发现CANH和CANL上有很大的尖峰脉冲。加了TVS管和共模扼流圈后,问题彻底解决了。所以保护电路不是可有可无的,一定要加上。

2.3.4 布局布线

PCB布局也很重要。我总结几条:

  • 收发器尽量靠近CAN连接器,减少走线长度。
  • CANH和CANL走线要平行,间距尽量一致。
  • 避免在CAN总线附近走高频信号线,比如PWM线。
  • 如果使用隔离收发器,隔离电源的布局要特别注意,原边和副边要分开。

2.4 实战:STM32 FDCAN + TJA1051电路设计

最后,我给大家一个实际电路设计的参考。这是我在一个电机控制项目中用过的方案:

// STM32G474 + TJA1051 典型电路
// FDCAN1_TX -> PA12 -> TJA1051 TXD
// FDCAN1_RX -> PA11 -> TJA1051 RXD

// 电源部分
// VCC_3.3V -> LDO -> VCC_5V -> TJA1051 VCC
// VCC_5V -> 10μF + 0.1μF -> GND

// 总线部分
// TJA1051 CANH -> 10Ω -> TVS -> CANH端子
// TJA1051 CANL -> 10Ω -> TVS -> CANL端子
// CANH和CANL之间 -> 共模扼流圈
// 总线两端 -> 120Ω终端电阻

这个电路我用了两年多,没出过问题。当然,具体参数要根据你的实际环境调整。比如总线长度超过100米时,终端电阻可能需要调整到100Ω左右。

好了,这一章的内容就到这里。下一章咱们聊聊CAN通信的软件配置和报文收发。到时候我会手把手教你怎么用STM32CubeMX配置FDCAN,以及怎么用示波器抓波形调试。咱们下章见!