stm32 f4 can通信边发边收出现丢帧情况是不是由于总线仲裁导致的还是处理速度不够呀
测试了单独收发都正常的,但是边收边发总是会丢帧。中断只做了数据保存。使用波特率的是500k。stm32单独发总线占用率也才8%.测试了外部can分析仪10ms发送数据就会丢帧。这是什么原因呢 你这情况我第一反应就是接收 FIFO 满了没及时清,虽然你说中断里只保存数据,但再看看是不是有某些分支没处理到,把 FIFO 卡住了。 我以前在 F4 上踩过类似坑,边发边收时 CPU 被 CAN 中断打爆,结果偶尔有延后处理导致丢。建议你开下中断优先级,或者试试直接用 DMA 模式。 你检查下仲裁失败计数有没有增加?如果你发的数据优先级比较低,确实可能被总线抢占,不过一般不会严重到 10ms 一发就丢,感觉不像仲裁。 看波形了吗?我有一次是 PCB 上 CANH/CANL 差模不对称导致毛刺,一到高负载就掉帧。示波器抓一下很快能看出来问题。 你的 CAN 滤波器有没有开得太死?有时候并发收发时帧进来太快,过滤规则复杂的话会造成处理偏慢,我建议先开成全接收模式试试。 你用的 F4 哪个型号?有些老批次 CAN 外设有奇怪的小 bug,尤其在连续收发下会出现 TX Mailbox 被锁无法更新的情况。我当年靠软复位 CAN 才绕过去。 你可以试试把发送改为定时器刷 TX Mailbox,而不是在中断里塞,这样收发负载分离一点,有时候能减轻丢帧情况。 外部分析仪 10ms 一发都能触发丢,听着不像带宽问题,更像软件处理延迟太大了。试试把 log 打开,把每帧收到的时间戳抓一抓,可能能看出哪个环节慢。 会不会是中断嵌套等级没处理好?F4 上如果某个高优先级外设长时间占着 CPU,CAN 中断就容易滞后,最好把 CAN 的 IRQ 提高一点试试。 如果方便的话,把 CAN 的错误寄存器 ESR 值 dump 一下。丢帧是主动错误触发还是你程序没及时读出来,是两个完全不同的排查方向。 感谢大家的回复,问题我解决了,我一直认为是仲裁(没有对收发数据做同步处理)导致的问题,因为我有两路can,一路用做canopen收发,做了同步传输,所以没丢帧,另一路就遇到上述问题,解决方式就是在can init中使用了重传机制。不过没有具体分析什么原因导致的。但使用can分析仪测试1ms,10ms都没有丢帧。 关于你的问题,STM32F4 CAN 通信在边发边收时出现丢帧,通常是总线仲裁和处理速度两方面共同作用的结果,但具体原因需要结合实际场景分析
页:
[1]