stm32 调试can总线丢帧的问题

stm32 调试can总线丢帧的问题

问题出现的背景

需要写一个新的电机的驱动,使用can通讯,驱动比较简单,很快就写好了。自己单独测试一个电机的时候没有问题,正反转测什么的都很正常。本以为事情会很顺利,但是在测两个电机的时候,却发现很严重的问题,经常左电机不装或者是右电机不转。

问题的解决步骤

方案一:
1. 遇到这种问题通常都是加上一个延时,觉得可能就是发的太快了,时许上可能有问题,但是我们的系统是一个实时的系统延时的时间不能太长。
2. 经过测试发现加延时可能较小出现这种问题的概率,但是不能解决这个问题,最终车子还是无法正常运行,没办法这个方案不行。

分析:
既然加延时不行的话,只能去找为什么电机不装。使用can转usb将数据抓出来之后,发现电机不转是由于,有帧丢失。每个电机发数据需要2帧数据,两个电机也就是4帧数据。但是只能抓到3帧数据。丢失了一帧数据。那么这个可能是由于can的发送邮箱不够,导致的丢帧

背景知识:
发送

  • 3 个发送邮箱
  • 发送 文的优先级特性可软件配置
  • 记录发送 SOF 时刻的时间戳

接收

  • 3 级深度的2个接收 FIFO
  • 14 个位宽可变的过滤器组 - 由整个 CAN 共享
  • 标识符列表
  • FIFO 溢出处理方式可配置
  • 记录接收 SOF 时刻的时间戳

这里写图片描述
发现这个寄存器每次回复的都是邮箱0,因此跟家判断不是邮箱不够的问题。每50ms发4帧数据是完全够用的。

方案三:
因为发送数据的id,比从机回复的id要大因此,发送时可能会因为,id较大,同时抢占can的时候会导致数据帧仲裁丢失。
因此开启can的自动重发功能。
使用hal库的话也就是一句话:

结果问题,完美解决

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年6月16日
下一篇 2018年6月16日

相关推荐