0.CAN总线错误分析与解决–讲的最精辟的放在最前面

我们知道CAN总线上的每个节点往总线上发送数据的同时会同时读取总线上的数据,并与自己发送的数据作对比。—CAN仲裁???
在这里插入图片描述

CAN总线错误分别有发送和接收错误计数,计数达到一定的累计以后就会产生CAN BUS OFF, 这说明CAN总线上出现了严重的错误。如下图CAN总线产生错误后的状态转换机制
如果出现了BUS OFF,总线上的节点需要做一些动作,例如重启CAN控制器或是重新上电,但是这些都只是一些补救措施,最根本的还是需要找到引起BUS OFF的根源。
CAN总线状态直接进入了BUS OFF状态,这意味着错误计数已经超限,查看CPU收发寄存器的收发错误计数显示发送错误计数TEC达到248, 接收错误计数为0;这很明显,数据压根没有发送到总线上。
再进一步查看寄存器值LEC即LAST ERROR CODE 最后一个错误代码, 显示是BIT0 ERROR:
查看上面的错误代码表可知,BIT0错误也就是在发送数据期间,虽然CAN节点设备想要发送一个显性位,也就是逻辑0,但是CAN总线同时监听到总线上的数据位为隐性位,即逻辑1。这意味着CAN core往总线上发送的数据第一位就已经出错了,压根没有将数据经过CAN收发器传送到CAN总线上。

一直在使用CAN总线的我厂和我从来没遇到这等奇事,但是由于是新的CPU的开发所以在怀疑硬件的问题的同时也在排查软件问题,但是经过一阵排查,没有发现软件上的问题。回头再分析硬件,又经过一阵排查溯源,发现CPU的CAN收发线与CAN收发气的收发线接反,直接崩溃(PS: 硬件的大哥你能不能不要坑小弟):

CAN节点发送数据不成功,首先分析是不是CAN控制器本身的问题,查看CPU中的CAN core的状态寄存器,分析是否有BUS OFF, 如果存在BUS OFF, 则进一步查看具体的错误信息,是主动的错误还是被动的错,发送错误计数有没有超限,最后一次发生的错误状态是什么,查看是位填充错误还是格式错误等其他错误,然后具体问题具体分析。这种错误一般是有硬件发送线路出现问题引起,例如光隔次边不导通,发送接口接触不良等,再则是一些奇葩的错误,例如本例,收发线直接接反了,坑爹啊!
https://blog.csdn.net/zjy900507/article/details/79659344?ops_request_misc=&request_id=&biz_id=102&utm_term=CAN%E5%8F%91%E9%80%81%E5%A4%B1%E8%B4%A5%E7%9A%84%E5%8E%9F%E5%9B%A0%E6%9C%89%E5%93%AA%E4%BA%9B%E2%80%98&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-8-79659344.pc_search_es_clickV2&spm=1018.2226.3001.4187

1

最近在做CAN通信项目,发现连续发送数据一段时间后,从机无法接收主机数据。通过仿真发现CAN发送邮箱满了。
故障原因是:设计电路图的时候CAN总线的匹配电阻忘了加上。
https://blog.csdn.net/weixin_60619101/article/details/120266922?ops_request_misc=&request_id=&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2alles_rank~default-1-120266922.pc_search_es_clickV2&utm_term=CAN%E5%8F%91%E9%80%81%E5%A4%B1%E8%B4%A5%E7%9A%84%E5%8E%9F%E5%9B%A0%E6%9C%89%E5%93%AA%E4%BA%9B%E2%80%98&spm=1018.2226.3001.4187

2

  1. CAN_InitStruct.CAN_TTCM = DISABLE;
    这个只在某些CAN标准中使用,就设置为DISABLE。

2.CAN_InitStruct.CAN_ABOM = ENABLE;
这个位我们使能该功能,使用该功能可以在节点出错离线后适时的自动恢复,不需要软件干预。

3.CAN_InitStruct.CAN_AWUM = ENABLE;
这个位我们使能该功能,使用该功能可以在监测到总线活动后自动唤醒。

4.CAN_InitStruct.CAN_NART = DISABLE;
注意这个功能,这里DISABLE代表的是使用自动重传的功能,DISABLE是代表不使用自动重传的功能,我看了好多书籍上注释都写错了。

5.CAN_InitStruct.CAN_RFLM = DISABLE;
是否锁定FIFO,如果锁定,FIFO溢出会丢弃新数据;如果不锁定,FIFO溢出时,新数据会覆盖旧数据。

6.CAN_InitStruct.CAN_TXFP = DISABLE;
使能时会以存入发送邮箱的顺序进行发送,失能时,以报文ID的优先级发送。

这里遇到的问题是,发现在不使用自动重传的功能时,如果由于总线竞争导致发送失败,数据就丢掉了。所以在不是 一应一答 的环境中使用CAN的时候,建议开启自动重传功能

原文链接:https://blog.csdn.net/qq_37868856/article/details/110122390

3

我们先简单总结一下CAN的错误处理与故障界定:

1.CAN控制器记录发生在发送/接收过程中,总线数据出现错误的总数(位错误,CRC错误等)。

2.CAN控制器根据总线出错数量由低到高,依次处于主动错误状态,被动错误状态,以及总线关闭状态。

3.位于主动错误的节点,在检测到错误时,可以发送主动错误标志(6位显性位),告知总线上所有节点发生了总线的错误,之后进行正常的收发操作。保证如果总线CAN_H与CAN_L出现短路等会影响整个总线通讯的问题时,各个控制器会迅速反应。

   当随着发送/接收错误总数的增加,节点将位于被动错误状态,当检测到总线发生错误的时候,将等待总线出现被动错误帧(连续6位隐性位),之后才可正常进行收发操作。保证如果总线因为线长或者节点数增大,远处的节点干扰严重,则干扰严重的节点将不会影响其余节点的正常通信。

    如果发送错误总数达到了255,则进入bus-off状态,处于这种状态的节点将会与总线隔离,直到检测到128 次出现11 个连续“隐性”位后,才可以恢复错误主动状态,错误计数器 也清零。

原文链接:https://blog.csdn.net/geek_liyang/article/details/80404636

4

can接口相对是一种常用的串行接口,但是不像spi、i2c、uart等接口都有主从的关系,can可以任何一个节点主动发送数据,并且假如出现总线冲突会有硬件来处理。
can和rs485又有些类似,都是把ttl信号转换成了差分信号。所以在stm32 使用can的时候会有一个can收发器。

从电路上看起来也很简单,stm32也是通过can tx、rx两根线和收发器相连。所以假如我们要测试can的发送,是不是只接can tx脚就可以了?
在这里插入图片描述我最开始也以为这样就可以,但是深究can的总线冲突检测原理就会发现这样行不通的。因为can 在发送数据的时候也会同时接收发送的数据,通过把接收的数据和内部发送寄存器的数据做对比,是不是一致就知道总线有没有冲突。所以在正常情况(这里意味着非正常情况下也可以)下can rx不接就到这发送出去的数据无法收到从而硬件自动判断为发送失败。

所以要保证发送数据成功,can tx脚和can rx脚要都接上,并且确保can收发器供电正常。
https://blog.csdn.net/weixin_39986741/article/details/110206458?ops_request_misc=&request_id=&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2alles_rank~default-8-110206458.pc_search_es_clickV2&utm_term=CAN%E5%8F%91%E9%80%81%E5%A4%B1%E8%B4%A5%E7%9A%84%E5%8E%9F%E5%9B%A0%E6%9C%89%E5%93%AA%E4%BA%9B%E2%80%98&spm=1018.2226.3001.4187

5

STM32共有三个CAN发送邮箱,在检测到总线空闲时交发送,但需要注意的是,有可能会发送失败,有可能因为仲裁失败从而导致失败,也有可能是其它错误,原则上bxCAN将自动重发,但bxCAN也可以配置不自动重发。正因为如此,发送邮箱中有可能同时存在多个需要发送的报文,一旦出现这种情况,那么发送邮箱中的多个报文又将是谁先发送谁后发送呢?有两种模式:ID模式和FIFO模式。ID模式由报文的ID值决定,即ID值越小,优先级越高,另一种FIFO模式,顾名思义,即为消息队列方式,谁先到谁先发送,此种模式下三个邮箱与接收FIFO类似。

发送邮箱共有四种状态,空状态,挂号状态,预定发送状态(scheduled),发送状态。

发送报文的流程为:应用程序选择1个空发送邮箱;设置标识符,数据长度和待发送数据;然后对CAN_TIxR寄存器的TXRQ位置’1’,来请求发送。TXRQ位置’1’后,邮箱就不再是空邮箱;而一旦邮箱不再为空,软件对邮箱寄存器就不再有写的权限。TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的邮箱,参见发送优先级。一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。一旦邮箱中的报文被成功发送后,它马上变为空邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一次成功发送。
如果发送失败,由于仲裁引起的就对CAN_TSR寄存器的ALST位置’1’,由于发送错误引起的就对TERR位置’1’.
https://blog.csdn.net/langshi_2011/article/details/81605260?ops_request_misc=&request_id=&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2alles_rank~default-14-81605260.pc_search_es_clickV2&utm_term=CAN%E5%8F%91%E9%80%81%E5%A4%B1%E8%B4%A5%E7%9A%84%E5%8E%9F%E5%9B%A0%E6%9C%89%E5%93%AA%E4%BA%9B%E2%80%98&spm=1018.2226.3001.4187

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐