016 CAN总线接口电路设计:从一次现场总线瘫痪说起
去年冬天,某客户产线突然报故障——整条AGV小车调度系统间歇性丢帧,偶尔还出现总线锁死。我带着示波器赶到现场,发现CAN_H和CAN_L之间的共模电压已经漂到+8V,终端电阻两端波形像被揉皱的卫生纸。拆开一个节点,发现设计者直接把CAN收发器的RXD引脚悬空,还把120Ω终端电阻焊成了0Ω跳线。这不是个例,很多硬件工程师把CAN接口当成RS232来画,结果现场调试时被总线错误帧折磨到怀疑人生。
收发器选型:别只看封装
CAN收发器是物理层核心,选型时最容易犯的错是“能用就行”。TJA1050和SN65HVD230虽然引脚兼容,但前者是5V供电,后者是3.3V。曾经见过一个项目,MCU是3.3V,却选了TJA1050,结果逻辑电平不匹配,RXD输出高电平只有3.3V,但TJA1050的输入阈值是0.7VCC(约3.5V),MCU死活收不到显性位。正确的做法是:MCU供电3.3V就选SN65HVD230或TJA1040T/3,5V系统用TJA1050或ISO1050(带隔离)。
另一个坑是速率匹配。CAN 2.0B最高1Mbps,但有些廉价收发器在500kbps以上就开始波形畸变。我习惯在选型时查datasheet里的“循环延迟”参数——收发器从TXD到总线输出,再到RXD接收的往返延迟,超过200ns的芯片在1Mbps下基本没法用。实测过某国产收发器,标称1Mbps,实际在800kbps时显性位宽度已经缩水30%,这种芯片只能用在低速控制场景。
终端电阻:不是焊个120Ω就完事
终端电阻的作用是匹配