OpenEdv-开源电子网

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

关于CAN总线的接收问题请教下大家

[复制链接]

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
发表于 2022-9-15 15:56:14 | 显示全部楼层 |阅读模式
本帖最后由 白纸扇001 于 2022-9-15 15:59 编辑

关于CAN总线有个问题想请教下大家
就是我现在用的是一个主机来控制3个从机。程序流程是主机发送一个广播消息,3个从机接收到消息后执行相关功能,执行完后 3个从机分别给主机发送一个消息证明已经执行完了,然后主机接收完这3个消息后再发一个广播消息,让3个从机继续执行,就这样一直循环。现在的问题是 我把接收消息的程序放到了定时器中断里,10ms读取一次,发现有时候从机就停止执行功能了,我用串口打印的方式查找错误发现是主机这边有时候会接收不到个别从机的数据,但是从机是发送正常的。所以应该是3个从机发送的数据冲突了,导致主机漏掉了数据。我目前的解决办法是让主机接收到哪个从机的数据后就给那个从机发送消息说不用发送了。现实情况是之前的从机偶尔停止情况改善很多,但是还是有,我实在没有办法了,想来求助下大家

这是主机

这是主机

这是主机

这是主机

这是主机

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

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-15 16:00:45 | 显示全部楼层
在主函数中来检测标志位,如果3个从机标志位全为真就发送一个广播消息
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-15 16:04:16 | 显示全部楼层
这是从机
5.jpg
回复 支持 反对

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1013
金钱
1013
注册时间
2014-4-7
在线时间
98 小时
发表于 2022-9-15 16:19:30 | 显示全部楼层
主机中断执行的太慢了  导致CAN的接收缓存溢出了吧   看下CAN的接收状态 是不是缓存溢出了
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复 支持 反对

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1013
金钱
1013
注册时间
2014-4-7
在线时间
98 小时
发表于 2022-9-15 16:21:27 | 显示全部楼层
为什么不用CAN的接收中断呢?
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-15 16:32:36 | 显示全部楼层
亲亻尔嘴 发表于 2022-9-15 16:19
主机中断执行的太慢了  导致CAN的接收缓存溢出了吧   看下CAN的接收状态 是不是缓存溢出了

这个是在哪里看呢?我技术一般般
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-15 16:34:41 | 显示全部楼层
亲亻尔嘴 发表于 2022-9-15 16:21
为什么不用CAN的接收中断呢?

确实考虑过用中断法,但是如果真的是从机发送数据冲突导致主机接收不完全,用中断可以避免吗?我先试试再说,感谢老哥了
回复 支持 反对

使用道具 举报

9

主题

218

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1394
金钱
1394
注册时间
2020-5-12
在线时间
387 小时
发表于 2022-9-15 16:53:58 | 显示全部楼层
如果三个从机同时向主机发送can数据,有很大概率会撞包导致can接收失败。要设计错开回复。
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-15 17:05:39 | 显示全部楼层
叶子君 发表于 2022-9-15 16:53
如果三个从机同时向主机发送can数据,有很大概率会撞包导致can接收失败。要设计错开回复。

老哥,能给个大概思路吗?
我用 让主机接收到哪个从机的数据后就给那个从机发送消息说不用发送了。现实情况是之前的从机偶尔停止情况改善很多,但是还是有。
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-15 19:26:02 | 显示全部楼层
顶!!!
回复 支持 反对

使用道具 举报

1

主题

89

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2020-6-12
在线时间
303 小时
发表于 2022-9-16 10:17:02 | 显示全部楼层
主机使用DMA保存10ms内接收到的所有数据。  在中断中遍历所有新收到的数据。  当然如果没有强制的同时性和性能要求, 可以修改CAN协议。 让三个从机挨个工作。  一次只发一个从机的指令。 然后收到回复后再控制下一个从机。
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-16 13:44:50 | 显示全部楼层
rektito 发表于 2022-9-16 10:17
主机使用DMA保存10ms内接收到的所有数据。  在中断中遍历所有新收到的数据。  当然如果没有强制的同时性和 ...

老哥,DMA好像搬运不了CAN的数据啊
回复 支持 反对

使用道具 举报

9

主题

218

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1394
金钱
1394
注册时间
2020-5-12
在线时间
387 小时
发表于 2022-9-16 14:22:31 | 显示全部楼层
白纸扇001 发表于 2022-9-15 17:05
老哥,能给个大概思路吗?
我用 让主机接收到哪个从机的数据后就给那个从机发送消息说不用发送了。现实 ...

1、从机设置不同地址,协议里含地址位,从机收到对应的地址数据包才执行并回复。
2、从机设置不同地址,主机广播一条数据出来后,从机根据地址设置不同的响应时间,比如地址1的从机在收到主机的数据后,延时10ms回复,地址2的从机就延时20ms回复。
回复 支持 反对

使用道具 举报

1

主题

89

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2020-6-12
在线时间
303 小时
发表于 2022-9-16 14:46:58 | 显示全部楼层
白纸扇001 发表于 2022-9-16 13:44
老哥,DMA好像搬运不了CAN的数据啊

不支持DMA的话。 用接收中断来缓存也可以。  如果嫌缓存很难设计 就给三个从机编码。  主机轮询去询问三个从机是否完成。  问到哪个从机  哪个才能回答。这样就不会冲突了。
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-17 10:42:26 | 显示全部楼层
叶子君 发表于 2022-9-16 14:22
1、从机设置不同地址,协议里含地址位,从机收到对应的地址数据包才执行并回复。
2、从机设置不同地址, ...

感谢老哥的指点了!我这个不能有大延时,我先用中断试试
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-17 10:43:02 | 显示全部楼层
rektito 发表于 2022-9-16 14:46
不支持DMA的话。 用接收中断来缓存也可以。  如果嫌缓存很难设计 就给三个从机编码。  主机轮询去询问三 ...

好的,我先试试,感谢老哥指点!
回复 支持 反对

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1013
金钱
1013
注册时间
2014-4-7
在线时间
98 小时
发表于 2022-9-19 13:15:14 | 显示全部楼层
白纸扇001 发表于 2022-9-15 16:32
这个是在哪里看呢?我技术一般般

手册上是这样说的  debug看下吧


在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复 支持 反对

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1013
金钱
1013
注册时间
2014-4-7
在线时间
98 小时
发表于 2022-9-19 13:16:54 | 显示全部楼层
亲亻尔嘴 发表于 2022-9-19 13:15
手册上是这样说的  debug看下吧

一旦 FIFO 处于 Pending_3 状态(即三个邮箱均已满),则下一次接收到有效消息时,将导
致上溢并丢失一条消息。硬件通过将 CAN_RFR 寄存器的 FOVR 位置 1 来指示上溢状况。
丢失的消息取决于 FIFO 的配置:

如果禁止 FIFO 锁定功能(CAN_MCR 寄存器的 RFLM 位清零),则新传入的消息将覆盖
FIFO 中存储的最后一条消息。在这种情况下,应用程序将始终能访问到最新的消息。

如果使能 FIFO 锁定功能(CAN_MCR 寄存器的 RFLM 位置 1),则将丢弃最新的消息,
软件将提供 FIFO 中最早的三条消息。
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复 支持 反对

使用道具 举报

32

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2013-1-16
在线时间
131 小时
发表于 2022-9-19 17:51:56 | 显示全部楼层
你应该用can的接受中断接受数据呀!can不存在主机从机这一说,都是节点,3个节点同时发数据,只有优先级高的可以发出来,优先级低的就会仲裁失败,仲裁失败的节点会重发么?
回复 支持 反对

使用道具 举报

25

主题

115

帖子

0

精华

高级会员

Rank: 4

积分
939
金钱
939
注册时间
2018-11-9
在线时间
146 小时
发表于 2022-9-20 08:39:03 | 显示全部楼层
接收中断呀,10ms太慢了,有可能两个从机先后返回数据离得很近
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-20 11:07:53 | 显示全部楼层
亲亻尔嘴 发表于 2022-9-19 13:16
一旦 FIFO 处于 Pending_3 状态(即三个邮箱均已满),则下一次接收到有效消息时,将导
致上溢并丢失一 ...

感谢老哥,我程序是采用的 禁止FIFO锁定功能。我改用锁定试试
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-20 11:09:42 | 显示全部楼层
1597685605 发表于 2022-9-19 17:51
你应该用can的接受中断接受数据呀!can不存在主机从机这一说,都是节点,3个节点同时发数据,只有优先级高 ...

感谢老哥的回复了,我现在采用的是中断接收,但是 一对一能正常接收,一旦一对三就接收失败了,不知道啥原因
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-20 11:10:06 | 显示全部楼层
dingning 发表于 2022-9-20 08:39
接收中断呀,10ms太慢了,有可能两个从机先后返回数据离得很近

感谢老哥的回复了,我现在采用的是中断接收,但是 一对一能正常接收,一旦一对三就接收失败了,不知道啥原因
回复 支持 反对

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1013
金钱
1013
注册时间
2014-4-7
在线时间
98 小时
发表于 2022-9-20 14:06:39 | 显示全部楼层
CAN的发送
NART:禁止自动重发送 (No automatic retransmission)
0:CAN 硬件将自动重发送消息,直到根据 CAN 标准消息发送成功。
1:无论发送结果如何(成功、错误或仲裁丢失),消息均只发送一次。

这一位初始化为0,,发送时出现仲裁丢失的情况时 会重新发送
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-20 14:32:31 | 显示全部楼层
亲亻尔嘴 发表于 2022-9-20 14:06
CAN的发送
NART:禁止自动重发送 (No automatic retransmission)
0:CAN 硬件将自动重发送消息,直到根据 ...

我已经设置为 自动重传 模式了,但是主机依旧会时不时接收不到个别从机的消息
回复 支持 反对

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1013
金钱
1013
注册时间
2014-4-7
在线时间
98 小时
发表于 2022-9-21 14:25:01 | 显示全部楼层
白纸扇001 发表于 2022-9-20 14:32
我已经设置为 自动重传 模式了,但是主机依旧会时不时接收不到个别从机的消息

3个从机回复时,分别设置3个不同的ID进行回复
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-21 18:03:45 | 显示全部楼层
亲亻尔嘴 发表于 2022-9-21 14:25
3个从机回复时,分别设置3个不同的ID进行回复

我一直都是3个不同ID的从机.
回复 支持 反对

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1013
金钱
1013
注册时间
2014-4-7
在线时间
98 小时
发表于 2022-9-21 19:56:44 | 显示全部楼层
白纸扇001 发表于 2022-9-21 18:03
我一直都是3个不同ID的从机.

那不应该的,逻辑分析仪抓主机的RX信号看下 具体是什么情况?
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2018-3-31
在线时间
34 小时
发表于 2022-9-21 21:16:04 | 显示全部楼层
加强一下理论学习,多看一下同行代码
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-23 10:53:26 | 显示全部楼层
亲亻尔嘴 发表于 2022-9-21 19:56
那不应该的,逻辑分析仪抓主机的RX信号看下 具体是什么情况?

好的,我先买个逻辑分析仪,感谢老哥的指点了
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-23 10:54:02 | 显示全部楼层
wurst 发表于 2022-9-21 21:16
加强一下理论学习,多看一下同行代码

唉,老哥说的是,我基础比较差,得加强学习了
回复 支持 反对

使用道具 举报

32

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2013-1-16
在线时间
131 小时
发表于 2022-9-26 23:02:45 | 显示全部楼层
白纸扇001 发表于 2022-9-20 11:09
感谢老哥的回复了,我现在采用的是中断接收,但是 一对一能正常接收,一旦一对三就接收失败了,不知道啥 ...

怎么失败,是从机没有发出来还是主机没有收到
回复 支持 反对

使用道具 举报

4

主题

97

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3690
金钱
3690
注册时间
2018-5-25
在线时间
852 小时
发表于 2022-9-29 14:25:02 | 显示全部楼层
这个用中断法接收肯定是可以的,你看看是不是从机没有设置出错重发。我这用中断接收带20个设备都没有丢包的
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-29 18:35:49 | 显示全部楼层
1597685605 发表于 2022-9-26 23:02
怎么失败,是从机没有发出来还是主机没有收到

根据串口打印的标志位来看,是从机没有返回
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-9-29 18:37:13 | 显示全部楼层
zdes33ss 发表于 2022-9-29 14:25
这个用中断法接收肯定是可以的,你看看是不是从机没有设置出错重发。我这用中断接收带20个设备都没有丢包的 ...

是那个禁止报文自动重传吗,我选择了自动重传
回复 支持 反对

使用道具 举报

32

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2013-1-16
在线时间
131 小时
发表于 2022-9-30 19:41:40 | 显示全部楼层
白纸扇001 发表于 2022-9-29 18:35
根据串口打印的标志位来看,是从机没有返回

那就是从机没有发出来,几个从机同时传,会有从机仲裁失败
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-10-1 09:49:26 | 显示全部楼层
1597685605 发表于 2022-9-30 19:41
那就是从机没有发出来,几个从机同时传,会有从机仲裁失败

但是我已经开了 自动重传,为啥还会发送失败呢
回复 支持 反对

使用道具 举报

32

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2013-1-16
在线时间
131 小时
发表于 2022-10-7 20:17:09 | 显示全部楼层
白纸扇001 发表于 2022-10-1 09:49
但是我已经开了 自动重传,为啥还会发送失败呢

抓一下从机的波形,看从机是否是在自动重传
回复 支持 反对

使用道具 举报

21

主题

218

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2217
金钱
2217
注册时间
2017-12-11
在线时间
476 小时
 楼主| 发表于 2022-10-8 17:05:02 | 显示全部楼层
1597685605 发表于 2022-10-7 20:17
抓一下从机的波形,看从机是否是在自动重传

感谢老哥的指点,我先用逻辑分析仪测测
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 01:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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