CAN通信
CAN物理层
CAN
can采用双总线,差分信号设计(CAN_H,CAN_L),线路少,无需共地
can分为高速can(采用闭环设计、传输距离<40m)与低速can(采用开环设计、传输距离<1km)
半双工异步通信,无需时钟线、多主机间通信
通过报文id区分消息功能与优先级
可实现广播和请求两种传输方式
CAN硬件电路
-
高速CAN总线

-
低速CAN总线

上图中电阻采用经验设计,主要为了抵抗终端反射的干扰。
CAN电平标准
CAN采用差分信号 即两线的电压差来表示逻辑电平0、1(VCAN_H - VCAN_L)
高速CAN规定:
- 电压差为0V表示1
- 电压差为2V表示0

低速CAN规定:
- 电压差为-1.5V表示1
- 电压差为3V表示0

CAN总线帧
| 数据帧 | 发送设备主动发送数据 |
| 遥控帧 | 接收设备主动请求数据 |
| 错误帧 | 产生错误向其他设备发送通知错误 |
| 过载帧 | 接收设备通知尚未做好接收准备 |
| 帧间隔 | 将数据帧、遥控帧与前面的帧分割 |
- 数据帧

如上图所示,数据帧分为帧起始、仲裁段、控制段、数据段、CRC校验、ACK、帧结束
其中
帧起始(1 bit)隐形
仲裁段
ID (11 bit) 用来表示消息类型、和进行总线仲裁
RTR (1 bit) 用来区分是数据帧还是遥控帧 相同ID下数据帧的优先级大于遥控帧
控制段
IDE (1 bit) 用来表示采用扩展格式解释还是标准格式解释
r0 (1 bit) 保留位
DLC (4 bit) 有效载荷字节数 <1000
数据段 (0~64 bit)
-
遥控帧

-
错误帧

-
过载帧

-
帧间隔

CAN位填充
发送方在发送5个相同的电平后会自动 填充一个相反的位,接收方在接收到填充位后会自动丢弃恢复成原有的数据类型
例如:
发送 111111
经过位填充后 1111101
接收方 111111
标志错误帧与过载帧
错误帧与过载帧 会出现6bit的相同电平 而正常的数据流不会出现
CAN位同步
-
硬同步
每个设备都有一个位时序计数周期,当某个设备率先发送报文,其他所有设备接收报文,当受到帧起始位(SOF)的下降沿时,接收方会将自己的位时序计数周期 拨到ss段位置,与发送方保持同步
硬同步只在帧的第一个下降沿有效
经过硬同步后,若后续的时钟没有误差,则后续数据必然是对其的

-
再同步
若发送方与接收方的时钟存在误差,随着误差的累计,数据位边沿会逐渐偏离ss段,则接收方根据再同步补偿宽度值,通过加长PBS1 或者缩短PBS2 以调整

CAN总线仲裁
- 先占先得
- 若当前已经有设备向总线发送 数据帧/遥控帧,则其他设备不能发送数据帧或者遥控帧
- 当任何设备检测到连续11个隐形电平,则认为总线空闲,设备只有在总线空闲的情况下可以发送数据帧/遥控帧
- 一旦有设备发送数据帧/遥控帧,则因为拥有位填充必然不会出现11bit相同的电平
- 非破环性仲裁
- 若多个设备同时到来,则通过ID号来进行非破环性仲裁,ID小的优先级高,仲裁失败后转入接收状态,等待下一次总线空闲
- 线与特性:只有所有设备都发送隐形电平的时候,总线上才会显示隐形电平
- 回读机制:每个设备发送数据后都会读取线上数据判断是否与当前发送数据相同
例如: A:ID=0001 B:ID=0010
0001 B仲裁失败进入接收状态