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进行处理,非常感谢!