CAN通信协议

CAN 的特点主要有一下几点:
①、多主控制
②、系统的柔软性
③、通信速度快,距离远
④、具有错误检测、错误通知和错误恢复功能
⑤、故障封闭功能
⑥、连接节点多

CAN 电气属性

CAN 总线使用两根线来连接各个单元:CAN_H 和 CAN_L, CAN 控制器通过判断这两根线上的电位差来得到总线电平, CAN 总线电平分为显性电平和隐性电平两种。显性电平表示逻辑“0”,此时 CAN_H 电平比 CAN_L 高,分别为 3.5V 和 1.5V,电位差为 2V。隐形电平表示逻辑“1”,此时 CAN_H 和 CAN_L 电压都为 2.5V 左右,电位差为 0V。 CAN 总线就通过显性和隐形电平的变化来将具体的数据发送出去 。

CAN 总线上没有节点传输数据的时候一直处于隐性状态,也就是说总线空闲状态的时候一直处于隐性。

CAN协议帧

CAN 协议提供了 5 种帧格式来传输数据:数据帧、遥控帧、错误帧、过载帧和帧间隔。其中数据帧和遥控帧有标准格式和扩展格式两种,标准格式有 11 位标识符(ID),扩展格式有 29 个标识符(ID)。

帧类型 帧用途
数据帧 用于 CAN 节点单元之间进行数据传输的帧
遥控帧 用于接收单元向具有相同 ID 的发送单元请求数据的帧
错误帧 用于当检测出错误时向其它单元通知错误的帧
过载帧 用于接收单元通知其尚未做好接收准备的帧
间隔帧 用于将数据帧及遥控帧与前面的帧分离开来的帧

D为显性0,R为隐形1。

CAN速率

CAN 总线以帧的形式发送数据,但是最终到总线上的就是“0”和“1”这样的二进制数据,这里就涉及到了通信速率,也就是每秒钟发送多少位数据, CAN2.0 最高速度为1Mbps/S。对于 CAN 总线,一个位分为 4 段:
①、同步段(SS)
②、传播时间段(PTS)
③、相位缓冲段 1(PBS1)
④、相位缓冲段 2(PBS2)
这些段由 Tq(Time Quantum)组成, Tq 是 CAN 总线的最小时间单位。帧由位构成,一个位由 4 个段构成,每个段又由若干个 Tq 组成,这个就是位时序。 1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。

can传输仲裁

在总线空闲态,最先开始发送消息的单元获得发送权。当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。

1691407245638

单元 1 和单元 2 同时开始向总线发送数据,开始部分他们的数据格式是一样的,故无法区分优先级,直到 T 时刻,单元 1 输出隐性电平,而单元 2 输出显性电平,此时单元 1 仲裁失利,立刻转入接收状态工作,不再与单元 2 竞争,而单元 2 则顺利获得总线使用权,继续发送自己的数据。这就实现了仲裁,让连续发送显性电平多的单元获得总线使用权。

CAN入门教程.pdf · 码云

FlexCAN(CAN外设)

FlexCAN 符合 CAN2.0B 协议。 FlexCAN完全符合CAN协议,支持标准格式和扩展格式,支持 64个消息缓冲。I.MX6ULL自带的FlexCAN模块特性如下:
①、支持 CAN2.0B 协议,数据帧和遥控帧支持标准和扩展两种格式,数据长度支持 0~8 字
节,可编程速度,最高 1Mbit/S。
②、灵活的消息邮箱,最高支持 8 个字节。
③、每个消息邮箱可以配置为接收或发送,都支持标准和扩展这两种格式的消息。
④、每个消息邮箱都有独立的接收掩码寄存器。
⑤、强大的接收 FIFO ID 过滤。
⑥、未使用的空间可以用作通用 RAM。
⑦、可编程的回测模式,用于进行自测。
⑧、可编程的优先级组合。

FlexCAN 支持四种模式:正常模式(Normal)、冻结模式(Freeze)、仅监听模式(Listen-Only)和回环模式(Loop-Back),另外还有两种低功耗模式:禁止模式(Disable)和停止模式(Stop)。
①、正常模式(Normal)
在正常模式下, FlexCAN 正常接收或发送消息帧,所有的 CAN 协议功能都使能。
②、冻结模式(Freeze)
当 MCR 寄存器的 FRZ 位置 1 的时候使能此模式,在此模式下无法进行帧的发送或接收,CAN 总线同步丢失。
③、仅监听模式(Listen-Onley)
当 CTRL 寄存器的 LOM 位置 1 的时候使能此模式,在此模式下帧发送被禁止,所有错误计数器被冻结, CAN 控制器工作在被动错误模式,此时只会接收其他 CAN 单元发出的 ACK 消息。
④、 回环模式(Loop-Back)
当 CTRL 寄存器的 LPB 位置 1 的时候进入此模式,此模式下 FlexCAN 工作在内部回环模式,一般用来进行自测。从模式下发送出来的数据流直接反馈给内部接收单元。

控制寄存器 CTRL 用于设置这些位时序, CTRL 寄存器中的 PRESDIV、 PROPSEG、 PSEG1、PSEG2 和 RJW 这 5 个位域用于设置 CAN 位时序。
PRESDIV 为 CAN 分频值,也即是设置 CAN 协议中的 Tq 值,公式如下:
$$
𝑓_{𝑇𝑞} =𝑓_{𝐶𝐴𝑁𝐶𝐿𝐾}/PRESDIV + 1
$$
fCANCLK为 FlexCAN 模块时钟,这个根据时钟章节设置即可,设置好以后就是一个定值,因此只需要修改 PRESDIV 即可修改 FlexCAN 的 Tq 频率值。
Tq 定了以后我们结合各个段来看一下如何设置 FlexCAN 的速率:

SS: 同步段(Synchronization Segment),在 I.MX6ULL 参考手册中叫做 SYNC_SEG,此段固定为 1 个 Tq 长度,因此不需要去设置。
PTS: 传播时间段(Propagatin Segment), FlexCAN 的 CTRL 寄存器中的 PROPSEG 位域设置此段,可以设置为 07,对应 18 个 Tq。
PBS1: 相位缓冲段 1(Phase Buffer Segment 1), FlexCAN 的 CRTL 寄存器中的 PSEG1 位域设置此段,可以设置为 07,对应 18 个 Tq。
PBS2:相位缓冲段 2(Phase Buffer Segment 2), FlexCAN 的 CRTL 寄存器中的 PSEG2 位域设置此段,可以设置为 17,对应 28 个 Tq。
SJW: 再同步补偿宽度(reSynchronization Jump Width), FlexCAN 的 CRTL 寄存器中的 RJW位域设置此段,可以设置 03,对应 14 个 Tq。

SYNC+SEG+(PROP_SEG+PSEG1+2)+(PSEG2+1)就是总的 Tq,因此FlexCAN 的波特率就是:
$$
𝐶𝐴𝑁波特率 = 𝑓_{𝑇𝑞}/总Tq
$$