4. CAN总线节点设计实战:基于STM32F103 + TJA1050的硬件设计
好,咱们直接进入正题。这一章聊的是硬件设计,说白了就是怎么把STM32F103和TJA1050这两个芯片焊到一块板子上,让它能正常收发CAN数据。很多初学者觉得原理图随便画画、PCB拉通就行,结果板子回来死活调不通——我当年就吃过这个亏。
核心要点:CAN节点硬件设计 = 正确的电源 + 可靠的收发器 + 干净的差分信号 + 必要的保护。
4.1 系统架构概览
先看整体结构。一个典型的CAN节点,内部其实就三大部分:
- 主控单元:STM32F103,内置bxCAN控制器,负责协议处理。
- 收发器:TJA1050,把控制器的逻辑电平转成CAN总线的差分信号。
- 电源与保护:5V转3.3V稳压、共模扼流圈、TVS管、终端电阻。
我习惯把这三块分开画,调试时也方便分段排查。下面这张图把关系理清楚了:
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 保护电路
汽车电子环境恶劣,静电、浪涌、电源反接都是家常便饭。下面这几个元件我建议一个都别省:
- TVS管:双向TVS,钳位电压6.8V~7.5V,接在CANH和CANL对地之间。
- 共模扼流圈:抑制共模干扰,选CMF系列,感值51μH~100μH。
- 防反接二极管:在电源入口串一个肖特基二极管,比如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 电源与地平面
电源和地的处理直接影响信号质量。我的做法是:
- 独立LDO:用AMS1117-3.3给STM32供电,TJA1050直接从5V取电。
- 去耦电容:每个电源引脚放一个0.1μF陶瓷电容,靠近引脚放置。
- 地平面完整: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 | ☐ |
| 隔离带下方无走线 | 隔离区净空 | ☐ |