[STM32F1] 通过 FD CAN 发送 3 个以上的 Tx 报头

[复制链接]
66|12
咚了个咚 发表于 2026-3-7 21:09 | 显示全部楼层 |阅读模式

在普通 CAN 2.0场景下,由于发送邮箱容量有限通常 3 个,要发送超过 3 个报文时,我会通过判断HAL_CAN_GetTxMailboxesFreeLevel(hcan) != 3来避免邮箱满的问题。
但在 FD CAN中,没有发送邮箱的概念,而是采用 FIFO或队列模式。请问在 FD CAN 中,如何不使用延时清空发送 FIFO?


故里说长安 发表于 2026-3-9 15:46 | 显示全部楼层
查询 FIFO 空闲状态,通过 HAL 库接口检查 FIFO 是否可写。
classroom 发表于 2026-3-9 17:47 | 显示全部楼层
优化中断触发条件,减少 CPU 占用。
公羊子丹 发表于 2026-3-10 08:37 | 显示全部楼层
我用STM32F1的FD CAN做过多报文发送,其实HAL库有专门查发送FIFO空闲的接口,你可以用HAL_FDCAN_GetTxFifoFreeLevel函数,判断返回值大于要发送的报文数再发,不用延时,亲测稳用。
周半梅 发表于 2026-3-10 08:38 | 显示全部楼层
想问下你配置FD CAN的发送FIFO深度了吗?F1的FD CAN能配置不同的FIFO深度,把深度调大一点能一次性存更多报文,再配合空闲查询,发超3个报头就更轻松了,你是设的多少?
帛灿灿 发表于 2026-3-10 08:39 | 显示全部楼层
这问题挺常见的,从CAN2.0切FD CAN最容易卡在发送逻辑上,我建议你把发送逻辑改成中断触发式,发完一个报文就触发中断,再在中断里发下一个,全程不用等,也不会占满FIFO。
童雨竹 发表于 2026-3-10 08:40 | 显示全部楼层
我怀疑你可能没开FD CAN的发送完成中断,开了这个中断后,FIFO里的报文一发完就会提醒CPU,你在中断回调里继续塞新报文就行,完全不用延时等FIFO清空,效率还高。
万图 发表于 2026-3-10 08:40 | 显示全部楼层
给你个小技巧,发多个报头前先调用HAL_FDCAN_GetTxBufferFreeLevel查下发送缓冲区状态,再结合FIFO空闲状态双重判断,就算高频发报文也不会出现FIFO满的情况,比单查一个准多了。
Wordsworth 发表于 2026-3-10 08:41 | 显示全部楼层
我之前做FD CAN多报文发送时,试过把要发的报文先存在自定义的软件队列里,再轮询检查FIFO空闲,有空位就从队列取报文发,不用管数量多少,也不会卡主程序,特别适合批量发。
Bblythe 发表于 2026-3-10 08:43 | 显示全部楼层
你有没有检查过FD CAN的初始化配置?尤其是发送模式是不是真的设成了FIFO模式,别不小心配成了邮箱模式,不然就算查FIFO状态也没用,我当初就栽过这个小跟头,调了半天才发现。
Pulitzer 发表于 2026-3-10 08:44 | 显示全部楼层
做FD CAN无延时发多报头,我建议别用轮询的方式一直查FIFO,隔个几微秒查一次就行,不然会一直占用CPU,影响其他程序运行,查完没空闲就先退出,下次再查,兼顾效率和实时性。
Uriah 发表于 2026-3-10 08:45 | 显示全部楼层
说真的FD CAN的FIFO模式比CAN2.0的邮箱模式灵活多了,你还可以配置FIFO的水线中断,当FIFO空闲到一定程度就触发中断,再在中断里补报文,不用CPU一直盯着,特别省资源。
Clyde011 发表于 2026-3-10 08:45 | 显示全部楼层
我猜你调试时可能会遇到FIFO看似空闲但发不了报文的情况,大概率是报文的ID、帧格式配置错了,FD CAN对这些参数要求更严,先检查报文配置再查FIFO状态,能少走很多弯路。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

188

主题

197

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0