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控制器,再搭配收发器使用。

关键认知:控制器决定“怎么说”,收发器决定“能不能说出去”。BMS中任何CAN节点(BMU、BCU、充电机、热管理控制器)都必须同时具备这两部分。
BMS CAN节点内部结构:控制器 + 收发器 MCU (STM32F103) 内置 bxCAN 控制器 CAN_TX (PA12) CAN_RX (PA11) 报文打包/解析 滤波/错误处理 3.3V 逻辑电平 CAN收发器 TJA1050 / TJA1042 TXD (发送数据输入) RXD (接收数据输出) 差分信号驱动/接收 总线故障保护 5V 供电 (VCC) CAN 总线 CAN_H (橙色线) CAN_L (绿色线) 双绞线 120Ω 终端电阻 2.0V/2.75V 差分 TXD RXD CAN_H CAN_L 隐性=高电平(3.3V) 显性=低电平(0V) 隐性=2.5V差分0V 显性=2.0V/2.75V差分2V

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等,需外接收发器
选型建议:BMS主控板优先选用STM32内置bxCAN + TJA1042组合。TJA1042支持3.3V供电,可直接与STM32 GPIO电平匹配,无需额外电平转换电路,且具备总线唤醒功能,适合BMS长期驻车休眠场景。

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硬件可靠性的一道关键防线。以下五个要点必须逐一落实:

  1. 终端电阻:总线两端各接一只120Ω电阻,中间节点不得接入。BMS中BMU和BCU通常位于总线两端,电阻应焊接在这两个节点上。
  2. 共模电感:在收发器与总线之间串联共模电感(如ACT45B-510-2P),抑制BMS高压部件(DC/DC、电机控制器)产生的共模干扰。
  3. TVS保护:在CAN_H和CAN_L对地分别并联TVS二极管(如PESD1CAN),钳位电压不超过±36V,防止高压线束短路或雷击浪涌损坏收发器。
  4. 电源去耦:收发器VCC引脚就近放置100nF陶瓷电容,并串联磁珠(如BLM21PG471SN1)隔离数字电源噪声。
  5. 电平匹配:若选用5V供电的TJA1050,STM32的TX/RX引脚需通过分压电阻或电平转换芯片(如TXS0102)匹配3.3V逻辑。
常见误区:部分设计为了省成本,省略共模电感或TVS管。在BMS环境中,电池包内部高压线束与CAN线束长期近距离走线,一旦出现绝缘破损,高压直接耦合到CAN总线,若无TVS保护,收发器会立即烧毁,甚至波及MCU。此处的保护元件不可省略。

3.5 案例:BMS从控板CAN节点电路复盘

某BMS从控板(采集单体电压/温度)的CAN节点设计如下:

  • MCU:STM32F103C8T6,使用bxCAN外设
  • 收发器:TJA1042T/3,3.3V供电
  • 终端电阻:120Ω(该从控板位于总线中间,不焊接)
  • 保护:PESD1CAN TVS + ACT45B共模电感
  • 波特率:500kbps,采样点87.5%

实测发现,在电驱系统大功率加速时,CAN总线偶尔出现Bus Off错误。排查过程如下:

  1. 用CANscope抓取总线波形,发现显性电平幅值从2.0V跌落至1.6V,差分电压不足。
  2. 检查收发器供电,发现3.3V电源纹波达120mV,超过规格书要求的50mV。
  3. 在TJA1042的VCC引脚增加10μF钽电容 + 100nF陶瓷电容,纹波降至30mV。
  4. 同时将共模电感从51μH更换为100μH,增强低频共模抑制能力。
  5. 复测500kbps通信,连续运行72小时无错误帧。
复盘结论:CAN收发电路对电源质量极其敏感。BMS中开关电源(DCDC)的开关噪声会通过电源引脚耦合到收发器内部,导致差分输出幅值下降。设计时必须保证收发器供电的纹波小于50mV,必要时增加LC滤波。

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Ω电阻防止异常拉低。