4. CAN控制器与收发器:典型芯片介绍与功能划分

做CAN通信,离不开两个核心器件:控制器收发器

很多人刚开始接触时,容易把这两者搞混。我当年第一次画CAN电路,就以为买一个芯片就能搞定。结果呢?通信死活不通。后来才明白,控制器负责“脑子”,收发器负责“嘴巴”。

今天咱们就把这两类芯片掰开揉碎,讲清楚。

4.1 功能划分:控制器 vs 收发器

先看一张图,你就明白了:

微控制器 (MCU) SPI / 并行接口 CAN控制器 (SJA1000 / MCP2515) 协议处理 报文过滤 错误管理 CAN收发器 (TJA1050) 电平转换 差分驱动 CAN_H CAN_L

说白了,控制器负责把你要发的数据,按照CAN协议打包成帧,也负责解析收到的帧。它处理的是数字逻辑。收发器呢?它把控制器输出的数字信号,转换成CAN总线上的差分信号(CAN_H和CAN_L)。反过来也一样。

我习惯这么记:控制器管“协议”,收发器管“物理”

4.2 典型CAN控制器芯片

4.2.1 SJA1000 — 独立CAN控制器的老大哥

SJA1000是NXP(原Philips)的产品。这芯片在工业界用了二十多年,非常成熟。

核心特点:

  • 支持CAN 2.0A(标准帧)和CAN 2.0B(扩展帧)
  • 两种工作模式:BasicCAN(11位标识符)和PeliCAN(29位标识符)
  • 64字节的接收FIFO
  • 与微控制器通过并行接口连接(地址/数据总线)

避坑指南: 我曾经在一个项目中,把SJA1000的时钟频率配错了。结果总线速率怎么算都不对。后来查手册才发现,SJA1000对时钟精度要求比较高,晶振偏差超过1%就可能丢帧。嗯,从那以后我选晶振都挑±50ppm以内的。

典型应用场景: 工业控制、汽车诊断、老旧设备升级。

4.2.2 MCP2515 — SPI接口的独立CAN控制器

MCP2515是Microchip的产品。它最大的优点是:通过SPI接口与MCU通信

这意味着什么?你随便找个带SPI的单片机,比如STM32、Arduino,甚至51单片机,都能接MCP2515。不需要专门的并行总线。

核心特点:

  • 支持CAN 2.0A和CAN 2.0B
  • 两个接收缓冲区,每个可存储完整报文
  • 三个发送缓冲区(优先级可配置)
  • 6个验收滤波器(可灵活配置)
  • SPI时钟最高10MHz

个人经验: 我习惯用MCP2515做CAN转USB的工具。搭配一个便宜的STM32,写个简单的SPI驱动,就能在电脑上用PCAN-View类似的软件调试CAN总线。成本不到50块钱,比买成品工具划算多了。

典型应用场景: 嵌入式原型开发、学生实验、低成本CAN节点。

4.3 典型CAN收发器芯片

4.3.1 TJA1050 — 高速CAN收发器的标杆

TJA1050也是NXP的产品。它几乎是CAN收发器领域的“标准答案”。

核心特点:

  • 支持高速CAN,速率最高1Mbps
  • 电磁辐射(EME)极低
  • 电磁抗干扰(EMI)能力强
  • 总线引脚可耐受±8kV静电(HBM)
  • 支持待机模式,功耗低
参数 TJA1050 备注
工作电压 4.75V ~ 5.25V 标准5V供电
最大速率 1 Mbps 高速CAN
待机电流 典型值 5 μA 省电模式
工作温度 -40°C ~ +125°C 车规级
封装 SO-8 小巧易焊接

注意: TJA1050的引脚5(STB)是待机控制脚。如果悬空,芯片会进入待机模式,总线无法通信。我见过好几个新手犯这个错——把STB脚空着,然后问为什么发不出数据。正确的做法是:正常工作时,把STB拉低(接地)。

4.4 如何选型?我的建议

选型其实不难,记住三条:

  1. 看MCU接口:如果MCU有CAN控制器(比如STM32的bxCAN),直接外挂一个TJA1050收发器就行。如果MCU没有CAN外设,就选MCP2515这种SPI接口的独立控制器。
  2. 看速率要求:普通应用125kbps~500kbps足够。高速应用(比如汽车动力系统)需要1Mbps,TJA1050完全胜任。
  3. 看环境:工业现场干扰大,选抗干扰强的收发器。车规级应用,必须选-40°C~+125°C的型号。

一句话总结: 控制器选MCP2515(SPI接口,灵活),收发器选TJA1050(稳定可靠,性价比高)。这个组合我用了不下十个项目,从来没出过问题。

4.5 硬件连接速览

最后给个典型连接图,方便你参考:

MCU (SPI)  →  MCP2515 (控制器)  →  TJA1050 (收发器)  →  CAN总线
  SCK      →  SCK                 TXD → TXD            CAN_H
  MOSI     →  SI                  RXD → RXD            CAN_L
  MISO     →  SO                  (GND共地)
  CS       →  CS
  INT      →  INT

嗯,就这么简单。下一节咱们会讲怎么配置这些芯片的寄存器,让它们真正跑起来。


公众号:蓝海资料掘金营,微信deep3321