OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6876|回复: 5

CAN单个节点可以通信,总线不能通信

[复制链接]

23

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2015-7-14
在线时间
76 小时
发表于 2021-6-2 18:04:13 | 显示全部楼层 |阅读模式
10金钱
一共3个设备,每个设备的CAN接口芯片都不一样,分别是TJA1050、VP230和周立功的CTM1051AM。
每个设备单独和PC通信(USB转CAN模块是周立功的USBCAN-I),都没有问题。
3个设备挂在同一个总线上之后,10秒左右TJA1050的设备无法发出数据,20秒左右CTM1051AM无法发出数据。3个设备发送的数据互相不处理,设备仅做从机向PC发送数据。
用JLINK调试是出现CAN 发送邮箱被装满。所有初始化和原子HAL库历程一致,仅hcan.Init.AutoRetransmission = DISABLE;
是什么原因呢?

最佳答案

查看完整内容[请看2#楼]

自己结贴。CAN总线出现一定数量的错误后,单片机CAN进入离线状态,不能收发。可以再初始化时使能ABOM功能或者自己手动将CAN错误清除并重新上线。 以下内容引自 https://www.stmcu.org.cn/社区 一个关于STM32 CAN出错恢复的话题 CAN协议所描述的出错管理,完全由硬件通过发送错误计数器(CAN_ESR寄存器里的TEC域),和接收错误计数器(CAN_ESR寄存器里的REC域)来实现,其值根据出错情况作增加或减少。关于TEC和REC管理的详细信息 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

23

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2015-7-14
在线时间
76 小时
 楼主| 发表于 2021-6-2 18:04:14 | 显示全部楼层
自己结贴。CAN总线出现一定数量的错误后,单片机CAN进入离线状态,不能收发。可以再初始化时使能ABOM功能或者自己手动将CAN错误清除并重新上线。

以下内容引自 https://www.stmcu.org.cn/社区 一个关于STM32 CAN出错恢复的话题

CAN协议所描述的出错管理,完全由硬件通过发送错误计数器(CAN_ESR寄存器里的TEC域),和接收错误计数器(CAN_ESR寄存器里的REC域)来实现,其值根据出错情况作增加或减少。关于TEC和REC管理的详细信息,需参考CAN标准。此外,CAN_ESR寄存器提供了当前错误状态的详细信息。通过设置CAN_IER寄存器(比如ERRIE位),当检测到出错时软件可以灵活地控制中断的产生。

关于离线恢复
当TEC大于255时,bxCAN就进入离线状态,同时CAN_ESR寄存器的BOFF位被置’1’。在离线状态下,bxCAN无法接收和发送报文。


根据CAN_MCR寄存器中ABOM位的设置,bxCAN可以自动或在软件的请求下,从离线状态恢复(变为错误主动状态)。在这两种情况下,bxCAN都必须等待一个CAN标准所描述的恢复过程(CAN RX引脚上检测到128次11个连续的隐性位)。

如果ABOM位为’1’,bxCAN进入离线状态后,就自动开启恢复过程。
如果ABOM位为’0’,必须通过软件请求bxCAN先进入初始化模式然后退出并进入正常模式,随后才能启动恢复过程。

注: 在初始化模式下,bxCAN不会监视CAN RX引脚的状态,这样就不能完成恢复过程。为了完成恢复过程,bxCAN必须工作在正常模式。
回复

使用道具 举报

4

主题

456

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1072
金钱
1072
注册时间
2021-4-26
在线时间
352 小时
发表于 2021-6-2 18:19:28 | 显示全部楼层
帮顶  
回复

使用道具 举报

23

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2015-7-14
在线时间
76 小时
 楼主| 发表于 2021-6-3 18:12:45 | 显示全部楼层
再补充一点,多个STM32+CAN出现总线故障的问题产生原因应该是在同一个总线上,只能允许一个“NORMAL”设备。其余的设备应该在“SLEEP”或者“INITIALIZATION”。
具体可以参考图192.
在初始化的时候,将AWUM功能使能,平时的时候将CAN设置成SLEEP状态,总线就可以正确工作了。

CAN工作模式.png
回复

使用道具 举报

23

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2015-7-14
在线时间
76 小时
 楼主| 发表于 2021-6-9 10:41:48 | 显示全部楼层
Azer 发表于 2021-6-3 18:12
再补充一点,多个STM32+CAN出现总线故障的问题产生原因应该是在同一个总线上,只能允许一个“NORMAL”设备 ...

我自己4楼的回复是错误的。没有总线只能存在一个“NORMAL”设备的限制。频繁出现总线错误的原因是CAN波特率设导致的。实际测试后得出的结论是:分频尽量小,BS1和BS2尽量大。该测试结果与网上查到的CAN波特率设置表以及其他指令存在不一致的地方,待后续进一步讨论。
回复

使用道具 举报

23

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2015-7-14
在线时间
76 小时
 楼主| 发表于 2021-7-2 14:01:18 | 显示全部楼层
再次更新,驳回自己4楼和5楼的观点。
CAN总线出现问题,一般情况下是总线的容抗阻抗不匹配,导致总线错误。之前产生的一切问题的根源是:
在电路设计时,本来为了保护CAN接口不被静电或误接击穿,在CANL和CANH上分别增加了一个自恢复保险丝。但自恢复保险丝有一个温度特性,常温电阻阻值与焊接时的温度有关。因此,由于手动焊接电路板,自恢复保险丝阻值差异较大,进而导致总线匹配电阻异常,造成总线错误。
将自恢复保险丝去掉,改用结电容小于10pF的TVS进行保护。总线的头、尾节点增加120Ω匹配电阻,中间节点增加3KΩ匹配电阻。(取值参考https://blog.csdn.net/ppdyhappy/ ... tionNum=5&fps=1
完成上述操作后,STM32 CAN可按任意波特率进行通信,且不产生总线错误。
STM32 CAN波特率可网上搜索 STM32_CANBaudRate 软件自动生成,并根据需求选择需要的波特率配置。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 07:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表