CAN帧解析
版本 | 颁布日期 | 修订章节 |
---|---|---|
0.1 | 2018.06.02 | 撰写草稿 |
0.2 | 2018.06.16 | 整理CAN帧解析 |
0.3 | 2018.06.24 | 整理CAN帧数据类型格式 |
0.4 | 2018.07.07 | 完善CAN帧解析 |
0.5 | 2018.07.22 | 补充CAN帧类型说明 |
0.6 | 2018.08.05 | 整理CAN帧仲裁 |
0.7 | 2018.09.10 | 整理CAN处理关系 |
1.0 | 2018.09.17 | 整理CAN错误帧场景 |
文章目录
CAN帧表达
CAN信号采用差分信号传输,通过差分电压来表达信息。
两条CAN线的差分电压在某个阈值内才是有效的,ISO11898中这个阈值为2V(空闲2.5V CAN_H 3.5V,CAN_L 1.5V),ISO11519中,这个阈值为3V,电平差变化时间约为2μs
差分电压 = CAN_H – CAN_L
差分电压差范围在2V时表现为显性,定为逻辑0。
差分电压差范围在0V时表现为隐性,定为逻辑1。
CAN帧表示为显性标志为有效位。
位填充规则
在CAN发送帧时,为避免总线上产生过多连续相同的电平表达(连续的显性电平或隐性电平),导致使收发双方失步。因此位填充确保最多5个位间就会产生反转电平,确保发送端与接收端进行同步传输。错误帧、过载帧和帧结束之间的连续电平不需要位填充。
位填充适用范围
帧起始、仲裁段、控制段、数据段、校验段
CAN帧间隔(间歇场)
帧间隔用于隔离远程帧或数据帧,但不会隔离错误帧和过载帧,即发送错误帧和过载帧不需要加入帧间隔,发送端检测到异常后立即发送错误帧和过载帧。但错误帧和过载帧发送后后面有帧间隔
帧间隔也成为间歇场
在帧间隔期间,所有的节点均不能发送数据帧和远程帧。
格式:连续3个隐性电平1 + 下一帧或总线空闲电平
主动错误
与帧间隔形式相同
被动错误
被动错误会插入8位隐性电平的暂停段
总线空闲
当出现连续11个隐性电平以上时,认为总线空闲
CAN帧结构
帧起始(SOF)
由一个显性位构成,发送端发出一个显性位,作为CAN帧开始传输的标志。
仲裁段
CAN在一条总线上传输,具有优先级,仲裁段就是区分帧的优先级,根据CAN2.0版本的不同,仲裁段可以分为标准模式和扩展模式。
标准模式的帧ID为11位,扩展模式的帧ID为29位。
标准帧格式
扩展帧格式
RTR远程请求帧:
数据帧:显性电平0
远程请求帧:隐性电平1
SRR在扩展帧中代替标准帧的RTR:
在扩展帧中表现隐性电平1
IDE扩展标志位
标准帧:显性电平0
扩展帧:隐性电平1
帧仲裁
显性的优先级比隐性高,因此通过判断仲裁端的对应的显隐性优先级来判断整个CAN帧的优先级。
在总线空闲时段,任何设备都可以向CAN总线发送报文。多个设备同时发送报文时,总线通过识别符的位形式仲裁进行快速进行分配。
节点的优先级被定义在仲裁段的ID中,这个ID在节点设计时就已经确定,不可更改
由于CAN总线采用非归零(NRZ)编码,CAN帧表达为显性为有效位。当其中有一个节点向总线发送显性0有效位时,总线整体就呈现显性状态,而不去呈现其他节点的隐性1位。那这些发隐性1位的节点就失去了仲裁,退出传输,进入监听模式。
举例
电平逻辑:显性为0,隐性为1
节点1:0x53D——1341
节点2:0x531——1329
节点3:0x57A——1402
节点1、2在箭头1处获得仲裁,节点3退出仲裁,进入监听模式;
节点2在箭头2处获得仲裁,节点1退出仲裁,进入监听模式;
CAN总线通过逐帧仲裁的原理帧ID越小,帧的级别越高。
数据帧与远程帧
在ID相同的情况下,识别远程帧的标志位为RTR,RTR的电平选择如下:
数据帧:显性电平0
远程请求帧:隐性电平1
因此数据帧的级别比远程帧高。
标准帧与扩展帧
在ID相同的情况下,识别远程帧的标志位为IDE,IDE的电平选择如下:
标准帧:显性电平0
扩展帧:隐性电平1
因此标准帧的级别比远程帧高。
优缺点
优点:
- 实时性高,在总线仲裁哪个节点优先级高低的同时,帧控制段和数据段的有效信息已经在总线传输;
- 仲裁分配,获得仲裁的节点在总线传输,未获得总裁的节点不会在总线非空闲状态发送报文;
- 优先级分配,效率高,总线通信是根据CAN帧在总线上的重要性处理的
缺点:
由于优先级不可改变,因此低优先级节点的传输有很大几率会被优先级高的节点打断,发送失败的几率变大,导致低优先级的节点延迟较高。
控制段
标准帧:
为兼容扩展帧,标准帧有IDE位、保留位R0和数据长度DLC位组成,
IDE位和R0位都为隐性电平1。
扩展帧:
由保留位R1、R0和数据长度DLC位组成。
R1位和R0位都为隐性电平1。
数据长度为DLC统计的是数据段的字节数,范围0~8个字节。
数据段
一个完整的数据帧传输的数据量为0 ~ 8个字节,对应占用0 ~ 64位,数据帧短促,使得帧传输时效性高。传输时MSB(高有效位)先传输。
校验段
由15位CRC校验值和1位CRC分隔符组成。
CRC分隔符为隐性电平1
校验区域:
数据帧:帧起始+帧仲裁+控制段+数据段
远程帧:帧起始+帧仲裁+控制段
CRC校验多项式
G(X) = X15 + X14 + X10 + X8 + X7 + X4 + X3 + 1
应答段
由1位ACK值和1位ACK分隔符组成。ACK分隔符为隐性电平1。
发送端的ACK为隐性电平1,接收端回复的ACK为显性电平0。
当发送端发送出CRC分隔符后,将发送两个隐性电平的应答段。
在同一条总线上的所有除去发送端的节点,如果能够正常校验CRC后,都需要对该帧作出应答,即要求所有校验CRC成功的接收节点都需要在应答段的ACK位发送一个显性位,以应答发送端。
帧结束(EOF)
由7个连续的隐性位1组成。帧结束强制不遵守位填充特性,表达出明显的结束标识,承接总线空闲。
CAN帧类型
数据帧
承载着数据的CAN帧,绝大多数的帧都是数据帧。
标准帧:
扩展帧:
远程帧
也称请求帧,当CAN端需要接收或发送某个数据时,先行发送远程帧(请求帧),通知该节点准备发送数据或接收数据。
总线单元发送ID号与数据帧相同的帧,请求该ID号的数据帧。接收端鉴别远程帧进行初始化的设置,接收到远程帧之后,接收端就进入发送数据帧准备。
标准帧:
扩展帧:
错误帧
错误类型
尽管CAN的实时性和可靠性很高,但在现实中发送时也会会出现错误,CAN节点产生的错误类型有以下5种
- CRC校验错误:接收端收到的CRC值与计算的CRC值不一致;
- 格式错误:传输的CAN帧不符合标准CAN帧格式;
- 无应答:发送端没有收到接收端的ACK应答信号;
- 位发送错误:发送端监听到总线上的电平与自己发送电平不符;
- 位填充错误:CAN总线上传输的信号违反位填充规则,出现6个连续相同的位。
在仲裁段,应答ack,被动错误标志期间不会导致位发送错误。
帧格式:错误标志+错误分隔符
错误分隔符:连续8个隐性电平1
发送端监听:格式错误、无应答、位发送错误
接收端监听:格式错误、CRC校验错误、位填充错误
发送错误帧时不用插入帧间隔。
只要在总线上的节点,都会在监听报文中出现的错误类型。只要监听到错误,处于主动模式的节点就会发送错误帧,强制结束通信。也许有其他节点没有监听到出错的标识(可能是线路过长或干扰引起的错误),但由于有一个主动节点发出了错误帧,就必然监听到错误,并且也会发送错误帧。
因此所有在总线上的节点都会有发送出错误帧的体现。发送端在发送的同时也在监听总线,其他监听的节点在监听到错误帧后,接收错误计数器加1,发送节点发送错误计数器加8。
当总线上体现出错误帧后,总线空闲时,发送端将会重新发送上一帧。
主动错误帧
主动错误帧格式,错误帧强制不遵守位填充特性,表达出明显的错误标识。
错误标志,连续6个显性电平0
CAN正常通信状态下发送的错误,比较明显的就是连续发送6个显性电平0,强制破坏掉总线当前的通讯状态,表现强烈的主动发送错误意识。由于总线上其他的节点监听到错误后也会发送主动错误帧或者存在发送时间差,因此主动错误帧有一个叠加范围,最多有连续12个显性电平。
被动错误帧
当节点的错误计数过多时(超过127次),节点再次检测到错误就会进入被动错误状态,节点连续的6个隐性电平和分隔符的8个隐性电平强制让总线进入静默状态,没有应答,让发送端在监听应答时发现接收端出现的被动错误。
由于总线保护机制,节点的错误计数过多可能是总线本身通信不稳定,也可能是节点自身问题,甚至是计数器自身故障。因此发送隐性电平的错误帧,不影响总线上其他节点的通信。
被动错误帧格式
错误标志,连续6个隐性电平1,同样被动错误帧也有一个叠加范围,最多有连续12个隐性电平。
由于节点处于被动模式,被动错误帧都为隐性电平,若总线上有处于主动错误模式的节点会发出主动错误帧。因此发送被动错误帧的节点必须监听到总线存在等于或大于连续6个相同的极性电平后,才被认为被动错误帧发出。
出错场景
1、发送端检测到位发送错误
发送端检测到无应答(发送错误)
无应答原因:
发送端CRC错误,导致除发送端外所有节点CRC校验失败;
除发送端外所有节点处于被动模式,检测到错误,发送被动错误帧;
除发送端外所有节点接收数据正常,但自身硬件错误;
总线只有发送端一个节点,(或者除发送端外所有节点总线关闭);
2、节点监控到格式错误
3、单个接收端检测到CRC校验错误
错误统计
发送错误计数器:Transmit Error Counter(TEC)
接收错误计数器:Receive Error Counter(REC)
CAN节点控制器内置发送(TX)和接收(RX)错误计数器,根据出错是全局的还是本地的,计数器以此决定加1还是加8;
发送错误,发送错误计数器加8,
接收错误,总线上所有节点监听到主动错误帧时,接收错误计数器加1,节点接收时检测到错误,接收错误计数器加8
接收正确,发送/接收错误计数器减1,
当总线上的节点监听到错误帧时,接收错误计数器加1;
当节点发送失败时,发送错误计数器就会加8。
计数规则:
监听到总线上有错误帧时,REC 计数加1,但检测到错误标识符或过载标识符中的位错误除外;
接收端发送完错误帧后检测到总线的第一位为显性电平REC加8
发送端主动发出错误帧时(格式错误、位发送错误、位填充错误(仲裁段除外)),TEC加8,检测到无应答而发出的错误帧TEC不变。
发送端发送主动错误帧或过载帧时,检测到位错误TEC加8
接收端发送主动错误帧或过载帧时,检测到位错误REC加8
节点监听主动错误帧、被动错误帧或过载帧时连续监听到14个显性标志位;被动错误帧后监听到8个显性标志位;被动错误标志后紧跟着连续8个显性标志位。所有节点的REC和TEC加8
发送端成功发送一帧报文,TEC减1,直到TEC为0
接收端成功接收一帧报文,若REC < 127,REC减1;若REC > 127 REC = 127
处于总线关闭的节点,检测到连续的11个隐性标志位连续出现128次,
REC = 0,TEC = 0,节点变为主动错误模式。
错误处理
通过查询出错计数器值,能通俗的体现出通信网络质量。通过统计错误的次数,切换自身在总线中的错误状态,确保不会因为自身CAN节点错误的原因而导致干扰整套CAN网络的通信。
当发送和接收错误计数器的任何一方累计出错统计达到一定数目时,就会触发CAN端对计数次数的处理
错误次数统计:
0~127次: 节点发送主动错误帧状态,在到达96次时,体现通信质量较差;
128~254次:节点发送进入被动帧错误状态;
255次: 节点主动脱离总线,处于总线关闭状态。
CAN的错误处理就是监听总线上出现的CAN帧出错的类型,做到及时统计,对相应的错误进行处理,如发送主动错误和被动错误以及自动断开总线。
错误状态
CAN节点发送错误帧的状态有以下三种:
- 主动错误:节点发送主动错误帧,破坏总线正在传输的帧;
- 被动错误:节点发送被动错误帧,不影响总线上其他节点的通讯;
- 总线关闭:节点停止收发帧,该节点脱离总线,不再工作,且只有在硬件复位后,才能恢复工作状态。
假设有一个节点,主动/被动错误计数器都为0。
若该节点发送报文失败,可能是总线受干扰,或者是仲裁失败,或者是发送后收到接收端的错误帧。那在失败时,发送计数器加8,并重新监听总线空闲状态,以便下次再重新发送报文。
在传输途中,该节点处于主动错误模式,监听到总线错误时将会发送主动错误帧。
当发送/接收错误计数器超过128次时,该节点进入被动错误模式。监听到错误时进入静默状态,即发送被动错误帧。不影响总线上其他节点的通信,其他节点的接收错误计数器不会加1。
当发送/接收错误计数器超过255时,总线关闭模式。不再往总线上发送报文。
总线关闭下的节点,只有在节点重启或监听到连续的11个隐性位达到128次时才会恢复成主动错误模式,收发错误计数器清零。
错误状态转换图:
过载帧
接收端由于接收能力有限,或自身已经达到极限时,向总线报告的帧,以延迟下一帧数据帧或远程帧的发送,表示设备忙碌。
出现接收端发送过载帧有以下情况
- 接收端自身原因,没有准备好接收下一帧,接收端在接收每一帧之间有个延时;
- 监听到帧间隔间有显性电平0;(意味着有下一帧报文,但此时监听的是帧间隔时期,不应该有报文发送,因此发送过载帧,阻断这帧报文);
- 监听到错误分隔符或过载分隔符的低8位有显性电平;(CAN帧规则,必须至少是连续的8个隐性电平,但在错误处理中不会增加错误计数)
强制不遵守位填充特性,表达出明显的过载标识。
如在处理广播帧时,当其中一个接收端自身能力达到极限,会发送过载帧,连续6个显性电平会强制打断总线上的帧传输,让发送端从新发送该帧,以达到延迟的目的。
发送过载帧时不用插入帧间隔。