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

CAN接受和发送失败的原因有哪些---之前调试MCP2515驱动时,数据一直发不出去,三个发送邮箱都被占满.至今未解决,读寄存器-总线错误相关推荐

  1. 为什么电子邮件发送失败?电子邮件发送失败的原因及解决方法

    为什么电子邮件发送失败?电子邮件发送失败的原因及解决方法 作者:佚名 字体:[增加 减小] 来源:互联网 时间:11-17 15:50:23 我要评论 为什么电子邮件发送失败?某网友在线咨询了小编,小 ...

  2. 短信营销时短信发送失败的原因有哪些?

    短信营销已经成为一种新型的营销方式,具有发送精准.到达率高.成本低等优点.短信平台有很多人用过,但是在实际操作中,很多人会遇到自己辛苦编辑的短信内容却发送不出去/失败的情况,这到底是什么原因呢? 1. ...

  3. 邮件发送失败服务器繁忙,★邮件发送失败的原因和解决方法

    以下是对发 Hi. This is the PowerMail SMTP Server 1.0 at 72mail.cn . I'm afraid I wasn't able to deliver y ...

  4. 短信接口发送失败常见原因,你掌握多少?

    近期,我们发布<短信验证码防攻击策略>.<企业如何保障短信数据安全?>,对广大企业用户信息服务过程中常见的一些问题进行科普,希望从专业的角度为企业客户提供技术及运营思路,尽量规 ...

  5. 网易邮箱发送失败的原因

    1.设置故障,再网易的web界面开启pop3.imap协议即可 一般出现再刚下载还未设置 2.免费信箱故障 解决方法:给自己发邮件,如果没有受到,则免费信箱有问题,去手机店处理即可 3.对方线路问题 ...

  6. 彩信发送失败原因是什么?如何解决?

    彩信发送失败的原因: 1.内容原因. ①不能有敏感词.如何说你要发送的彩信文字里面有敏感词,就会直接导致彩信发送失败.比如投资.利润等敏感词,在后台时会被直接屏蔽. ②格式不正确.格式错误也会导致彩信 ...

  7. 短信验证码总是发送失败是什么原因?

    有些用户在使用某产品时可能会出现短信验证码收不到的情况,同事之前也遇到过这样的情况,连续发送多次依然收不到短信.那么短信验证码为什么会发送失败.原因有哪些呢.#短信验证码安全 现在短信验证码服务在各种 ...

  8. rabbitmq消息队列,消息发送失败,消息持久化,消费者处理失败相关

    转:https://blog.csdn.net/u014373554/article/details/92686063 项目是使用springboot项目开发的,前是代码实现,后面有分析发送消息失败. ...

  9. BaoCms短信发送失败问题解答

    BAOCMS(又称生活宝系统)是一款本地生活电商O2O门户系统,程序是基于PHP+mysql开发,系统安全稳定,支持二次开发,目前BAOCMS已经成为国内使用最多.功能最强大.性能最稳定的本地电商生活 ...

最新文章

  1. Talk is cheap, show me the code - 用 github 数据辅助你完善简历
  2. C++迟后联编和虚函数表
  3. windows2003+PHP-5.3.8+IIS6.0的安装配置
  4. Spark读取配置源码剖析
  5. 正则表达式 学习笔记3.4
  6. Git 分支管理 Feature分支 强行删除分支
  7. php中用js自定义弹窗,用js实现的自定义的对话框的实现代码_javascript技巧
  8. (转)淘淘商城系列——导入商品数据到索引库
  9. 几乎零能耗零延迟!UCLA科学家发明光衍射神经网络,登上Science
  10. 「2012-12-29」3x3手机锁屏矩阵图像的组合数量
  11. warning C4251编译警告解决办法
  12. keras 深度神经网络模型的搭建
  13. 苹果Mac移动复制文件效率工具:Yoink
  14. android流式布局实现sku,[Kotlin协程] 回调地狱的一种解决思路
  15. 机器学习大作业_机器学习编程作业6-支持向量机(Python版)
  16. tcp 三次握手和四次断连深入分析:连接状态和socket API的关系----BAT 李运华
  17. Mutisim14.0安装后,汉化的详细方法
  18. alexa世界排名的登录及使用教材(转)
  19. 【大一上】C++小知识点
  20. 织梦dede文章列表调用标签的用法和规则

热门文章

  1. 前端涨薪必读,node.js入门保姆级教程
  2. abp学习日志九(总结)
  3. 【StringBuffer】
  4. linux终端常用指令
  5. 【Scratch-文字朗读模块】Scratch-文字朗读模块分析——人工智能的基础
  6. Alpine系统的基础操作
  7. java里dialect_java – Hibernate:没有设置方言.设置属性hibernate.dialect
  8. Qt实现最小化窗口到托盘图标
  9. CentOS 7 最小化系统安装图形化桌面
  10. 异常检测(Anomaly Detection)综述