1. CAN协议概述:从起源到分层模型
大家好,我是你们的讲师。今天咱们聊聊CAN协议的基础。说实话,CAN总线这玩意儿,在嵌入式领域摸爬滚打的人,早晚都得碰上。我最早接触CAN是在一个汽车电子项目里,当时被各种术语搞得晕头转向。后来慢慢啃透了,才发现它其实没那么神秘。
好,咱们正式开始。
1.1 CAN总线的起源
CAN总线,全称Controller Area Network,控制器局域网。它诞生于上世纪80年代,由德国博世公司开发。为什么会有它?
你想想看,传统汽车里,各个电子控制单元(ECU)之间通信,用的是点对点的线束。一个传感器一根线,一个执行器一根线。车一复杂,线束比蜘蛛网还乱。重量大、成本高、故障率也高。
博世当时就想:能不能搞一条总线,把所有节点都挂上去?大家共用一根线,谁想发数据谁发,谁需要数据谁收。这就是CAN的初衷。
1986年,博世正式推出CAN协议。后来被ISO标准化,成了ISO 11898。嗯,这里要注意,ISO 11898分好几部分,咱们后面会细讲。
核心思想:多主总线、广播式通信、实时性强、可靠性高。
1.2 CAN 2.0A 与 CAN 2.0B 的区别
这个知识点,面试常考,项目里也容易踩坑。我简单说说。
CAN 2.0是博世在1991年发布的规范。它分两个版本:
- CAN 2.0A:标准帧,11位标识符。
- CAN 2.0B:扩展帧,29位标识符。
说白了,区别就在标识符长度上。标识符是干啥的?它决定了消息的优先级。数值越小,优先级越高。
11位标识符,最多能表示2048个不同的ID。29位呢?2的29次方,5亿多个。对于现代汽车动辄几十上百个ECU来说,11位确实有点紧巴巴的。
我在项目中遇到过一个问题:一个老款ECU只支持CAN 2.0A,新款的控制器发的是扩展帧。结果老设备直接忽略,通信失败。后来我加了个协议转换器才搞定。所以,选型时一定要确认清楚。
| 特性 | CAN 2.0A(标准帧) | CAN 2.0B(扩展帧) |
|---|---|---|
| 标识符长度 | 11位 | 29位 |
| 最大ID数量 | 2048 | 5亿+ |
| 帧格式 | 标准格式 | 扩展格式 |
| 兼容性 | 2.0B节点可接收2.0A帧 | 2.0A节点无法接收2.0B帧 |
| 应用场景 | 简单系统、老设备 | 复杂系统、新设备 |
避坑指南:我曾经在一个项目中,把CAN 2.0B的控制器接入了只支持2.0A的网关。结果网关一直报错,排查了两天才发现是ID长度不匹配。建议大家在设计初期就统一标准,或者加一个兼容层。
1.3 CAN FD 简介
CAN FD,全称CAN with Flexible Data-Rate。它是CAN 2.0的升级版,2012年由博世推出。
为什么要搞CAN FD?因为传统CAN的速率上限是1Mbps,数据段最多8字节。对于现代应用,比如固件升级、大数据量诊断,这速度太慢了。
CAN FD做了两件事:
- 可变速率:仲裁段还是原来的速率(比如500kbps),数据段可以飙到8Mbps甚至更高。
- 数据长度扩展:从8字节扩展到最多64字节。
你想想看,原来传64字节数据,得拆成8帧,每帧都有开销。现在一帧搞定,效率提升不是一星半点。
不过要注意,CAN FD和传统CAN不完全兼容。CAN FD节点可以收传统CAN帧,但传统CAN节点收到CAN FD帧会报错。所以混用时,得做好配置。
个人经验:我做过一个车载诊断项目,用CAN FD做刷写。原来用CAN 2.0刷一个ECU要15分钟,换成CAN FD后,3分钟搞定。客户当场就竖了大拇指。
1.4 CAN协议栈分层模型
咱们搞软件的,最喜欢分层。CAN协议也不例外。它主要分三层:
物理层
这一层管的是电信号。比如:
- 差分信号传输(CAN_H和CAN_L)
- 总线电平:显性(0)和隐性(1)
- 终端电阻:120欧姆,防止信号反射
说白了,物理层就是决定“怎么把0和1变成电压信号,在线上跑起来”。
数据链路层
这一层是CAN协议的核心。它负责:
- 帧的封装与解析
- 仲裁机制(谁优先级高谁先发)
- 错误检测与处理
- 应答机制
数据链路层又细分为两个子层:
- LLC(逻辑链路控制):负责报文过滤、数据封装。
- MAC(介质访问控制):负责仲裁、错误处理、位填充。
嗯,这里要注意,位填充是CAN的一个特色。连续5个相同电平后,自动插入一个相反电平。目的是保证时钟同步。我曾经调试一个丢帧问题,查了半天,最后发现是位填充规则没处理好。
应用层
这一层就灵活了。CAN协议本身只定义了物理层和数据链路层。应用层由用户自己定义,或者使用现成的协议,比如:
- J1939:商用车、工程机械常用。
- CANopen:工业自动化、机器人常用。
- DeviceNet:PLC、传感器网络常用。
应用层说白了,就是约定“ID代表什么意思,数据怎么解释”。比如ID 0x123代表车速,前两个字节是速度值,后两个字节是方向。没有应用层,大家各说各话,没法通信。
警告:很多初学者只关注应用层,忽略了物理层。我曾经见过一个项目,CAN通信时好时坏,最后发现是终端电阻没焊。记住,物理层是基础,基础不牢,地动山摇。
小结
这一章咱们聊了CAN的起源、2.0A和2.0B的区别、CAN FD的升级点,以及协议栈的三层模型。说白了,CAN就是一个为实时控制而生的总线。它不追求高带宽,但追求高可靠和低延迟。
下一章,咱们会深入数据链路层,看看CAN帧到底长什么样。到时候我会带大家手撕一个帧结构,保证你印象深刻。
课后思考:为什么CAN的仲裁机制用“显性位”表示0,而不是1?想明白这个,你就理解了CAN为什么能无损仲裁。