简介
- CAN总线(Controller Area Network Bus)控制器局域网总线
- 两根通信线(CAN_H、CAN_L),线路少,无需共地
- 差分信号通信,抗干扰能力强
- 两种模式:高速和低速
- 异步,无需时钟线,通信速率由设备各自约定
- 半双工,可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序
- 11位/29位报文ID,用于区分消息功能,同时决定优先级
- 可实现广播式和请求式两种传输方式
- 应答、CRC校验、位填充、位同步、错误处理等特性
接线方式
逻辑电平
can总线采用差分信号,就是两条线之间的压差(VCAN_H-VCAN_L)传输数据
高速CAN:
逻辑 | 压差 |
---|---|
0 | 0V |
1 | 1V |
低速CAN:
逻辑 | 压差 |
---|---|
0 | 3V |
1 | -1.5V |
CAN协议帧类型
帧类型 | 用处 |
---|---|
数据帧 | 广播:发送设备主动发送数据 |
遥控帧 | 请求:接受设备主动请求数据 |
错误帧 | 某个设备出错向其他设备发送通知 |
过载帧 | 接受设备通知发送设备目前尚未做好准备 |
帧间隔 | 用于数据帧及遥控帧与前面的分开 |
![]() | |
![]() | |
![]() | |
![]() |
位填充
和usb数据一样遵循反向不归零编码,发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据,作用:
- 增加波形的定时信息,利于接收方执行“再同步”,防止波形长时间无变化,导致接收方不能精确掌握数据采样时机
- 将正常数据流与“错误帧”和“过载帧”区分开,标志“错误帧”和“过载帧”的特异性
- 保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲
数据接受和发送
- CAN总线没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长
发送方以约定的位时长每隔固定时间输出一个数据位 - 接收方以约定的位时长每隔固定时间采样总线的电平,输入一个数据位
- 理想状态下,接收方能依次采样到发送方发出的每个数据位,且采样点位于数据位中心附近
位时序
为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线对每一个数据位的时长进行了更细的划分,分为:
- 同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),每个段又由若干个最小时间单位(Tq)构成
硬同步
- 每个设备都有一个位时序计时周期,当某个设备(发送方)率先发送报文,其他所有设备(接收方)收到SOF的下降沿时,接收方会将自己的位时序计时周期拨到SS段的位置,与发送方的位时序计时周期保持同步
- 硬同步只在帧的第一个下降沿(SOF下降沿)有效
- 经过硬同步后,若发送方和接收方的时钟没有误差,则后续所有数据位的采样点必然都会对齐数据位中心附近
再同步
- 若发送方或接收方的时钟有误差,随着误差积累,数据位边沿逐渐偏离SS段,则此时接收方根据再同步补偿宽度值(SJW)通过加长PBS1段,或缩短PBS2段,以调整同步
再同步可以发生在第一个下降沿之后的每个数据位跳变边沿
波特率计算
波特率 = 1 / 一个数据位的时长 = 1 / (TSS + TPTS + TPBS1 + TPBS2)
例如:
- SS = 1Tq,PTS = 3Tq,PBS1 = 3Tq,PBS2 = 3Tq
- Tq = 0.5us
- 波特率 = 1 / (0.5us + 1.5us + 1.5us + 1.5us) = 200kbps
多设备同时发送遇到的问题
CAN总线只有一对差分信号线,同一时间只能有一个设备操作总线发送数据,若多个设备同时有发送需求,该如何分配总线资源?
解决问题的思路:制定资源分配规则,依次满足多个设备的发送需求,确保同一时间只有一个设备操作总线
-
资源分配规则1 - 先占先得
若当前已经有设备正在操作总线发送数据帧/遥控帧,则其他任何设备不能再同时发送数据帧/遥控帧(可以发送错误帧/过载帧破坏当前数据)
任何设备检测到连续11个隐性电平,即认为总线空闲,只有在总线空闲时,设备才能发送数据帧/遥控帧
一旦有设备正在发送数据帧/遥控帧,总线就会变为活跃状态,必然不会出现连续11个隐性电平,其他设备自然也不会破坏当前发送
若总线活跃状态其他设备有发送需求,则需要等待总线变为空闲,才能执行发送需求 -
资源分配规则2 - 非破坏性仲裁
若多个设备的发送需求同时到来或因等待而同时到来,则CAN总线协议会根据ID号(仲裁段)进行非破坏性仲裁,ID号小的(优先级高)取到总线控制权,ID号大的(优先级低)仲裁失利后将转入接收状态,等待下一次总线空闲时再尝试发送
实现非破坏性仲裁需要两个要求:
线与特性:总线上任何一个设备发送显性电平0时,总线就会呈现显性电平0状态,只有当所有设备都发送隐性电平1时,总线才呈现隐性电平1状态,即:0 & X & X = 0,1 & 1 & 1 = 1
回读机制:每个设备发出一个数据位后,都会读回总线当前的电平状态,以确认自己发出的电平是否被真实的发送出去了,根据线与特性,发出0读回必然是0,发出1读回不一定是1非破坏性仲裁过程
数据位从前到后依次比较,出现差异且数据位为1的设备仲裁失利
数据帧和遥控帧的优先级
标准格式的优先级高于扩展格式(SRR必须始终为1,以保证此要求)
错误类型
错误共有5种: 位错误、填充错误、CRC错误、格式错误、应答错误
错误状态
- 每个设备内部管理一个TEC和REC,根据TEC和REC的值确定自己的状态
- 主动错误状态的设备正常参与通信并在检测到错误时发出主动错误标志
- 被动错误状态的设备正常参与通信但检测到错误时只能发出被动错误标志
- 总线关闭状态的设备不能参与通信