OpenEdv-开源电子网

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

STM32 CAN 在总线断开的时候怎么检测发送成功

[复制链接]

1

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2018-8-16
在线时间
70 小时
发表于 2018-11-20 09:32:44 | 显示全部楼层 |阅读模式
1金钱


    STM32 CAN 在总线断开的时候怎么检测发送成功,现在两个节点互发数据 我把数据线断开怎么还是发送成功呢?

                          if(CAN_GetFlagStatus(CAN1,CAN_FLAG_BOF)==SET)
                        LCD_ShowString(60+80,190,200,16,16,"Failed");                //提示发送失败
                        else LCD_ShowString(60+80,190,200,16,16,"OK    ");                         //提示发送成功       

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-11-21 02:32:46 | 显示全部楼层
回复

使用道具 举报

19

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2017-9-21
在线时间
171 小时
发表于 2018-11-21 11:03:00 | 显示全部楼层
配置上是否设置了重发,还是单次发送?
回复

使用道具 举报

1

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2018-8-16
在线时间
70 小时
 楼主| 发表于 2018-11-21 11:07:29 | 显示全部楼层
哆啦A萌 发表于 2018-11-21 11:03
配置上是否设置了重发,还是单次发送?

        CAN_InitStructure.CAN_TTCM=DISABLE;                        //非时间触发通信模式  
        CAN_InitStructure.CAN_ABOM=DISABLE;                        //软件自动离线管理         
        CAN_InitStructure.CAN_AWUM=DISABLE;                        //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
        CAN_InitStructure.CAN_NART=ENABLE;                        //禁止报文自动传送
        CAN_InitStructure.CAN_RFLM=DISABLE;                         //报文不锁定,新的覆盖旧的  
        CAN_InitStructure.CAN_TXFP=DISABLE;                        //优先级由报文标识符决定
回复

使用道具 举报

1

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2018-8-16
在线时间
70 小时
 楼主| 发表于 2018-11-21 16:39:15 | 显示全部楼层
没人知道吗?
回复

使用道具 举报

0

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2016-3-17
在线时间
95 小时
发表于 2018-11-21 21:13:20 | 显示全部楼层
本帖最后由 slsdz 于 2018-11-21 21:37 编辑

调试一下,看看寄存器的状态
发送错误计数器的值超过255时,此节才会处于离线状态。可以短接H L
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2015-4-3
在线时间
3 小时
发表于 2018-12-10 16:52:30 | 显示全部楼层
看他的函数里面貌似只要把数据丢出去就算发送成功,要看总线设备具体有没有通信成功估计要查ack。所以老哥你解决了吗
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-1-9
在线时间
6 小时
发表于 2018-12-17 10:11:42 | 显示全部楼层
本帖最后由 1010422901 于 2018-12-17 10:14 编辑

检测can邮箱发送状态,调用这个函数可以查看 ---CAN_TransmitStatus,楼主上面用的函数是用来查看有没有进入busoff的状态,同时楼主需明白,can总线需通信成功,必须同时存在两个节点,单独一个节点通信是不会成功,类型于发送节点can数据
需有接收节点ACK应答机制。
通过上面函数就可以知道如下四种状态
#define CAN_TxStatus_Failed         ((uint8_t)0x00)/*!< CAN transmission failed */
#define CAN_TxStatus_Ok             ((uint8_t)0x01) /*!< CAN transmission succeeded */
#define CAN_TxStatus_Pending        ((uint8_t)0x02) /*!< CAN transmission pending */
#define CAN_TxStatus_NoMailBox      ((uint8_t)0x04) /*!< CAN cell did not provide an empty mailbox */

就可以判断是否成功
回复

使用道具 举报

1

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2018-8-16
在线时间
70 小时
 楼主| 发表于 2019-1-7 15:40:07 | 显示全部楼层
1010422901 发表于 2018-12-17 10:11
检测can邮箱发送状态,调用这个函数可以查看 ---CAN_TransmitStatus,楼主上面用的函数是用来查看有没有进 ...

你的意思是 接受节点需要加条回应机制才可以?
回复

使用道具 举报

13

主题

272

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5390
金钱
5390
注册时间
2017-8-14
在线时间
249 小时
发表于 2019-1-7 23:05:48 | 显示全部楼层
本帖最后由 zml13917492379 于 2019-1-7 23:10 编辑

CAN 有点类似  以太网 的 UDP 协议,发送 后 不管的,要判断 是否 断线,是否数据发送成功,都要通过 CAN的 编程 来实现的,例如,A发送个数据个B,B收到数据 回个 应答 数据,CAN的 高层 协议CANWeb,就设置心跳 包,心跳包 收不到,就判断 掉线,建议直接 用CAN 高层协议,这个类似  以太网的  TCP 协议,
有空  看看 我们的 CANWeb 介绍:   
http://www.openedv.com/forum.php ... 09854&highlight=CAN

详细资料扣扣群204408503自行下载
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 01:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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