3. CAN收发器与控制器:常用CAN芯片、STM32 CAN外设与收发电路设计要点
3.1 核心原理:控制器与收发器的分工
在BMS的CAN通信节点中,CAN控制器与CAN收发器是两个物理上独立、逻辑上协作的芯片。控制器负责协议层——将CPU要发送的数据封装成符合CAN 2.0B规范的帧格式,并处理仲裁、位定时、错误检测等逻辑;收发器则负责物理层——将控制器输出的逻辑电平(通常是3.3V/5V的TX信号)转换为CAN总线上的差分电压,同时将总线上的差分信号还原为逻辑电平送给控制器。
以BMS中最常见的组合为例:STM32F103系列芯片内部集成bxCAN控制器,但必须外接一颗收发器(如TJA1050)才能连接到CAN_H和CAN_L双绞线。若使用不带CAN外设的MCU(如普通51单片机),则需选用MCP2515这类独立SPI接口CAN控制器,再搭配收发器使用。
3.2 常用CAN芯片选型与对比
BMS项目中,收发器和控制器的选型直接影响通信可靠性。下表对比了三种最常见的芯片组合方案:
| 芯片型号 | 类型 | 供电电压 | 速率 | BMS典型应用 |
|---|---|---|---|---|
| TJA1050 | CAN收发器 | 5V | 最高1Mbps | 经典方案,需5V电源,与STM32连接需电平匹配 |
| TJA1042 | CAN收发器 | 3.3V/5V | 最高1Mbps | 低功耗待机,适合BMS休眠唤醒场景 |
| MCP2515 | 独立CAN控制器 | 3.3V/5V | 最高1Mbps | 配合SPI接口,用于无CAN外设的MCU |
| STM32 bxCAN | 内置控制器 | 3.3V | 最高1Mbps | STM32F103/F407等,需外接收发器 |
3.3 STM32 CAN外设配置要点
STM32的bxCAN外设使用前需完成以下初始化步骤。以标准库为例,核心配置代码如下:
// 1. 使能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 2. 配置引脚复用
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // RX上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // TX复用推挽
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 3. 初始化CAN参数
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = ENABLE; // 自动离线恢复
CAN_InitStructure.CAN_AWUM = ENABLE; // 自动唤醒
CAN_InitStructure.CAN_NART = DISABLE; // 自动重传
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
CAN_InitStructure.CAN_Prescaler = 4; // 36MHz/(1+8+7)/4 = 500kbps
CAN_Init(CAN1, &CAN_InitStructure);
位定时参数直接决定波特率。以APB1时钟36MHz为例,Prescaler=4、BS1=8tq、BS2=7tq时,波特率计算为:36MHz ÷ 4 ÷ (1+8+7) = 500kbps,这是BMS最常用的通信速率。采样点位置为 (1+8)/(1+8+7) = 87.5%,符合ISO 11898推荐范围。
3.4 CAN收发电路设计要点
收发电路设计是BMS硬件可靠性的一道关键防线。以下五个要点必须逐一落实:
- 终端电阻:总线两端各接一只120Ω电阻,中间节点不得接入。BMS中BMU和BCU通常位于总线两端,电阻应焊接在这两个节点上。
- 共模电感:在收发器与总线之间串联共模电感(如ACT45B-510-2P),抑制BMS高压部件(DC/DC、电机控制器)产生的共模干扰。
- TVS保护:在CAN_H和CAN_L对地分别并联TVS二极管(如PESD1CAN),钳位电压不超过±36V,防止高压线束短路或雷击浪涌损坏收发器。
- 电源去耦:收发器VCC引脚就近放置100nF陶瓷电容,并串联磁珠(如BLM21PG471SN1)隔离数字电源噪声。
- 电平匹配:若选用5V供电的TJA1050,STM32的TX/RX引脚需通过分压电阻或电平转换芯片(如TXS0102)匹配3.3V逻辑。
3.5 案例:BMS从控板CAN节点电路复盘
某BMS从控板(采集单体电压/温度)的CAN节点设计如下:
- MCU:STM32F103C8T6,使用bxCAN外设
- 收发器:TJA1042T/3,3.3V供电
- 终端电阻:120Ω(该从控板位于总线中间,不焊接)
- 保护:PESD1CAN TVS + ACT45B共模电感
- 波特率:500kbps,采样点87.5%
实测发现,在电驱系统大功率加速时,CAN总线偶尔出现Bus Off错误。排查过程如下:
- 用CANscope抓取总线波形,发现显性电平幅值从2.0V跌落至1.6V,差分电压不足。
- 检查收发器供电,发现3.3V电源纹波达120mV,超过规格书要求的50mV。
- 在TJA1042的VCC引脚增加10μF钽电容 + 100nF陶瓷电容,纹波降至30mV。
- 同时将共模电感从51μH更换为100μH,增强低频共模抑制能力。
- 复测500kbps通信,连续运行72小时无错误帧。
3.6 常见误区与设计复盘
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 收发器与MCU距离过远(>10cm) | TX/RX信号衰减,误码率升高 | 收发器尽量靠近MCU,走线不超过5cm |
| CAN_H/CAN_L走线不平行 | 差分阻抗不连续,产生反射 | 保持平行等距,线宽10mil,间距6mil |
| 终端电阻焊接在中间节点 | 信号反射,通信不稳定 | 仅总线两端各接一只120Ω |
| 忽略总线长度与速率关系 | 超过40m时500kbps无法工作 | 按ISO 11898查表降速或缩短总线 |
最后强调一个容易被忽略的细节:CAN收发器的TXD引脚默认电平必须为高(隐性)。若MCU复位期间GPIO输出低电平,收发器会持续驱动总线为显性,导致整个CAN网络瘫痪。因此,STM32的CAN_TX引脚应配置为复用推挽,并在初始化前保持高电平,或串联1kΩ电阻防止异常拉低。