CAN 2.0协议是控制器局域网标准,分为2.0A和2.0B,支持标准和扩展帧格式。
CAN总线采用NRZ编码,广播通信,优先级由CAN ID决定。
标准帧优先于扩展帧,设备通过位填充进行信号同步。
协议还详细规定了帧格式、错误处理机制和编码方式。
资料
资料:
【【18.1】深度剖析CAN总线结构与传输协议——Kevin带你读《STM32Cube高效开发教程基础篇》】【18.1】深度剖析CAN总线结构与传输协议——Kevin带你读《STM32Cube高效开发教程基础篇》_哔哩哔哩_bilibili
非常详细的STM32 CAN通信的贴子,从总线细节到编程实现_stm32使用ll库can通讯-优快云博客
CAN协议相关工具
注意要有CAN协议分析仪才可以
主流通信协议对比:
1. CAN协议 - 物理层
1.1. CAN协议简介:高速CAN、低速CAN
CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519以及ISO11898),是国际上应用最广泛的现场总线之一。
CAN的国际标准(ISO11519以及ISO11898) - 差异点如下:
- 基本应用
CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。近年来,它具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强及振动大的工业环境。
车载网络构想图:
1.2. CAN硬件电路:开环、闭环
每个设备通过CAN收发器挂载在CAN总线网络上CAN控制器引出的TX和RX与CAN收发器相连,CAN收发器引出的CAN_H和CAN_L分别与总线的CAN_H和CAN_L相连
高速CAN - 闭环网络 | 低速CAN - 闭环网络 |
图中的 CAN 通讯网络是
| 图中的 CAN 通讯网络是
|
| |
两个120欧电阻方便电路回归隐性电平 | 不闭环是在电平标准中,差分电平没有0的部分,不需要两个快速同步电平 同时这也带来了回归隐性电平慢的速率降低,但是电压差规定更大了,方便更远距离传输 |
1.3. CAN电平标准:
1.3.1. 电平标准
注意:区分逻辑电平、显隐电平(显性代表操作了)、差分电平
默认逻辑电平1 - 隐性电平
- CAN总线采用差分信号,即两线电压差(VCAN_H-VCAN_L)传输数据位
- 高速CAN规定:
-
- 电压差为 0V 时 表示逻辑1(隐性电平)
- 电压差为 2V 时 表示逻辑0(显性电平)
- 低速CAN规定:
-
- 电压差为 -1.5V时 表示逻辑1(隐性电平)
- 电压差为 3V 时 表示逻辑0(显性电平)
1.3.2. CAN电平转换芯片
基本的转换芯片(不全)
TJA1050 - CAN收发器(高速)
2. CAN协议 - 协议层
2.1. CAN总线帧格式:
开始发送总线帧时,总线应处于空闲状态(隐性电平 - 1)
2.1.1. 数据帧:发送指定CAN-ID报文
标准格式 - 数据帧:
字段名称 | 字段长度 (单位:位) | 电平(显/隐电平) | 作用 | 备注 | ||
帧起始 | SOF | 起始位 | 1 | 显性 0 |
| |
仲裁段 | Identifier(ID) | 报文ID | 11 | 任意电平 |
基于仲裁规则
| 类似I2C的 7位从机地址+1位读写位(仲裁段)的设计 在CAN中:数据帧==写入;遥控帧==读取 |
RTR | 远程请求标志位 (区分总线帧格式) | 1 | 显性 0 |
| ||
控制段 | IDE | ID扩展标志位 (选择数据帧格式) | 1 | 显性 0 |
| |
r0 | 保留位 | 1 | 显性 0 |
| ||
DLC | 指定发送数据长度 | 4 | 任意电平 |
| ||
数据段 | Data | 数据内容 | 0-64 | 任意电平 |
| |
CRC段 | CRC Sequence | CRC校验码 | 15 | 任意电平 |
| |
CRC界定符 | 界定符 | 1 | 隐性 1 |
界定,分隔;释放总线 | ||
ACK段 | ACK槽 (ACK Slot) | 应答位 (由接收设备写入) | 1 | 任意电平 |
| 可允许多个接收方都拉开总线(显性0),多设备接收; 要明白,整个数据帧是由发送方和接收方共同组成的,两者一位发,一位读; |
ACK界定符 | 界定符 | 1 |
| |||
帧结束 | EOF | 结束符 | 7 |
| 类似串口的停止位 |
扩展格式 - 数据帧
字段名称 | 字段长度 (单位:位) | 电平(显/隐电平) | 作用 | 备注 | ||
Identifier(ID) | 报文ID | 11 | 任意电平 | |||
SRR | (兼容)占用位 | 1 | 隐性 1 | 代替原来的RTR,适配仲裁规则 | ||
IDE | ID扩展标志位 (选择数据帧格式) | 1 | 显性 0 |
| ||
Identifier(ID) | 18 | |||||
RTR | 远程请求标志位 (区分总线帧格式) | 1 | 显性 0 |
| ||
r1 | 保留位 | 1 | 隐性 1 | |||
r0 | 保留位 | 1 | 隐性 1 | |||
DLC | 指定发送数据长度 | 4 | 任意电平 |
| ||
与标准格式相同 |
两种格式的区别:
相同点:
- 两者的ID+RTR,扩展格式中SRR,IDE是为了兼容标准格式
2.1.2. 遥控帧:请求接收指定CAN-ID的报文
可实现请求式数据传输(注意都是广播发送)
接收方:广播发送指定报文ID(想查询的报文)
指定报文ID的设备(发送方):广播发送该报文
注意,如果是高频传输,不要用这种请求式,占用总线资源,一直在广播发送即可
遥控帧无数据段,(通过RTR区分)RTR为隐性电平1,其他部分与数据帧相同
RTR | 远程请求标志位 (区分总线帧格式) | 1 | 显性 0 |
|
2.1.3. 错误帧:有设备发现当前帧出现错误,发送错误帧破坏数据
总线上所有设备都会监督总线的数据,一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误” ,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备
2.1.4. 过载帧:接收方收到大量数据而无法处理时发送过载帧
当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失
2.1.5. 帧间隔:发送完一个数据/遥控帧后,发送帧间隔,总线才变为空闲
将数据帧和遥控帧 与 前面的帧分离开
2.2. 位填充:总线帧发出时的处理(除去过载/错误帧)
非错误帧/过载帧时,连续发5个相同电平时,自动追加一个相反电平的填充位
CAN通信总线帧波形 - 实例分析
2.3. 位同步:
2.3.1. 接收方数据采样
2.3.2. 接收方数据采样遇到的问题【解决方法在2.4.3之后】
2.3.3. 位时序
2.3.4. 硬同步:解决采样初始点未对齐
2.3.5. 再同步:解决时钟误差导致的采样点偏离问题——实时调整每段采样周期
2.4. 波特率计算:
2.5. 仲裁机制:
2.5.1. 多设备同时发送遇到的问题
2.5.2. 资源分配规则1:先占先得——解决多设备不同时发送问题
2.5.3. 资源分配规则2:非破坏性仲裁——解决多设备同时发送问题
基于线与、回读机制(各个设备发完后读总线数据);
根据各个设备的仲裁段进行非破坏性仲裁;
设备ID优先级 - [ID越小优先级越高] —— 非破坏性仲裁过程
RTR优先级(总线帧格式优先级) - [数据帧 > 遥控帧] —— 非破坏性仲裁过程
IDE位优先级(数据帧格式优先级) - [标准格式 > 扩展格式] —— 非破坏性仲裁过程
注意:
- 位填充不会影响优先级,很巧妙
- 所有仲裁失败的设备/单元,会等到下一次总线空闲,再次尝试发起发送请求,参与新仲裁/直接发送
2.6. 错误处理:
额外的安全保障机制
【没有全部学完】
2.6.1. 错误类型
错误共有5种:
- 位错误:
-
- 基于回读机制(发送电平 != 回读的总线电平)
- 注意:仲裁时的这种情况不属于位错误
- 填充错误
- CRC错误
- 格式错误
- 应答错误
2.6.2. 错误状态
- 主动错误状态的设备正常参与通信并在检测到错误时发出主动错误帧
- 被动错误状态的设备正常参与通信但检测到错误时只能发出被动错误帧
- 总线关闭状态的设备不能参与通信
- 每个设备内部管理一个TEC和REC,根据TEC和REC的值确定自己的状态