CAN总线协议详解( 四 )


CAN总线协议详解

文章插图
图8
位填充
由于CAN总线传输时,没有类似其他串行通信的CLK线,所以如果连续传输多个相同位时会有时钟误差的累加 。为了解决此问题,引入位填充的概念 。当同样的电平持续5位时添加一个位的反型数据,当电平发生跳变时,进行再同步,以解决时钟误差累加问题 。位填充的构成如下图所示 。
CAN总线协议详解

文章插图
图9
错误种类
位错误
CAN节点在发送位的同时也会对总线进行监测,如果所发送的位值与所检测到的位值不相符,则认为检测到一个位错误 。位错误是由总线上发出数据帧、远程帧、错误帧、过载帧的节点和发出ACK的节点检测到的 。但以下情况除外:在仲裁段发出隐性电平,但是实际检测到显性电平,将被认为仲裁失败而非位错误;在仲裁段作为位填充发出隐性电平,但实际检测到显性电平,将被认为填充错误,而非位错误 。发送节点在发送ACK段发送隐性电平,但检测到显性电平是,将判定位其他接收单元发送的ACK应答,而非位错误 。发送被动错误(6个隐性位)但检测出显性电平,间不被认为位错误 。
检测节点:发送节点和接收节点
填充错误
如果在报文发送期间,检测出6个连续显性或者隐性位,则将认为是一个填充错误 。
检测节点:发送节点和接收节点
CRC错误
如果接收节点在接收数据过程中计算的CRC值与发节点发送的CRC不一致,则接收节点会发送一个错误帧 。
检测节点:接收节点
格式错误
当一个固定形式的位检测出1个或多个非法位,则被认为是格式错误 。具体包括数据帧和远程帧的CRC界定符、ACK界定符、EOF界定符以及错误界定符、超载界定符 。
检测节点:接收节点
ACK错误
只要在应答间隙检测到显性,则发送节点认为这是一个ACK错误 。
检测节点:发送节点
错误帧发送时间点
当任意节点检测到错误时,将会输出错误帧 。处于主动错误的节点输出主动错误,处于被动错误的节点输出被动错误 。
当节点检测到位错误、填充错误、格式错误、ACK错误,从检测出错误的下1位开始发送错误标志 。
当节点检测到CRC错误时,在ACK界定符后的下1位发送错误标志 。
注意:对于数据帧和远程帧来讲,需要在各种帧(数据帧、远程帧、错误帧、过载帧)发送结束后的再插入一个间隔帧,才可以数据帧 。所以我们可以大致计算出当一帧数据发送失败后,大概多长时间CAN控制器才会才重发这帧报文(即错误帧长度再加上一个帧间隔,根据发送节点所处的是主动错误还是被动错误状态,帧间隔长度会不一样,所以计算时需要注意) 。
错误计数器的加减规则
具体如下表 。
CAN总线协议详解

文章插图
表2
注:第3点当发送节点发送一个错误标志时,发送错误计数器值加8 。这里有两个例外情况:一是当发送节点处于被动错误时,并检测到一个应答错误或者发送被动错误标志期间没有检测到显性位(这种情况是因为整个网络中只有发送节点一个节点存在,所以不能因为只有发送节点存在而一直将发送错误计数器往上加,直至发送节点进入bus off状态)二是发送节点因为仲裁期间发生填充错误而发送错误标志 。以上两种情况,发送错误计数器值不变 。
错误状态变化
当节点的发送错误计数器值在0-127之间且接收错误计算器值在0-127之间时,节点处于主动错误状态;
当节点的发送错误计数器值在128-255之接或者接收错误计数器值在128-255之间,节点处于被动错误 。
当发送错误计数器值大于255时候,节点进入总线关闭(bus off),接收错误用于不会大于255,即接收错误不会使节点进入bus off 。
注:只有发送错误才能让节点进入总线关闭 。另外需要注意,当总线关闭可以设置CAN控制器时自动恢复(即检测到128次11个连续隐性位自动恢复到主动错误状态)还是不自动恢复 。在汽车行业,一般都是不让CAN控制器自动恢复,而是人为控制进入快慢恢复过程 。
CAN总线协议详解

文章插图
图10
位时间要求
标称位时间
标称位时间,是指理想情况下发送1位所需要的时间,例如对于速率为500k的CAN总线,标称为时间=1/500k=2us


推荐阅读