第二讲:CAN控制器与收发器——硬件的那些事儿
各位同学,咱们今天聊聊CAN系统的硬件核心。说白了,就是CAN控制器和收发器这对搭档。我刚开始接触CAN总线时,总觉得这玩意儿挺玄乎,后来拆了几块板子,看了几份数据手册,才明白——其实没那么复杂。
一、CAN控制器的工作原理
CAN控制器,你可以把它理解成一个“翻译官”。微控制器(MCU)要发数据,但MCU自己不认识CAN总线的电平规则。这时候,控制器就上场了。
它的核心工作分三步:
- 接收MCU的数据:把并行数据转成串行,准备好发送。
- 按CAN协议打包:加上帧起始、仲裁场、控制场、数据场、CRC校验等等。嗯,这里要注意,CRC算错了,总线会直接报错。
- 发送到收发器:把串行数据流送给收发器,由收发器去驱动总线电平。
反过来,接收也是一样。收发器把总线上的差分信号转成单端信号,控制器再解析成MCU能读的数据。
我个人习惯:选控制器时,先看它支不支持CAN 2.0B(扩展帧)。现在很多新项目都用扩展帧,老芯片只支持2.0A的话,后面改起来很痛苦。
二、常用CAN控制器芯片
市面上控制器芯片不少,但最经典的,还得是SJA1000和MCP2515。我当年第一个项目用的就是SJA1000,印象很深。
1. SJA1000——老当益壮
这是NXP(原Philips)的经典芯片。独立CAN控制器,不依赖MCU内部CAN模块。它支持BasicCAN和PeliCAN两种模式。PeliCAN模式支持扩展帧,我建议你直接用这个模式。
典型接法:
MCU —— 地址/数据总线 —— SJA1000 —— TX/RX —— 收发器
SJA1000需要MCU通过并行总线访问。说白了,就是MCU把它当外部RAM来读写。初始化时,要配置波特率、验收滤波器、中断使能等寄存器。
避坑指南:我曾经在SJA1000的验收滤波器上栽过跟头。默认滤波器是全接收的,如果你不配置,它会收到所有报文,MCU处理不过来。记得把验收代码和验收掩码设好。
2. MCP2515——SPI接口的宠儿
Microchip的MCP2515,现在用的更多。为什么?因为它走SPI接口,省IO口啊!MCU只需要4根线(SCK、MOSI、MISO、CS)就能控制。
MCP2515内部有2个接收缓冲器、3个发送缓冲器。我个人觉得,它的中断设计比SJA1000灵活,每个缓冲器都可以独立触发中断。
初始化代码片段(伪代码):
// 复位MCP2515
SPI_Write(MCP_RESET, 0x00);
// 配置波特率 500kbps (16MHz晶振)
SPI_Write(CNF1, 0x00); // SJW=1, BRP=0
SPI_Write(CNF2, 0x90); // PHSEG1=3, PRSEG=1
SPI_Write(CNF3, 0x02); // PHSEG2=2
// 进入正常模式
SPI_Write(CANCTRL, 0x00);
你想想看,如果MCU内部没有CAN控制器,MCP2515几乎是唯一选择。我做过一个项目,MCU是STM32F103,但它内部CAN被其他功能占用了,最后外挂了一个MCP2515,效果一样好。
三、CAN收发器
控制器负责协议,收发器负责物理层。收发器把控制器的逻辑电平(通常是3.3V或5V)转换成CAN总线的差分信号(CAN_H和CAN_L)。
1. TJA1050——高速稳定
NXP的TJA1050,是TJA1040的升级版。它支持最高1Mbps的波特率。我特别喜欢它的“静音模式”,在诊断刷写时,可以用这个模式只收不发,避免干扰总线。
典型电路:
TJA1050引脚:
TXD —— 接控制器TXD
RXD —— 接控制器RXD
CANH —— 接总线CAN_H
CANL —— 接总线CAN_L
VCC —— 5V
GND —— 地
RS —— 模式选择(接地为高速模式)
注意:TJA1050的TXD引脚如果一直拉低,收发器会进入“总线关闭”状态。我曾经调试时,发现总线没反应,查了半天,原来是MCU的TXD引脚初始化时默认输出低电平。嗯,这个坑很多人踩过。
2. SN65HVD230——3.3V系统的福音
TI的SN65HVD230,专门为3.3V系统设计。现在很多低功耗MCU都是3.3V供电,如果用TJA1050,还得加电平转换,麻烦。SN65HVD230直接3.3V供电,省事。
它还有一个特点:斜率控制。通过Rs引脚接不同电阻,可以控制上升沿和下降沿的斜率。低速应用时,把斜率降下来,能减少EMI干扰。
我做过一个车载诊断仪,用的就是SN65HVD230。3.3V的STM32直接连,不用额外电平转换,板子面积小了很多。
四、典型电路设计
好了,咱们把控制器和收发器串起来,看看一个完整的CAN节点电路长什么样。
以MCP2515 + TJA1050为例:
MCU (SPI主机) —— MCP2515 (SPI从机)
MCP2515 TXD —— TJA1050 TXD
MCP2515 RXD —— TJA1050 RXD
TJA1050 CANH —— 总线CAN_H(加120Ω终端电阻)
TJA1050 CANL —— 总线CAN_L(加120Ω终端电阻)
几个关键点:
- 终端电阻:总线两端各加一个120Ω电阻。少一个,信号反射严重;多一个,总线负载太重。我见过有人两端各焊了两个120Ω并联,结果总线电平都拉不上去。
- 共模扼流圈:如果环境干扰大,在CANH和CANL上串一个共模扼流圈。我有个项目在电机旁边,不加扼流圈,误码率能到10%。
- 保护二极管:TVS管并到CANH和CANL对地。防止浪涌和静电。车载环境,这个不能省。
- 电源去耦:收发器VCC引脚旁边放一个0.1μF电容。离引脚越近越好。
我的经验:布局时,控制器和收发器尽量靠近。TX/RX走线不要太长,最好控制在5cm以内。走线长了,信号质量下降,波特率高了就容易丢帧。
最后,给大家一个检查清单:
- 控制器初始化了吗?波特率对不对?
- 收发器模式选对了吗?(高速/静音/待机)
- 终端电阻焊了吗?阻值对不对?
- 电源和地接好了吗?去耦电容焊了吗?
嗯,硬件这部分,说白了就是细心。我刚开始也经常犯低级错误,比如忘记焊终端电阻,或者把CANH和CANL接反了。别怕,多焊几块板子,自然就熟了。
下一讲,咱们聊聊CAN总线的物理层和位时序。到时候我会讲讲波特率怎么算,采样点怎么设——这些在诊断通信里特别重要。