CAN总线在汽车、工业自动化里用得太普遍了,但真正把物理层搞好的人不多。很多人遇到通讯丢帧、错误帧、启动不了这些问题,第一反应是软件协议栈有bug,其实八成是物理层布线或者终端电阻没搞好。
先说说终端电阻。CAN总线要求两端各接一个120欧的电阻,不是中间也不是一头一个。为什么是120欧?因为双绞线的特性阻抗典型值就是120欧,终端电阻等于特性阻抗时信号不会反射。如果只接一头,或者阻值不对(比如用100欧或者150欧),信号会在终端反射形成振铃,导致采样错误。还有个误区——有的工程师在每个节点都加终端电阻,结果总并联下来等效电阻太小,驱动器过流发热,这也是常见问题。
双绞线的绞距也有讲究。CAN_H和CAN_L要严格绞合,绞距尽量均匀,一般每厘米3-5圈比较合适。如果走线过程中某一段没有绞合,或者绞距突然变了,那就是阻抗不连续点,信号会在那里反射。实际布线时如果在PCB上走CAN线,要保证两根线等长、平行、间距均匀,相当于PCB上的双绞线。
波特率和总线长度的关系不能乱。CAN 2.0A在500kbps时最大总线长度是100米,1Mbps时是40米,这个长度是包括所有支线的总长度。有的项目里为了省线用了很长的支线( Stub ),超过5米的支线会严重影响信号质量,支线长度建议控制在1米以内。如果总线确实要拉很长,就得降波特率,或者加中继器(CAN Repeater)。
接地和屏蔽也容易踩坑。屏蔽层应该单端接地,通常在主机端接地,远端悬空。如果两端都接地,屏蔽层会形成地环路,反而引入干扰。CAN总线的CAN_SHLD引脚一般是接屏蔽层的,有的收发器比如TJA1050有专门的接地引脚,注意不要漏接。另外CAN收发器的电源引脚要加去耦电容,0.1uF就近放,电源噪声会直接影响总线电平。
实际调试时怎么快速定位物理层问题?用示波器看CAN_H和CAN_L的差分波形。空闲状态应该是2.5V左右,显性状态CAN_H是3.5V、CAN_L是1.5V,差分电压2V左右。如果看到振铃、过冲太大(超过2V)、或者电平幅度不对,那就是物理层有问题。还有个万用表能测的——总线两端的120欧电阻并联后是60欧,断电状态下测CAN_H和CAN_L之间的电阻,接近60欧就说明终端电阻接对了,如果是120欧说明只接了一端,如果小于50欧说明有节点加了多余的终端电阻。
下一篇:没有了