CAN 协议学习笔记
物理层:
- can 的物理电路连接 无主机从机之分
- 表达信号需要差分信号(2条线表示差分)
- 半双工 一个时间表示一个信号 ,抗干扰能力强。CanHigh CanLow同时变化,对差分信号无影响。
- 以Can高速为例:逻辑 1 CanHigh – CanLow = 0 逻辑0 CanHigh – CanLow > 1.5V 表示逻辑0
协议层:
Can通信协议层
总线上各个节点协调好波特率。
硬件同步和再同步 确保数据传输。
位时序分解
一个电平期间由几段组成(SS段1Tq + PTS段6Tq + PBS1段5Tq + PBS2段 7Tq)
在PBS1 与 PBS2 段之间进行采样(采样点可以动态变化)。
- SS段(SYNC SEG)
如果通信节点检测到总线上信号的跳变沿被包含在SS段的范围内。则表示节点与总线之间的时序是同步的,采样点采样的总线上的电平即可被确认为是该位的电平。SS段固定1Tq.
Tq 是一个时间单位
- PTS段(Port Seg)
PTS 为传播时间段,这个时间段是用来补偿网络的物理延时时间。是总线上输入比较器延时和输出的驱动器延时总和的两倍。时间在1~8Tq.
- PBS1段
PBS1段为相位缓冲段1,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。PBS1段的初始大小可以为1~8Tq.
- PBS2段
PBS2这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。 PBS2段的初始大小可以为2~8Tq。
PBS1 和PBS2 时间可以通过插入SJW 来设置同步时间段
- 再同步
SJW重新同步跳跃宽度, 在每位中可以延长或缩短多少个时间单元的上限。其值可以编程为1到4个时间单元。每当检测出边沿时,根据 SJW值通过加长 PBS1段,或缩短 PBS2段,以调整同步。但如果发生了超出 SJW值的误差时,最大调整量不能超过 SJW值。
一个通信差距比较小,但是时间久了之后会有表较大的误差,所以要进行位时序同步。
- 波特率:
总线上的各个通讯节点只要约定好1个Tq的时间长度以及每一个数据位占据多少个Tq,就可以确定CAN通讯的波特率。
例如,假设上图中的1Tq=1us,而每个数据位由19个Tq组成,则传输一位数据需要时间T1bit =19us,从而每秒可以传输的数据位个数为:
1x106/19 = 52631.6 (bps) 这个每秒可传输的数据位的个数即为通讯中的波特率。
报文种类
帧 |
帧用途 |
数据帧 |
用于节点向外传送数据 |
遥控帧 |
用于向远端节点请求数据。 |
错误帧 |
用于向远端节点通知校验错误,请求重新发送上一个数 |
过载帧 |
用于接收单元通知其尚未做好接收准备的帧。 |
帧间隔 |
用于将数据帧及遥控帧与前面的帧分离开来的帧。 |
Can的报文结构
数据帧的组成由 起始端 + 仲裁段 + 控制段 + 数据段 + CRC段 + ACK段 + 帧结束段
1、起始段
帧起始信号只有一个数据位,是一个显性电平,它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步准备接受。
2、仲裁段
仲裁功能:
仲裁段的功能是通过仲裁段的11位ID来进行优先级的比较。根据线与特性,低电平优先级高,所以ID越小,优先级越低。如图:
若两个节点同时竞争CAN总线的占有权,当它们发送报文时,若首先出现隐性电平,则会失去对总线的占有权,进入接收状态。
- 仲裁段区分标准帧和扩展帧
IDE位(Identifier Extension Bit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。
标准数据的RTR位(Remote Transmission Request Bit),译作远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。
扩展数据的SRR位(Substitute Remote Request Bit),只存在于扩展格式,它用于替代标准格式中的RTR位。由于扩展帧中的SRR位为隐性位, RTR在数据帧为显性位,所以在两个ID相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。
3、 控制段
在控制段中的r1和r0为保留位,默认设置为显性位。它最主要的是DLC段(DataLength Code),译为数据长度码,它由4个数据位组成,用于表示本报文中的数据段含有多少个字节, DLC段表示的数字为0~8
4、数据段
数据段为数据帧的核心内容,它是节点要发送的原始信息,由0~8个字节组成,MSB先行
5、CRC段
为了保证报文的正确传输, CAN的报文包含了一段15位的CRC校验码,一旦接收节点算出的CRC码跟接收到的CRC码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。 CRC部分的计算一般由CAN控制器硬件完成,出错时的处理则由软件控制最大重发数。
在CRC校验码之后,有一个CRC界定符,它为隐性位,主要作用是把CRC校验码与后面的ACK段间隔起来。
6、ACK段
ACK段包括一个ACK槽位,和ACK界定符位。类似I2C总线,在ACK槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在ACK槽和帧结束之间由ACK界定符间隔开。
7、结束帧
EOF段(End Of Frame),译为帧结束,帧结束段由发送节点发送的7个隐性位表示结束。