关于STM8CAN产生bus-off如何自动恢复

  • 硬件条件:STM8AF52A8、TJA1040T
  • 软件条件:IAR
    这里只是产生bus-off的一种情况:当CANH和CANL短接在一起的时候,STM8的can控制器就停止工作了,如何让CAN重新工作。

理论上:看STM8的参考手册,其中CAN主控制寄存器(CAN_MCR)的第六位ABOM可以决定CAN控制器自动退出离线状态,简单的说就是自动恢复。
按照上述手册所描述的,只要将ABOM置“1”就可以实现自动恢复。那么我们只需要简单的在CAN初始化的过程中将ABOM置“1”即可。那么就在CAN_Init(……);之后加CAN->MCR |= (uint8_t)CAN_MCR_ABOM;那么这样ABOM置“1”了。那么运行之后,CAN还是不能够恢复…….不知是不是哪里出错了还是设置不对,有经验的可以教教我。

以上的方法是没有实现自动恢复的。之后发现可以采用另外一种方法,就是当产生bus-off会触发STM8的中断函数,通过仿真发现其中CAN寄存器CAN_MSR的ERRI位会被置”1”,在通过查手册看了下CAN_MSR寄存器。写到置位以后会触发中断,那么当出现bus-off的时候可以通过中断服务函数来判断。那么接下来纠结的CAN错误中断服务函数是哪一个?在不下心的情况下发现了CAN发送中断后面的一个注释,大家可以看看。后面有一个ER,说明这个发送中断服务函数包括错误函数。意思就是当CAN发送报文和有错误触发的时候都会进入下面这个中断服务函数。

INTERRUPT void CAN_TX_IRQHandler(void); /* CAN TX/ER/SC */

接下来我们就要在中断服务函数中判断是否出现了BUS-OFF,从函数和手册中可以得知(就上面的截图就说到,BOFF置”1”,不再接收和发送报文),只要BOFF位被置“1”,说明进入了bus-off中断了。

CAN_IT_BOF        =((uint16_t)0x0400), /*!< Bus-off   interrupt   */
INTERRUPT_HANDLER(CAN_TX_IRQHandler, 9){/* In order to detect unexpected events during development,it is recommended to set a breakpoint on the following instruction.*/CAN_ClearITPendingBit(CAN_IT_TME);if(CAN_GetITStatus(CAN_IT_BOF) == SET){//这里加你的CAN初始函数,将CAN重新初始化CAN_Init(……);CAN_ClearITPendingBit(CAN_IT_BOF);}} 

按照上面的做法理论上是可以实现CAN恢复的,如果还是不行,那么就需要另外找办法了

在CAN出现BUS-OFF恢复后你可能会出现下面一个问题,在CAN恢复以后会有莫名几帧报文出现,这是因为STM8有一个自动重传模式,如果这不影响你的正常使用那是没有关系的,如果你想关闭这个自动重发的功能,你只需要将CAN_MCR寄存器的NART位置”1”就可以了,在CAN_Init();函数里面找以一个后面一点的位置加上下面这条语句。

CAN->MCR |= (uint8_t)CAN_MCR_NART;

应该就可以了。(这次寄存器就起作用了O(∩_∩)O哈哈~),下面就是手册里面介绍的。



上面说的很多都是契合STM32寄存器的内容,如果在使用STM32的CAN的过程中也可参考上述寄存器的配置。

关于STM8CAN产生bus-off如何自动恢复相关推荐

  1. 为什么文件会自动恢复成旧文件? -- windows server 2003

    cjq001 (威猛先生 noteu.net) 等 级: 结帖率:98.15% 楼主发表于:2009-01-04 08:53:15 我编辑了我公司服务器上的文件,服务器安装的是windows serv ...

  2. ES 自动恢复分片的时候不恢复了是磁盘超过了85%,然后不恢复了 ES可以配置多个数据目录...

    ES 自动恢复分片的时候不恢复了是磁盘超过了85%,然后不恢复了   ES可以配置多个数据目录 转载于:https://www.cnblogs.com/gaoyuechen/p/10156186.ht ...

  3. oracle自动还原,什么是oracle自动恢复操作

    这是由系统进行的恢复.无需人的管理和操作.一般当系统由于突然掉电而出现故障时用这种方法.当再次启动数据库就会进行自动恢复. 不像简单的DOS系统,oracle系统在运行时有许多事务要处理,并且存在许多 ...

  4. 如何下载Android源码(非常详细,含自动恢复下载,编译,运行模拟器说明)

    今天终于把代码下载完成,特此开一篇博文记录一下.上图: 为了下载这些源码,历时5天5夜,说为什么这么长时间,是因为太容易中断了,有时候下一晚上可能就一直没在下,在你入睡的时候它就自己断了,趁着这个周末 ...

  5. vendor自动恢复_push文件到system分区,重启后文件会被自动恢复

    push文件到system分区,重启后文件会被自动恢复 2020-02-4 阅读:2488 [DESCRIPTION] 客户反馈有些版本,push文件到system分区之后一旦重启,push的文件会被 ...

  6. netsh命令恢复网络_实例的状态检查和自动恢复

    关注微信公众号:AWS爱好者(iloveaws) Hello大家好,欢迎来到<AWS解决方案架构师认证 Professional(SAP)中文视频培训课程>,我们今天的课程讨论实例的状态检 ...

  7. Redis学习总结(23)——Redis如何实现故障自动恢复?浅析哨兵的工作原理

    前言 Redis是如何实现故障自动恢复的,它的实现正是要基于之前所讲的数据持久化和数据多副本而做的.Redis作为非常火热的内存数据库,其除了具有非常高的性能之外,还需要保证高可用,在故障发生时,尽可 ...

  8. nova 宿主机重启自动恢复虚拟机运行状态

    1. 宿主机重启自动恢复虚拟机运行状态 1.1 参数描述与默认值 # Whether to start guests that were running before the host reboote ...

  9. Excel设置自动恢复功能以及数据恢复教程

    Microsoft Office Excel拥有"自动恢复"功能,用于在数据丢失时自动恢复未保存的文档文件.自动恢复作为Office内置的功能,该功能允许您还原到最后一个自动保存的 ...

  10. Windows自动恢复报错:无法加载操作系统,原因是关键系统驱动程序丢失或包含错误

    Windows自动恢复报错:无法加载操作系统,原因是关键系统驱动程序丢失或包含错误 1. 问题 无法加载操作系统,原因是关键系统驱动程序丢失或包含错误 上午因为有点事就没有像往常一样打开电脑,下午回到 ...

最新文章

  1. ionic中使用Cordova Uglify 压缩js与css
  2. 如何修改word中的单位信息、用户信息及文档属性
  3. ASP.NET MVC 二维码生成(ThoughtWorks.QRCode)
  4. 【BZOJ2117】 [2010国家集训队]Crash的旅游计划
  5. 每天要问自己的十个问题
  6. 数据持久层框架 Hibernate
  7. addView的误区
  8. 音视频技术开发周刊 | 180
  9. 线程休眠 java 1615477264
  10. ASH的适用场景和常见用法(附2个经典案例)
  11. (4)ISE14.7 ChipScope使用流程(FPGA不积跬步101)
  12. java中为什么还要防止内存泄露_JAVA防止内存的泄漏什么意思,内存还能泄露?...
  13. linux 档案类型s,深入了解Linuxs归档和压缩命令 | MOS86
  14. jquery-weui的学习与使用
  15. 数据总线和地址总线区别是什么?作用分别是什么
  16. Matisse图片选择
  17. 关于知识分享和微软TechEd Roadshow
  18. Unity UGUI 字体加粗特效
  19. 榆树计算机课,吉林省榆树市弓棚镇武龙中学校七年级信息技术:第九课 Excel表格计算 教案+课件 (2份打包)...
  20. MySQL数据库基础-----多表查询

热门文章

  1. 学编程c语言高考能加分吗,编程已列入中高考,孩子升学加分的机会你抓住了么?...
  2. 涨知识:面试字节跳动Java研发岗,经验分享
  3. 母亲的牛奶 Mother's Milk(usaco)
  4. 独立显卡与集成显卡的区别
  5. php手机验证码开发,php网站、手机验证码开发(手机注册验证)
  6. java语言,MP4视频文件合并功能
  7. 用 FFMPEG 合并 MP4 视频
  8. 使用python爬取图片(爬取百度图片为例)
  9. 高盛报告:长远看中国网游前景不如门户
  10. 老九学堂 学习 C++