3. CAN控制器与收发器:硬件选型与实战经验
做CAN总线开发,绕不开两个核心器件:控制器和收发器。
控制器负责协议处理——把你要发的数据打包成CAN帧,或者从总线上把帧解析出来。收发器则负责物理层——把控制器输出的逻辑电平转换成CAN总线上的差分信号。
说白了,控制器是“大脑”,收发器是“嘴巴和耳朵”。
核心关系:MCU(主控) ↔ CAN控制器(协议引擎) ↔ CAN收发器(物理层) ↔ CAN总线(差分双绞线)
3.1 独立CAN控制器芯片
早期MCU很多不带CAN外设,所以得外挂一颗独立的CAN控制器。就算现在,有些场景下独立控制器依然有优势——比如你要扩展多路CAN,或者主控芯片选型受限。
3.1.1 SJA1000——经典中的经典
NXP的SJA1000,可以说是CAN控制器界的“老前辈”了。我入行那会儿,几乎所有CAN项目都在用这颗芯片。
它支持两种模式:
- BasicCAN模式:兼容老款82C200,发送/接收缓冲区各只有1个,适合简单应用
- PeliCAN模式:扩展模式,支持11位和29位标识符,有64字节的接收FIFO
我个人习惯,新项目一律用PeliCAN模式。BasicCAN那个单缓冲区,在高负载下很容易丢帧。
| 参数 | SJA1000 |
|---|---|
| 接口 | 并行(8位/16位) |
| 支持协议 | CAN 2.0A / 2.0B |
| 接收FIFO | 64字节(PeliCAN模式) |
| 工作电压 | 5V |
| 封装 | DIP28 / SO28 |
注意:SJA1000是5V器件。如果你用3.3V的MCU,需要做电平转换。我曾经在一个项目里直接连,结果SJA1000死活不工作,查了半天才发现是电平不匹配。
3.1.2 MCP2515——SPI接口的现代选择
Microchip的MCP2515,通过SPI接口与MCU通信。相比SJA1000的并行接口,MCP2515只需要4根线(SCK、MOSI、MISO、CS),大大节省了MCU的IO引脚。
我特别喜欢这颗芯片的一点:它内部有3个发送缓冲区和2个接收缓冲区,还支持接收过滤和屏蔽。对于中等负载的CAN网络,完全够用。
| 参数 | MCP2515 |
|---|---|
| 接口 | SPI(最高10MHz) |
| 支持协议 | CAN 2.0A / 2.0B |
| 发送缓冲区 | 3个 |
| 接收缓冲区 | 2个 + 1个MAB |
| 工作电压 | 2.7V ~ 5.5V |
选型建议:如果你的MCU引脚紧张,或者想快速验证CAN功能,MCP2515是首选。Arduino上的CAN扩展板,十有八九用的就是它。
3.2 CAN收发器芯片
收发器把控制器的逻辑电平(通常是3.3V或5V)转换成CAN总线的差分信号(CAN_H和CAN_L)。
3.2.1 TJA1050——高速CAN收发器的标杆
NXP的TJA1050,是TJA1050的升级版。它支持最高1Mbps的通信速率,而且电磁兼容性(EMC)做得很好。
我记得有一次做车载项目,现场总线老是出现偶发错误。排查了几天,最后发现是收发器抗干扰能力不够。换成TJA1050后,问题就再没出现过。
| 参数 | TJA1050 |
|---|---|
| 速率 | 最高1Mbps |
| 工作电压 | 4.75V ~ 5.25V |
| 待机模式 | 支持(电流<10μA) |
| 总线引脚保护 | ±8kV ESD |
| 封装 | SO8 |
3.2.2 SN65HVD230——3.3V系统的理想搭档
TI的SN65HVD230,专为3.3V系统设计。如果你用STM32这类3.3V的MCU,这颗芯片可以直接对接,不需要电平转换。
它有三种工作模式:
- 高速模式:正常通信,速率最高1Mbps
- 斜率控制模式:通过外接电阻控制上升/下降沿斜率,降低EMI
- 待机模式:低功耗,接收器仍工作
对比总结:
- TJA1050:5V系统,抗干扰强,适合工业/车载
- SN65HVD230:3.3V系统,低功耗,适合便携/电池供电设备
3.3 MCU集成CAN外设
现在越来越多的MCU把CAN控制器集成到芯片内部。比如STM32的bxCAN、NXP的FlexCAN、TI的DCAN等。
集成的好处很明显:
- 省成本:少一颗芯片,PCB面积和BOM成本都降了
- 省IO:不需要额外的并行或SPI接口
- 性能更好:内部总线访问,延迟更低
以STM32F103的bxCAN为例:
- 支持CAN 2.0A和2.0B
- 3个发送邮箱
- 2个接收FIFO(每个FIFO有3个邮箱)
- 14个可配置的接收过滤器组
实战经验:用集成CAN外设时,别忘了看数据手册的“CAN时钟”部分。STM32的CAN外设挂载在APB1总线上,时钟最高36MHz。如果配错了时钟分频,波特率怎么算都不对。
3.4 知识体系结构图
下面这张图,帮你理清控制器和收发器的选型逻辑:
3.5 实战选型建议
说了这么多,到底怎么选?我总结了几条经验:
- 看MCU:如果MCU自带CAN外设,优先用集成的。省事、省钱、省PCB空间。
- 看电压:3.3V系统用SN65HVD230,5V系统用TJA1050。别混用,除非你做了电平转换。
- 看环境:工业现场、车载等强干扰环境,优先选TJA1050。它的抗干扰能力确实强。
- 看扩展:如果需要多路CAN,或者主控不带CAN,MCP2515+SJA1000的组合很灵活。
避坑指南:我曾经在一个项目里,为了省成本,用了某国产的CAN收发器。结果在-20℃低温测试时,总线通信全部瘫痪。后来换成TJA1050,问题解决。有些钱,真不能省。