CAN 的一些特点
can 总线:控制器局域网总线
总线特征
- 差分信号线 抗干扰能力强
- 高速 CAN(ISO11898):125k~1Mbps 传输距离<40m
- 低速 CAN(ISO11519):10k~125kbps 传输距离<1km
- 异步通信 无需时钟线 通信速率由设备各自约定
- 半双工,可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序
- 11位/29位报文ID,用于区分消息功能,同时决定优先级
- 可配置1~8字节的有效载荷
- 可实现广播式和请求式两种传输方式
- 应答、CRC校验、位填充、位同步、错误处理等特性
硬件电路
- 每个设备通过CAN收发器挂载在CAN总线网络上
- CAN控制器引出的TX和RX与CAN收发器相连,CAN收发器引出的CAN_H和CAN_L分别与总线的CAN_H和CAN_L相连
- 高速CAN使用闭环网络,CAN_H和CAN_L两端添加120Ω的终端电阻
- 低速CAN使用开环网络,CAN_H和CAN_L其中一端添加2.2kΩ的终端电阻

1.先看看它们各自的结构
左图中,CAN_H和 CAN_L是一对"双向线",总线两端各接了 1 个 120 Ω 的电阻,相当于给线路一个收尾固定,形成 闭环 结构
右图中,CAN_H 线接 2.2kΩ 电阻连到电源、CAN_L 线接 2.2kΩ 电阻连到地,总线两端没有 120Ω 的闭环电阻,是 “开环拉拽” 的结构。
2.各自的优缺点
闭环:
- 防止信号反射 如果总线两端不接电阻 信号传到末端会像水流撞到墙一样反射回来 和原信号叠加后会变乱 在高速CAN中 双绞线的特征阻抗大约是120欧姆 在两端各接一个120欧姆电阻 能把信号吸收掉 避免反射
- 成本较高 布线严格 必须使用双绞线 但是若总线断裂 整个网络瘫痪
- 通信速度高 但是距离短
开环:
- 抗干扰能力弱 通信速度低 但是距离长
- 成本较低 布线灵活 允许一根线断掉 系统仍然能运行
电平标准
高速CAN规定:
电压差为0V时表示逻辑1(隐性电平) 电压差为2V时表示逻辑0(显性电平)低速CAN规定:
电压差为-1.5V时表示逻辑1(隐性电平) 电压差为3V时表示逻辑0(显性电平)
总线帧格式
CAN 协议规定了以下五种类型的帧
| 帧类型 | 用途 |
|---|---|
| 数据帧 | 发送设备主动发送数据(广播式) |
| 遥控帧 | 接收设备主动请求数据(请求式) |
| 错误帧 | 某个设备检测出错误时向其他设备通知错误 |
| 过载帧 | 接收设备通知其尚未做好接收准备 |
| 帧间隔 | 用于将数据帧及遥控帧与前面的帧分离开 |
数据帧

简单说一下 这里精妙绝伦的设计
- 由于仲裁的时候是先比较 ID 后比较 RTR 所以在扩展帧的时候 RTR 被移到了 18 位扩展 ID 的后面
- 这里这个 SRR (Substitute Remote Request Bit)位通用解释是用于替代远程请求位 恒为隐性电平 但是正是这个设计保证标准数据帧的优先级高于扩展数据帧
- 同理 RTR 位 保证了数据帧的优先级高于遥控帧
遥控帧
遥控帧无数据段 RTR 为隐性电平 1 其他与数据部分一致
错误帧
总线上所有设备都会监督总线的数据,一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误” ,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备
过载帧
当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失
帧间隔
将数据帧和遥控帧与前面的帧分离开
位填充
位填充规则:发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据
例如:
即将发送: 100000110 10000011110 0111111111110
实际发送: 1000001110 1000001111100 011111011111010
实际接收: 1000001110 1000001111100 011111011111010
移除填充后: 100000110 10000011110 0111111111110
位填充作用:
- 增加波形的定时信息,利于接收方执行“再同步”,防止波形长时间无变化,导致接收方不能精确掌握数据采样时机
- 将正常数据流与“错误帧”和“过载帧”区分开,标志“错误帧”和“过载帧”的特异性
- 保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲
三、位时序
CAN总线对每一个数据位的时长进行了更细的划分,分为同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),每个段又由若干个最小时间单位(Tq)构成
硬同步
- 每个设备都有一个位时序计时周期,当某个设备(发送方)率先发送报文,其他所有设备(接收方)收到SOF的下降沿时,接收方会将自己的位时序计时周期拨到SS段的位置,与发送方的位时序计时周期保持同步
- 硬同步只在帧的第一个下降沿(SOF下降沿)有效
- 经过硬同步后,若发送方和接收方的时钟没有误差,则后续所有数据位的采样点必然都会对齐数据位中心附近

再同步
- 若发送方或接收方的时钟有误差,随着误差积累,数据位边沿逐渐偏离SS段,则此时接收方根据再同步补偿宽度值(SJW)通过加长PBS1段,或缩短PBS2段,以调整同步
- 再同步可以发生在第一个下降沿之后的每个数据位跳变边沿

波特率计算

仲裁
CAN总线只有一对差分信号线,同一时间只能有一个设备操作总线发送数据,若多个设备同时有发送需求,该如何分配总线资源?
先到先得
- 若当前已经有设备正在操作总线发送数据帧/遥控帧,则其他任何设备不能再同时发送数据帧/遥控帧(可以发送错误帧/过载帧破坏当前数据)
- 任何设备检测到连续11个隐性电平,即认为总线空闲,只有在总线空闲时,设备才能发送数据帧/遥控帧
- 一旦有设备正在发送数据帧/遥控帧,总线就会变为活跃状态,必然不会出现连续11个隐性电平,其他设备自然也不会破坏当前发送
- 若总线活跃状态其他设备有发送需求,则需要等待总线变为空闲,才能执行发送需求
非破坏性仲裁
若多个设备的发送需求同时到来或因等待而同时到来,则CAN总线协议会根据ID号(仲裁段)进行非破坏性仲裁,ID号小的(优先级高)取到总线控制权,ID号大的(优先级低)仲裁失利后将转入接收状态,等待下一次总线空闲时再尝试发送
实现非破坏性仲裁需要两个要求:
- 线与特性:总线上任何一个设备发送显性电平0时,总线就会呈现显性电平0状态,只有当所有设备都发送隐性电平1时,总线才呈现隐性电平1状态,即:0 & X & X = 0,1 & 1 & 1 = 1
- 回读机制:每个设备发出一个数据位后,都会读回总线当前的电平状态,以确认自己发出的电平是否被真实地发送出去了,根据线与特性,发出0读回必然是0,发出1读回不一定是1
因此 通过线与逻辑和回读机制就可以实现非破坏性仲裁 因为一旦回读失败 就表明自己的数据被破坏了 继续再发也没有意义 就可以等待下一次总线空闲时再发