CAN总线,踩坑三年攒下来的几句大实话
CAN这东西刚接触的时候觉得挺玄乎什么差分信号什么仲裁机制课本上一堆名词。真上手调过几块板子、烧过几颗收发器之后你会发现它骨子里就那么点事儿——一群节点挂在一根线上谁着急谁先说说完自己听一遍觉得没毛病就完事觉得说错了就主动坦白重来要是有人一直胡言乱语其他人合伙把它踹出去。就这么简单粗暴。物理层那边我最烦别人只背那句差分信号抗干扰。差分到底好在哪好就好在它不管你电压偏高还是偏低认的是两条线之间的差。你可以想象两个人被同一阵风吹歪了但他俩之间的距离没变信号就认这个距离。实际拿示波器戳上去显性的时候H大概3.5V、L大概1.5V差着2V左右隐性的时候俩都2.5V差几乎为零。记住这个就行。终端电阻这事儿我得单独拎出来说因为被坑过太多次了。两头各一个120Ω少一个都不行。有回同事随手从抽屉里摸了个100Ω的焊上去波形边沿那个振铃啊跟心电图似的误码率跑着跑着就上去了查了半天最后发现是电阻值不对。换成120Ω立马干干净净。所以别在这个地方图省事。仲裁这块是CAN最聪明的地方但理解错了容易出事儿。它不是谁先喊谁赢是谁先扔0谁赢。因为0是显性能压住1。所以ID数字越小越牛刹车ESP的ID是0x100车窗是0x500俩人同时张嘴比到某一位的时候刹车那边是0车窗那边是1车窗当场闭嘴老老实实切到接收状态去听刹车的。整个过程数据不丢、时间不浪费全凭硬件物理特性搞定。干活时候留个心眼关键报文ID别全挤一块儿。我见过发动机和雨刷ID就差一位的总线一忙起来俩信号在仲裁域掐得死去活来完全没必要。帧格式这东西不用死记硬背但有两个位你最好心里有数。一个是RTR位远程帧用的说白了就是你不想要某个节点一直往外吐数据你就发个远程帧问它你现在多少它回你一下就行省带宽。另一个是CRC界定符和ACK界定符这俩都是隐性位。调板子的时候拿示波器看波形如果这俩位置被拉低了别犹豫肯定有节点在搞事情这是排查物理故障最快的一条线索。说到错误处理这才是能不能真正调通CAN的分水岭。教科书上列了五种错误类型我直接跟你说实际干活怎么看。最常碰见的是ACK Error你发一帧出去没人把ACK槽拉低说明压根没人理你。三步走先看终端电阻通不通再看节点上电没有最后对一下波特率。波特率只要偏一点点接收节点就觉得自己收到的是乱码绝对不会回ACK。一旦错误计数器过了128节点就进入被动错误状态开始装怂不咋抢总线了过了255直接离线自闭啥也不管了。很多人这时候以为硬件烧了其实没大事错误积累清了重新上电或者发个恢复命令就能出来。我自己的习惯是调试时候把错误计数器通过诊断报文打出来比看那些花里胡哨的错误码直观一万倍。波特率和时序这俩放一块说因为坑都连着呢。CAN的位时间分了好几段什么同步段、传播段、相位段还有SJW。你不用自己从头算记住一个硬道理就行采样点放到位时间的75%到85%之间这是车载行业大量验证过的黄金区间。SJW设1到2个Tq晶振精度不太好的时候往2个Tq靠容忍度一下就上来了。说个真实翻车案例俩节点都设的500k但一个晶振精度±50ppm另一个±100ppm刚开始跑啥事没有半小时后开始偶尔错一帧一小时不到总线直接挂。最后咋解决的SJW从1个Tq改到2个Tq问题消失。所以别觉得这参数是摆设。最后说说负载率这事儿很多人不当回事。理论带宽100%你别真信。实际超过60%就开始闹心了因为隐性到显性的跳变沿受线缆分布电容影响负载越高边沿越缓误码率跟着往上蹿。我一般控制在30到50之间剩下的留给诊断和刷写用。真想跑高负载换CAN-FD去别在经典CAN上死磕。总的就一句话CAN这东西不复杂就是脾气倔你得顺着它来。电阻给准优先级分好时序调稳负载压住它就能一年到头不出幺蛾子。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →