[STM32F0] STM32F0 HAL 库 CAN 通信问题

[复制链接]
73|16
唐纳德d 发表于 2026-7-11 11:09 | 显示全部楼层 |阅读模式
用 STM32F042K6T6 单片机通过 STM32Cube 生成了 IAR 工程。设备需要搭载 CAN 总线
我在死循环里每隔 100ms 发送一帧 CAN 报文。前三次发送都会阻塞等待传输完成标志超时:
while(!(__HAL_CAN_TRANSMIT_STATUS(hcan, transmitmailbox)))
三次之后所有发送邮箱全部被占用,调用HAL_CAN_Transmit直接返回HAL_CAN_STATE_ERROR。
我已经测试了所有 CAN 工作模式:正常模式、内部自回环模式等。CAN 收发芯片选用 SN65HVD233DR。
示波器观测 CAN_TX 引脚始终只有 3.2V 静态电平,没有任何波形输出。

七毛钱 发表于 2026-7-14 16:26 | 显示全部楼层
F0的CAN引脚不是默认的PA9/PA10,必须先使能重映射把功能移到PA11/PA12,否则CAN硬件根本没接出来
classroom 发表于 2026-7-14 16:57 | 显示全部楼层
正常模式下CAN发送需要总线另一端有节点响应,否则TX引脚不会有任何波形,因为外设检测到错误就会一直重发直到超时
cr315 发表于 2026-7-14 17:27 | 显示全部楼层
SN65HVD233的LBK引脚如果被拉高会使总线输出高阻态,此时芯片处于诊断回环模式,实测TX不会有波形输出
duo点 发表于 2026-7-14 17:58 | 显示全部楼层
收发器的RS引脚直接接地选择高速模式,接电阻控制斜率,接Vcc进入待机,这三种接法不对都会导致发送失败
elephant00 发表于 2026-7-14 16:28 | 显示全部楼层
邮箱前三次能发出去但等不到完成标志,说明CAN外设认为总线出了错,实际报文根本没上总线,邮箱就一直占着不放。
flycamelaaa 发表于 2026-7-14 18:28 | 显示全部楼层
可以先开回环模式自测:回环模式能看到TX波形才算硬件打通,如果连回环都没有那就是配置或引脚问题
jcky001 发表于 2026-7-14 18:59 | 显示全部楼层
示波器量CAN_TX只有3.2V静态电平说明MCU根本没启动CAN控制器发送,大概率是初始化流程或模式配置没走对。
onlycook 发表于 2026-7-14 19:29 | 显示全部楼层
社区有同样问题的案例,最后排查发现是滤波器没初始化,虽然发送看似不影响但实际CAN外设状态不对,导致发送也失败
powerantone 发表于 2026-7-14 20:10 | 显示全部楼层
F0系列CAN的时钟源来自APB1,如果波特率计算公式里的时钟频率不对,外设会无法正常产生位时序波形
probedog 发表于 2026-7-14 20:40 | 显示全部楼层
CubeMX默认CAN引脚配置如果没手工检查重映射选项,生成的代码里GPIO_AF可能指向了错误的功能编号。
solty 发表于 2026-7-14 21:10 | 显示全部楼层
检查SN65HVD233的VCC供电是否稳定在3.3V,低于3V收发器逻辑电平可能与STM32的3.3V输出不匹配。
spicy 发表于 2026-7-14 21:42 | 显示全部楼层
CAN_Normal模式下需要总线至少有两节点,单节点调试推荐先用回环模式验证,再插另一个节点测正常模式。
stormwind123 发表于 2026-7-14 22:14 | 显示全部楼层
建议在发送前读取CAN_ESR寄存器的错误状态位,看是仲裁丢失还是错误计数器溢出,比瞎猜有用得多。
七毛钱 发表于 2026-7-14 22:45 | 显示全部楼层
三个邮箱全部占满后返回ERROR,是因为之前的报文一直卡在“等待发送完成”,没有释放邮箱空间,不是内存问题。
今天会画卧蚕吗 发表于 2026-7-14 16:32 | 显示全部楼层
可以先写一个最简单的轮询发送工程,关闭所有中断,确认引脚有波形后再逐步加功能,分步排查比直接上完整逻辑高效。
598330983 发表于 2026-7-15 15:56 | 显示全部楼层
STM32F0 的 CAN 外设是bxCAN,仅支持标准 CAN2.0A/B,无 FD;HAL 库驱动坑集中在:时钟、滤波器、中断、收发配置、硬件电平、波特率、HAL 状态机。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

208

主题

209

帖子

0

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