CAN(Controller Area Network)总线这东西在汽车和工业领域用得特别多,算是嵌入式工程师绕不开的一门通信技术。跟串口、SPI这些点对点的通信不一样,CAN是多主多从的总线架构,一根线上可以挂好几十个节点,每个节点都能主动发数据, arbitration机制保证不会冲突。这套设计特别适合工业现场和汽车电子这种环境复杂、节点多的场景。
CAN的物理层不复杂,用两根差分线(CAN_H和CAN_L)传输信号,显性状态相当于两根线都拉到中间电压(比如2.5V),隐性状态是CAN_H拉高、CAN_L拉低。差分传输的好处是抗干扰强,工业现场电磁干扰大,普通单端信号容易受影响,差分线对共模干扰有天然的抑制作用。总线两端各接一个120Ω的终端电阻,用来匹配阻抗、防止信号反射,这个电阻不能省,不然总线会经常出莫名其妙的通信错误。
CAN的帧结构是关键。一个标准数据帧包含仲裁场、控制场、数据场、CRC场、ACK场和帧结束。仲裁场里有11位的标识符(扩展帧是29位),这个标识符既决定了消息的优先级,也决定了消息的内容。标识符越小优先级越高,多个节点同时发消息时,靠仲裁场逐位比较,谁先发出显性0谁就赢了,输的自动退出发送转入接收状态,这样就避免了冲突,而且不会浪费带宽。
用MCU开发CAN通信一般有两种方式:硬件CAN控制器和软件模拟。现在主流的MCU(STM32、NXP S32K、英飞凌TC系列)都带硬件CAN控制器,只需要配置好波特率、过滤器、邮箱这些参数就能收发数据,效率高、CPU占用低。软件模拟的话用GPIO配合定时器实现,适合低端MCU没有硬件CAN的情况,但性能差、CPU占用高,一般不推荐。
CAN总线的波特率常见的有125kbps、250kbps、500kbps、1Mbps,波特率越高传输距离越短。500kbps的话大概能传40米,1Mbps只能传10米以内。选波特率的时候要考虑节点数量和布线长度,别盲目追求高速。汽车电子里一般用125kbps(低速CAN)和500kbps(高速CAN),工业现场常用250kbps。
实际工程里的常见故障有几种。第一种是总线不通,所有节点都发不出数据,先查终端电阻有没有接、CAN收发器有没有接反、波特率是不是一致。第二种是丢帧或错误率高,用示波器抓一下波形,看看是不是有干扰或者信号边沿太缓(可能终端电阻坏了或者布线太长)。第三种是某个节点掉线,可能是那个节点的收发器坏了或者程序跑飞了,可以用总线分析仪挂上去看错误计数。CAN总线出了问题别慌,先排除硬件(接线、终端电阻、电源)再排查软件(波特率、过滤器、中断),大部分问题都能快速定位。
CAN的升级版CAN FD(Flexible Data-rate)是这几年的趋势,最大的改进是数据场从8字节扩展到64字节,仲裁阶段之后支持切换到更高的波特率(最高8Mbps),传输效率比传统CAN高好几倍。如果新项目没有强制要求兼容老系统,建议直接上CAN FD,硬件成本差不多但性能提升明显。现在主流的MCU也已经支持CAN FD了。
上一篇:物联网开发从入门到实战:ESP32+MQTT上云完整教程
下一篇:没有了