CAN协议(ISO11898)
目录
1 性能特点
2 错误状态
2.1 错误种类
3 帧的类型
3.1 数据帧
3.2 遥控帧
3.3 错误帧
3.4 过载帧
3.5 帧间隔
4 帧的优先级
5 位填充
6 采样点
6.1 CAN波特率计算:
6.2 采样点计算(S32G为例)
6.2.1第一采样点
6.2.2 第二采样点
1 性能特点
1、多主控制
在总线空闲时,所有的单元都可开始发送消息。
2、信息的发送
两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为ID)决定优先级。对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
3、系统的柔软性
连接在总线上的其它单元的软硬 件及应用层都不需要改变。
4、通信速度
在同一网络中,所有单元必须设定成统一的通信速度。
5、远程数据请求
可通过发送“遥控帧”请求其他单元发送数据
6、错误检测功能,错误通知功能,错误恢复功能
所有的单元都可以检测错误(错误检测功能)。
检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。
正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
7、故障封闭
CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误。当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去
8、连接
CAN总线是可以同时连接多个单元的总线
9、使用NRZ编码(非归零编码)+位填充(保证有足够跳变沿用于时间同步)
位填充:发送节点发送5个连续的相同极性位后,在位流中自动插入一个极性相反的位。
清除填充:接收节点对相同极性位的数量进行检测,从位流中将填充位去掉。
2 错误状态
1、主动错误
主动错误状态是可以正常参加总线通信的状态。
处于主动错误状态的单元检测出错误时,输出主动错误标志。
2、被动错误状态
处于被动错误状态的单元即使检测出错误,也不能发送错误通知,并且整个总线也被认为是没有错误的。
被动错误状态的单元在发送结束后不能马上再次开始发送,在间隔帧期间内 必须插入“延迟传送”(8 个位的隐性位)。
3、总线关闭态
总线关闭态信息的接收和发送均被禁止。
通过发送错误计数和接受错误计数管理
2.1 错误种类
错误共有 5 种,多种错误可能同时发生。
位错误、填充错误、CRC 错误、格式错误、ACK 错误
3 帧的类型
3.1 数据帧
共七个部分组成:
帧起始、仲裁段、控制段、数据段、CRC 段、ACK 段 、帧结束
(1) 帧起始:
表示数据帧开始的段,1 个位的显性位。(显性电平的逻辑值为“0”,隐性电平为“1”)
(2) 仲裁段:
表示该帧优先级的段,标准格式和扩展格式在此的构成有所不同。
(3) 控制段:
表示数据的字节数及保留位的段。(保留位(r0、r1) 保留位必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。)
(4) 数据段:
可发送 0~8 个字节的数据,从 MSB(最高位)开始输出。
(5) CRC 段:
CRC 段是检查帧传输错误的帧。由 15 个位的CRC 顺序和 1 个位的 CRC 界定符(用于分隔的位)构成(CRC 顺序是根据多项式生成的 CRC 值,CRC 的计算范围包括帧起始、仲裁段、控制段、数据段。接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。)
(6) ACK 段:
ACK 段用来确认是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界定符 2 个位构成。
1.发送单元的 ACK 段:发送单元在 ACK 段发送2 个位的隐性位。
2.接收单元的 ACK 段:接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位,通知发送单元正常接收结束。这称作“发送 ACK”或者“返回 ACK”
(7) 帧结束:
帧结束是表示该该帧的结束的段。由7个位的隐性位构成。
3.2 遥控帧
1、遥控帧的RTR 位为隐性位,没有数据段。(没有数据段的数据帧和遥控帧可通过 RTR 位区别开来)。
2、遥控帧的数据长度码以所请求数据帧的数据长度码表示。
3、没有数据段的数据帧有何用途?可用于各单元的定期连接确认/应答、或仲裁段本身带有实质性信息的情况下。
3.3 错误帧
用于在接收和发送消息时检测出错误通知错误的帧。错误帧由错误标志和错误界定符构成。
1、错误标志:
错误标志包括主动错误标志和被动错误标志两种。
-主动错误标志:6 个位的显性位。
-被动错误标志:6 个位的隐性位。
2、错误界定符:
错误界定符由 8 个位的隐性位构成。
3.4 过载帧
1、过载标志:
6 个位的显性位。
2、过载界定符:
8 个位的隐性位。
3.5 帧间隔
帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、 遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间隔。
1、间隔:
3 个位的隐性位。
2、总线空闲:
隐性电平,无长度限制(0 亦可)。
本状态下,可视为总线空闲,要发送的单元可开始访问总线。
3、延迟传送(发送暂时停止):
8 个位的隐性位。
只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。
4 帧的优先级
1、ID越小的优先级越高
2、仲裁段的最后一位(RTR)为显性位的数据帧具有优先权, 可继续发送。(数据帧为显性,遥控帧&拓展数据帧为隐性)
5 位填充
位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时则添加一个位的反型数据。
位填充:发送节点发送5个连续的相同极性位后,在位流中自动插入一个极性相反的位。
清除填充:接收节点对相同极性位的数量进行检测,从位流中将填充位去掉。
6 采样点
6.1 CAN波特率计算:
TQ(Time-Quanta)是CAN通信里的最小时间单位:
TQ = Prescaller / fCANCLK
TQS是一个Bit包含的TQ数量:
TQS = SYNC+TSEG1+TSEG2+Prop_SEG
但不是一个bit的传输时间,一个CAN bit的传输时间根据ISO标准可知为:
Bit_time =TQS*TQ
波特率的计算公式为:
CAN_Baud = 1/Bit_time=1/(TQS*TQ)= 1/((SYNC+TSEG1+TSEG2+Prop_SEG)*TQ)
= 1/(SYNC+TSEG1+TSEG2+Prop_SEG)*Prescaller/fCANCLK)
=fCANCLK / ((SYNC+TSEG1+TSEG2+Prop_SEG)*Prescaller)
6.2 采样点计算(S32G为例)
6.2.1第一采样点
Phase Segment 1 = (PSEG1 + 1) × TQ.
Phase Segment 2 = (PSEG2 + 1) × TQ.
Propagation Segment Time = PROPSEG × TQ.
Resync Jump Width = SJW + 1.
(Sync_SEG+Time Segment 1)/(Sync_SEG+Time Segment 1 +Time Segment 2)
=(1+PROPSEG+PSEG1+2)/(1+PROPSEG+PSEG1+2+PSEG2+1)
6.2.2 第二采样点
Phase Segment 1 = (FPSEG1 + 1) × TQ.
Phase Segment 2 = (FPSEG2 + 1) × TQ.
Propagation Segment Time = FPROPSEG × TQ.
Resync Jump Width = FSJW + 1.
(Sync_SEG+Time Segment 1)/(Sync_SEG+Time Segment 1 +Time Segment 2)
=(1+PROPSEG+PSEG1+1)/(1+PROPSEG+PSEG1+1+PSEG2+1)
