4. CAN总线节点设计实战:基于STM32F103 + TJA1050的硬件设计

好,咱们直接进入正题。这一章聊的是硬件设计,说白了就是怎么把STM32F103和TJA1050这两个芯片焊到一块板子上,让它能正常收发CAN数据。很多初学者觉得原理图随便画画、PCB拉通就行,结果板子回来死活调不通——我当年就吃过这个亏。

核心要点:CAN节点硬件设计 = 正确的电源 + 可靠的收发器 + 干净的差分信号 + 必要的保护。

4.1 系统架构概览

先看整体结构。一个典型的CAN节点,内部其实就三大部分:

  • 主控单元:STM32F103,内置bxCAN控制器,负责协议处理。
  • 收发器:TJA1050,把控制器的逻辑电平转成CAN总线的差分信号。
  • 电源与保护:5V转3.3V稳压、共模扼流圈、TVS管、终端电阻。

我习惯把这三块分开画,调试时也方便分段排查。下面这张图把关系理清楚了:

CAN节点硬件架构框图 主控单元 STM32F103 bxCAN控制器 GPIO / 中断 收发器 TJA1050 CANH / CANL RXD / TXD 电源与保护 5V→3.3V LDO TVS / 共模扼流圈 终端电阻120Ω TXD/RXD VCC/GND CAN 总线(双绞线) CANH/CANL 💡 说明:STM32F103的bxCAN控制器集成在芯片内部,只需外接TJA1050收发器即可完成物理层转换。 电源部分建议独立LDO供电,避免数字噪声耦合到CAN总线上。

4.2 原理图绘制要点

原理图看着简单,但细节决定成败。我见过太多人把TJA1050的引脚接反,或者忘了加终端电阻。下面我把关键点拆开讲。

4.2.1 STM32F103与TJA1050的接口

STM32的CAN控制器通过两个引脚连接收发器:

STM32引脚 TJA1050引脚 说明
PA11 (CAN_RX) RXD (Pin 6) 接收数据,STM32输入
PA12 (CAN_TX) TXD (Pin 3) 发送数据,STM32输出
3.3V VCC (Pin 5) TJA1050供电,注意是5V
GND GND (Pin 2) 共地

⚠️ 特别注意:TJA1050的VCC是5V供电,而STM32的GPIO是3.3V电平。虽然TJA1050的TXD/RXD引脚兼容3.3V逻辑,但VCC必须接5V,否则收发器不工作。我曾经遇到过有人把VCC接了3.3V,结果总线一直输出隐性电平,查了两天才发现。

4.2.2 终端电阻与偏置

CAN总线两端必须各加一个120Ω终端电阻。这个电阻的作用是匹配阻抗,防止信号反射。

  • 位置:电阻放在CANH和CANL之间,越靠近总线连接器越好。
  • 功率:常规0805或1206封装,1/4W足够。
  • 精度:1%精度,别用5%的。

我个人的习惯是在原理图上预留两个电阻位:R_term和R_term2。如果节点在总线中间,就不焊;如果在两端,就焊上。这样板子通用性更强。

4.2.3 保护电路

汽车电子环境恶劣,静电、浪涌、电源反接都是家常便饭。下面这几个元件我建议一个都别省:

  1. TVS管:双向TVS,钳位电压6.8V~7.5V,接在CANH和CANL对地之间。
  2. 共模扼流圈:抑制共模干扰,选CMF系列,感值51μH~100μH。
  3. 防反接二极管:在电源入口串一个肖特基二极管,比如SS34。

💡 实战技巧:TVS管的地要单独打过孔到地平面,不要和信号地共用回路。我在一个项目里就是因为TVS接地回路太长,导致ESD测试时收发器还是烧了。

4.3 PCB布局注意事项

原理图画好了,PCB布局才是真正见功夫的地方。差分走线、隔离、地平面处理,每样都影响通信质量。

4.3.1 差分走线规则

CANH和CANL是一对差分信号,走线必须遵循以下原则:

规则 要求 原因
等长 长度差 < 5mm 避免时序偏移
等距 线间距保持恒定 保证差分阻抗120Ω
远离干扰源 距时钟/电源线 > 3倍线宽 减少串扰
避免过孔 尽量少用过孔 过孔引入阻抗不连续
包地处理 两侧加地线孔阵 屏蔽外部噪声

我一般把CANH和CANL走线放在顶层,线宽10mil,线间距10mil,参考层是完整的地平面。如果必须换层,就在过孔旁边加一个地过孔,提供回流路径。

4.3.2 隔离设计

在工业或车载应用中,有时候需要做隔离。隔离的目的是把控制器侧和总线侧的电气回路断开,防止共模电压损坏芯片。

常用的隔离方案有两种:

  • 数字隔离器:比如ISO1050,内部集成了隔离和收发功能。
  • 光耦 + 隔离电源:用6N137光耦隔离TXD/RXD,再用B0505S隔离电源模块。

我个人更推荐ISO1050这种单芯片方案,占板面积小,可靠性也高。如果成本敏感,光耦方案也能用,但要注意光耦的速率——至少选10Mbps以上的。

关键提醒:隔离设计时,隔离带下方不能走任何信号线。我曾经看到有人把隔离区下面的地层挖空了,结果隔离两侧的寄生电容反而增大了共模耦合,隔离效果大打折扣。

4.3.3 电源与地平面

电源和地的处理直接影响信号质量。我的做法是:

  1. 独立LDO:用AMS1117-3.3给STM32供电,TJA1050直接从5V取电。
  2. 去耦电容:每个电源引脚放一个0.1μF陶瓷电容,靠近引脚放置。
  3. 地平面完整:CAN收发器下方不要走数字信号线,保持地平面连续。

4.4 常见设计错误与避坑

下面这几个坑,我几乎在每个项目评审里都能看到。列出来给大家提个醒:

❌ 错误1:终端电阻放在PCB中间
终端电阻必须放在总线的最远端,而不是靠近收发器。如果放在中间,反射照样存在。

❌ 错误2:CANH和CANL走线不等长
差个1~2cm可能还能工作,但长距离通信时误码率会明显上升。我遇到过一例,500kbps下偶尔丢帧,最后发现是走线差了3cm。

❌ 错误3:忽略共模扼流圈
实验室环境可能没问题,但一上车载测试,共模干扰直接让总线瘫痪。共模扼流圈不是可选项,是必选项。

4.5 设计检查清单

板子发出去打样之前,我建议对照下面这个清单过一遍:

检查项 要求 状态
TJA1050 VCC电压 5V ±5% ☐
终端电阻 120Ω ±1%,两端各一个 ☐
TVS管 双向,钳位6.8V~7.5V ☐
共模扼流圈 51μH~100μH ☐
差分走线等长 长度差 < 5mm ☐
差分走线等距 线间距恒定 ☐
去耦电容 每个电源引脚0.1μF ☐
隔离带下方无走线 隔离区净空 ☐